---
title: "SEO checks for sitemaps, content, and structured data"
description: "Run 20 SEO page checks from one command. Inspect sitemaps, page markup, content, and structured data with optional JSON reports. Read the source."
canonical: "https://scalewithsearch.com/code/seo-checks"
date: "2026-10-06"
---
# SEO checks for sitemaps, content, and structured data.

Run 20 SEO page checks from one command. Inspect sitemaps, page markup, content, and structured data with optional JSON reports.

[Source repository](https://github.com/b2bvic/seo-checks)

## Team workflow

Choose a check from the component list, save its output, and compare each finding with the source. Start with local fixtures before fetching URLs. Review crawl limits before checking a website.

## Quick start

Use Python 3.11 or later and Git. The package installs Click, Requests, Beautiful Soup, lxml, and certifi.

```sh
git clone https://github.com/b2bvic/seo-checks.git
cd seo-checks
python3 -m venv .venv
.venv/bin/python -m pip install .
source .venv/bin/activate
seo-checks robots --help
```

You can list options without the optional link model. The default URL limits are 50 for sitemap and internal-links, and 100 for thin-product. Set `--limit` before checking a large site. For development, install the dev extra and run scripts/test_components.py. Review summary.json for skipped suites.

## How it works

Each check is a Python script with its own tests. The dispatcher passes arguments through unchanged and preserves standard input, output, exit status, and your current directory. Installed wheels include component scripts and prompts. For model-based anchor suggestions, install the optional link-suggest dependencies. Nonempty analysis downloads missing model weights.

## Components

Select a component to inspect its purpose, example, and limits:

- [sitemap-check](#sitemap-check)
- [robots-check](#robots-check)
- [redirect-trace](#redirect-trace)
- [heading-audit](#heading-audit)
- [alt-audit](#alt-audit)
- [og-check](#og-check)
- [readability](#readability)
- [word-freq](#word-freq)
- [internal-link-audit](#internal-link-audit)
- [thin-product](#thin-product)
- [link-suggest](#link-suggest)
- [citation-check](#citation-check)
- [gbp-audit](#gbp-audit)
- [product-schema](#product-schema)
- [course-schema](#course-schema)
- [schema-health](#schema-health)
- [hipaa-meta](#hipaa-meta)
- [menu-seo](#menu-seo)
- [spec-sheet](#spec-sheet)
- [saas-onboard](#saas-onboard)
- [sws-skills](#sws-skills)

Run the component examples from the repository root with the quick-start environment active. URL examples fetch public pages.

For link-suggest analysis from this checkout, run `python -m pip install ".[link-suggest]"` first. Model weights download when absent.

### sitemap-check

You parse XML URL sets and sitemap indexes with sitemap-check. You can fetch up to five child sitemaps and request optional HEAD checks. Inspect parser errors separately from URL failures before you change crawl inputs.

```sh
seo-checks sitemap https://example.com/sitemap.xml --check-urls --limit 5 --json-output
```

**Limits**

- The parser does not validate every sitemap protocol rule.
- Nested sitemap indexes are not followed recursively.

### robots-check

You collect user-agent blocks, allow rules, disallow rules, and sitemap directives with robots-check. Use malformed-line findings and whole-site blocking warnings to inspect the returned file. Decide whether each block matches your intended crawler configuration before editing it.

```sh
seo-checks robots https://example.com --json-output
```

**Limits**

- The parser does not implement complete crawler rule matching.
- A blocking rule can be intentional.

### redirect-trace

You trace HTTP redirects with HEAD requests that disable automatic redirect handling. redirect-trace resolves relative locations and stops after a repeated URL or twenty iterations. Use the hop report to identify loops and HTTPS downgrades before changing a route.

```sh
seo-checks redirects https://example.com/page --json-output
```

**Limits**

- Servers can handle HEAD and GET differently.
- The iteration cap can stop a chain before its final destination.

### heading-audit

You inspect H1 through H6 elements in document order with heading-audit. The report identifies missing or repeated H1 elements, skipped levels, empty headings, and an unexpected first heading. Use those findings to select page outlines for manual review.

```sh
seo-checks headings https://example.com/page --json-output
```

**Limits**

- The tool reads returned HTML without executing JavaScript.
- Results do not establish accessibility conformance.

### alt-audit

You classify missing, empty, generic, short, and long image alt values with alt-audit. You also check whether width and height attributes exist. Review each image and its purpose before replacing an empty value or accepting a suggested description.

```sh
seo-checks alt https://example.com/page --json-output
```

**Limits**

- Empty alt text can be appropriate for decorative images.
- The tool does not determine whether a description represents an image correctly.

### og-check

You extract Open Graph and Twitter Card fields with og-check. You compare them with the component field lists and inspect length warnings and non-HTTP image locations. Use the results to select sharing metadata for review before publishing a page.

```sh
seo-checks og https://example.com/page --json-output
```

**Limits**

- The tool does not render social platform previews.
- It does not verify that image URLs are reachable.

### readability

You estimate Flesch Reading Ease and Flesch-Kincaid grade scores with readability. You can extract text from returned HTML or read a local file. Use the sentence and syllable statistics to locate passages for editorial review.

```sh
seo-checks readability https://example.com/page --json-output
```

**Limits**

- Syllable counts are heuristic.
- Scores do not measure factual accuracy or writing quality.

### word-freq

You count terms, bigrams, and trigrams with word-freq. You can read a text file or extract text from HTML. The component removes stop words before counting, so inspect the filtered sequence when you assess repeated phrases.

```sh
seo-checks word-freq https://example.com/page --top 10 --json-output
```

**Limits**

- Phrase terms can span words removed from the original text.
- Token matching is limited to lowercase English letters.

### internal-link-audit

You count observed internal inbound links across a bounded sitemap sample with internal-link-audit. You receive a list of sampled pages without observed inbound links. Check the sample size and failed fetches before you treat a page as an orphan.

```sh
seo-checks internal-links https://example.com/sitemap.xml --limit 5 --json-output
```

**Limits**

- A sampled orphan is not proof of a site-wide orphan.
- Failed page fetches are skipped.

### thin-product

You fetch a bounded sitemap sample and count visible words and case-normalized unique words with thin-product. You receive pages below the configured unique-word threshold alongside fetch failures. Use the report to choose content for review, then inspect each page yourself.

```sh
seo-checks thin-product https://example.com/sitemap.xml --threshold 100 --limit 5 --json-output
```

**Limits**

- The default sample limit is 100 pages. The tool does not classify product pages.
- Review fetch failures separately from low-content findings.

### link-suggest

You generate candidate anchor phrases from token-classification spans with link-suggest. You can optionally compare the candidates with sitemap URL text. Inspect preprocessing with the portable tests before you install the model runtime and analyze nonempty text.

```sh
seo-checks link-suggest --url https://example.com/page --format json
```

**Limits**

- Analysis requires optional libraries and downloads model weights when absent.
- Suggestions do not prove relevance or establish a search-engine recommendation.

### citation-check

You generate directory search URLs from business and location terms with citation-check. The executable is directory-search-links. You receive links marked for manual review. Open the results yourself to compare listing details, since generation performs no directory lookup.

```sh
seo-checks citations --name "Example business" --city "Example City" --json-output
```

**Limits**

- The tool does not inspect directory listings or verify that they exist.
- Supplied contact details are not independently verified.

### gbp-audit

You check configured LocalBusiness field profiles and visible contact signals with gbp-audit. The executable is local-page-audit. You inspect public website markup and embedded-map signals. Compare any missing signal with the source page before changing business information.

```sh
seo-checks gbp https://example.com --json-output
```

**Limits**

- The tool does not connect to a Google Business Profile.
- A missing signal does not prove that business information is incorrect.

### product-schema

You find Product JSON-LD objects, including objects inside a graph, with product-schema. You inspect product, offer, rating, and review fields and receive a project-defined completeness score. Compare each value with the product before you accept the markup.

```sh
seo-checks schema-product https://example.com/product --json-output
```

**Limits**

- The score does not establish search-engine eligibility.
- Field presence does not verify that values represent the product correctly.

### course-schema

You inspect Course name and description fields and ItemList length, positions, and unique URLs with course-schema. You receive optional schema.org fields separately from the configured checklist. Use the findings to select course markup for review.

```sh
seo-checks schema-course https://example.com/course --json-output
```

**Limits**

- A passing checklist does not establish current search-engine eligibility.
- Linked course detail pages are not fetched by the list checker.

### schema-health

You inspect configured medical and healthcare JSON-LD types with schema-health. You apply baseline and additional field lists and map configured aliases to their profiles. Use the missing-field report to review markup alongside its source content.

```sh
seo-checks schema-health https://example.com/page --json-output
```

**Limits**

- Results do not establish search-engine eligibility.
- The tool does not validate medical content.

### hipaa-meta

You select metadata for human privacy review with hipaa-meta. You match configured identifier patterns in metadata, image alt text, URL query names, and review JSON-LD. Protect the returned findings because they can include sensitive source text.

```sh
seo-checks hipaa-meta https://example.com/page --json-output
```

**Limits**

- Pattern matches can produce false positives or miss identifiers.
- The tool makes no compliance or legal determination.
- Returned findings can contain sensitive source text.

### menu-seo

You inspect menu PDF links, menu images, selected ordering frames, visible prices, and Menu JSON-LD with menu-seo. You also match dietary label terms. Review the returned HTML findings before changing menu content or accepting a dietary statement.

```sh
seo-checks menu https://example.com/menu --json-output
```

**Limits**

- The tool does not read PDF or embedded frame contents.
- Matched labels do not verify ingredients or dietary safety.

### spec-sheet

You identify PDF links with specification-like text or paths with spec-sheet. You also inspect terms, units, tables, and selected Product JSON-LD properties in returned HTML. Use these signals to find technical content that needs source verification.

```sh
seo-checks spec-sheet https://example.com/product --json-output
```

**Limits**

- The tool does not read PDF contents.
- It does not verify equipment specifications or search eligibility.

### saas-onboard

You inspect noindex metadata on paths that resemble authentication pages with saas-onboard. You compare canonical paths and selected SoftwareApplication fields. Optional discovery follows linked authentication-page candidates. Review the matches before changing indexing directives.

```sh
seo-checks saas-onboard https://example.com/login --json-output
```

**Limits**

- The canonical comparison checks paths rather than full URL identity.
- Discovery can include external links, and returned HTML does not include JavaScript rendering.

### sws-skills

You read six Markdown prompts for freshness review, metadata editing, overlap analysis, video scripts, page conversion, and output review. sws-skills now lives in prompts/. List the prompt folders with the example below. Read each prompt before copying its folder into Claude Code. Supply the tools and source access each prompt requires.

```sh
ls prompts/skills
```

**Limits**

- The repository contains instructions rather than an automated SEO runtime.
- Skills require the tools and source access named in each prompt.
- Generated findings need human review.

## Limits

Treat scores and field profiles as project checklists. You do not establish search eligibility, accessibility conformance, privacy compliance, or factual accuracy through these checks. You review findings yourself.

## Model assistance

You can inspect model-assistance disclosures in the root and component READMEs. Review the code and tests to assess each tool.

## Related repositories

- [ops-scripts](/code/ops-scripts)
- [owned-record](/code/owned-record)

[Discuss a scoped build](/work).
