64 checks across 8 families — 22 critical, 22 warning, 20 info. Each has its own page: what triggers it, why it is worth fixing, and the imperative fix the package hands to a person or an agent.
The list is generated from the package's own registry at build time, so it is the same set of checks the installed version runs — not a description of them.
The checks that compare what a page says against the data row that produced it. This is the part of the package that has no equivalent in a general site auditor, and the reason indexgap will not write page text for you: a generator that supplied the numbers could not then check them.
| Check | Level | What it reports |
|---|---|---|
unsupported-number | critical | the text contains numbers that are not in your data: |
check-by-eye | info | numbers that are not in your data — read these with your own eyes: |
source-note | warning | what the parser has to say aloud: the file was read as cp1251, the front matter was not recognised, a canonical cannot be parsed |
still-draft | critical | status: … — the page is marked unfinished |
brief-left | critical | a brief block or a TODO is left in the file — the page is unfinished |
unfilled-slot | critical | unfilled slot |
llm-leftover | warning | the model's reply was left instead of the page text: “…” |
mojibake | warning | text in the wrong encoding: “…” — saved in one encoding and read in another |
Whether a page can be found, crawled and kept in the index at all. Nothing further down this list matters on a page that fails here.
| Check | Level | What it reports |
|---|---|---|
noindex | critical | the page is closed to indexing — unless that is deliberate, there will be no traffic |
nosnippet | critical | snippets are forbidden: the page may sit in the index, but it will not appear in AI-search answers or rich results |
canonical-elsewhere | critical | a copy of …: the canonical points there, and that page is open in the build — as it should be if this is a variant (a print version, a second address) |
orphan | critical | no internal link points at this page |
unreachable | critical | the page cannot be reached from the home page by following links |
broken-link | warning | links to pages that are not in the build: … — ……. On the live site they are 404s unless the server redirects them |
deep | warning | … clicks from the home page — crawlers rarely get that far |
js-shell | critical | no text in the source HTML — JavaScript draws it, and AI-search crawlers do not execute JavaScript |
The failures that only appear when pages are compared with each other. A single generated page always looks fine; it is the set that gives the pipeline away.
| Check | Level | What it reports |
|---|---|---|
thin | warning | about … words of text — a thin page |
low-uniqueness | critical | only … of the text is unique — the rest is template |
template-skeleton | warning | the same … headings in the same order on … other pages |
same-opening | warning | … other pages open with the same words |
near-duplicate | critical | … identical to …… — the engine will keep one of them |
similar | info | … similar to …… |
long-paragraph | info | … paragraph(s) longer than … characters — a block like that is hard to quote whole |
The fields a search engine reads first and a person sees before deciding to click. On a generated site each of these is written once, in a template, and is therefore either right everywhere or wrong everywhere.
| Check | Level | What it reports |
|---|---|---|
no-title | critical | no title |
title-short | warning | title is … characters |
title-long | info | title is … characters — it will be cut off in the results |
duplicate-title | warning | … other pages share this title |
no-description | warning | no meta description |
description-length | info | description is … characters |
duplicate-description | info | … other pages share this description |
no-h1 | warning | no H1 — the engine has nothing to tell what the page is about |
many-h1 | info | … H1 headings on the page, one is needed |
no-headings | warning | the page has no headings |
no-structure | info | the text has neither lists nor tables — structural elements raise the chance of being used in an answer |
img-no-alt | info | … image(s) without alt text |
vague-anchor | info | uninformative anchors: |
hreflang is mutual, self-inclusive and per-page — three properties a template gets wrong in three different ways. These checks validate the cluster as a whole rather than the tag in isolation.
| Check | Level | What it reports |
|---|---|---|
translations-parked | critical | … language versions are closed with noindex and a canonical to the original — parked, not published |
hreflang-missing | warning | a page at the same path exists in another language (…), and this one declares no alternate at all. If it is a translation, link them with hreflang; if each market has its own text, there is nothing to link |
hreflang-no-self | critical | the cluster has no link to this page itself — without a self-reference Google treats the whole cluster as invalid |
hreflang-no-return | critical | this page links to …, and that page does not link back. A one-way link is not “partly counted” — the whole link is discarded |
hreflang-bad-code | warning | the “…” alternate has an empty href |
hreflang-unknown-target | info | the alternate … is not among the parsed pages — reciprocity cannot be verified |
hreflang-lang-mismatch | warning | the self-reference is declared as “…” while the page declares lang=“…” |
hreflang-canonical-conflict | critical | the canonical points at a different language version (…) — that cancels hreflang: the engine will collapse the versions instead of showing the right one |
hreflang-target-blocked | warning | the alternate … is closed to indexing, or its canonical points elsewhere — the cluster points at something that will not be in the index |
hreflang-static-cluster | critical | … pages out of … declare the same set of alternates (…) and not one of them references itself. The template prints the home page's cluster on every page — as far as a search engine is concerned there are no links between the versions at all. Fixed once, in the template. |
AI search retrieves passages and quotes them. These checks ask whether a page contains anything that survives being lifted out of it.
| Check | Level | What it reports |
|---|---|---|
no-question-headings | info | … of … subheadings are questions — the “question → answer” shape is quoted noticeably more often |
no-answer | warning | no paragraph found — there is nothing to quote |
answer-short | info | the first paragraph is shorter than … characters — not enough to stand as an answer |
answer-long | info | the first paragraph is … characters — to be quoted, an answer is better kept within … |
answer-preamble | warning | the first paragraph opens with a run-up, “……” — AI search quotes the answer, not the introduction |
jsonld-broken | warning | the JSON-LD block does not parse (…) — for a search engine it simply is not there |
jsonld-no-type | info | the JSON-LD block has no @type |
jsonld-faq-invisible | warning | … question(s) from FAQPage are missing from the visible text — markup that does not match the page risks a manual action |
no-author | info | no author or organisation is given — an E-E-A-T signal |
no-date | info | no machine-readable published or updated date |
ai-crawler-blocked | critical | OAI-SearchBot is closed: … (critical for the AI-search crawlers, info for training crawlers) |
Site-level findings: one file, one fix, reported once rather than per page.
| Check | Level | What it reports |
|---|---|---|
robots-blocks-all | critical | Disallow: / for every agent except … — other search engines and AI search cannot see the site |
robots-blocks-page | critical | robots.txt does not let the search engine into the page (rule “Disallow: …”) — it will not read the text; the links and the sitemap lead here for nothing |
robots-no-sitemap | info | robots.txt names no Sitemap — the line `Sitemap: https://…/sitemap.xml` costs nothing |
robots-unreadable | warning | robots.txt was not read: … |
no-robots | info | robots.txt was not found — not an error, but not a check either: pass its path with --robots to have it checked |
Pages whose usefulness has an expiry date, still open for indexing after it passed.
| Check | Level | What it reports |
|---|---|---|
stale-event | critical | the date … passed more than … days ago and the page is still open to indexing — the engine is showing people something that no longer exists. Close it with noindex, redirect to the current one, or rewrite it as a report on what happened |
stale-closed | info | the date … has passed and the page is already closed to indexing — that is correct |