Check catalog

Every issue has a rule code, a category and a default severity. Override severities (or switch a rule off) in the [severity] table of sitecheck.toml; see configuration.md. sitecheck rules prints the same list.

Rule Default What it flags
broken-link error Internal link points to a missing page or file. <a href> and <area href> to same-origin URLs that return 4xx/5xx or cannot be fetched.
broken-resource error Image, script, stylesheet or other asset is missing. Everything that is not a navigation link: images (including every srcset candidate), scripts, stylesheets, icons, media, iframes and url()/@import references inside CSS files. A broken CSS reference is reported on the CSS file.
broken-anchor error Link fragment does not match any id/name on the target page. Only checked when the target page was crawled. Matches id and <a name> exactly (case-sensitive, percent-decoded). # and #top are always valid.
case-mismatch error Path only resolves on case-insensitive filesystems. Filesystem mode only. The path resolves when compared case-insensitively but not exactly, so it works on macOS/Windows and 404s on Linux hosting.
redirect info Internal link goes through a redirect. One hop. Filesystem mode reports directory links without a trailing slash (/docs) like a real server would.
redirect-chain warning Internal link goes through more than one redirect. Two or more hops; the message lists every hop.
redirect-loop error Redirects never terminate.
mixed-content error Insecure http:// subresource on an https:// site. Only when the site origin is https (the target URL, --site-url, or the origin found in the sitemap). Scripts, stylesheets and iframes are errors; images and media are warnings. Plain <a href="http://..."> links are not mixed content.
orphan-page warning Page is not linked from any other page. A crawled page that no other page links to. The message says whether it was discovered through the sitemap or found on disk. 404.html is exempt.
robots-blocked info Linked page is disallowed by robots.txt and was not audited. HTTP mode only: a linked URL disallowed by robots.txt is not fetched.
external-broken error External link returns an error status. Needs --external. 4xx other than 401/403/429.
external-unreachable warning External link could not be verified (timeout, 403, 429, 5xx). Needs --external. Timeouts, DNS failures, 401/403/429 and 5xx: the link might be fine, but sitecheck could not confirm it.

SEO

Rule Default What it flags
title-missing error Page has no .</td> </tr> <tr> <td><code>title-length</code></td> <td>warning</td> <td>Title is shorter or longer than the configured range. Range from <code>[seo] title_min/title_max</code> (default 10-60).</td> </tr> <tr> <td><code>description-missing</code></td> <td>warning</td> <td>Page has no meta description.</td> </tr> <tr> <td><code>description-length</code></td> <td>warning</td> <td>Meta description is shorter or longer than the configured range. Range from <code>[seo] description_min/description_max</code> (default 50-160).</td> </tr> <tr> <td><code>duplicate-title</code></td> <td>warning</td> <td>Several pages share the same title.</td> </tr> <tr> <td><code>duplicate-description</code></td> <td>warning</td> <td>Several pages share the same meta description.</td> </tr> <tr> <td><code>canonical-missing</code></td> <td>info</td> <td>Page has no canonical link.</td> </tr> <tr> <td><code>canonical-invalid</code></td> <td>warning</td> <td>Canonical link is duplicated, relative, empty or points to a missing/redirecting URL. Not exactly one canonical, empty href, not an absolute URL, pointing at a missing page, or pointing at a redirect.</td> </tr> <tr> <td><code>og-incomplete</code></td> <td>info</td> <td>Open Graph or Twitter card tags are missing. Requires og:title, og:description, og:image and twitter:card.</td> </tr> <tr> <td><code>h1-count</code></td> <td>warning</td> <td>Page should have exactly one <h1>.</td> </tr> <tr> <td><code>noindex</code></td> <td>warning</td> <td>Page is excluded from search engines by robots meta.</td> </tr> <tr> <td><code>sitemap-missing</code></td> <td>info</td> <td>No sitemap.xml was found.</td> </tr> <tr> <td><code>sitemap-url-broken</code></td> <td>error</td> <td>URL listed in the sitemap does not resolve.</td> </tr> <tr> <td><code>sitemap-missing-page</code></td> <td>warning</td> <td>Indexable page is not listed in the sitemap. An indexable page (200, no noindex, not canonicalised elsewhere) that the sitemap does not list. Only checked when a sitemap exists.</td> </tr> <tr> <td><code>hreflang-invalid</code></td> <td>warning</td> <td>hreflang value is not a valid language tag.</td> </tr> <tr> <td><code>hreflang-broken</code></td> <td>error</td> <td>hreflang alternate points to a missing page.</td> </tr> <tr> <td><code>hreflang-no-return</code></td> <td>warning</td> <td>hreflang alternate does not link back. Page A lists B as an alternate but B does not list A.</td> </tr> </tbody> </table> <h2 id="accessibility">Accessibility</h2> <table> <thead> <tr> <th>Rule</th> <th>Default</th> <th>What it flags</th> </tr> </thead> <tbody> <tr> <td><code>img-alt-missing</code></td> <td>error</td> <td>Image has no alt attribute.</td> </tr> <tr> <td><code>link-name</code></td> <td>error</td> <td>Link has no discernible text. Accessible name comes from text content, an image alt inside the link, <code>aria-label</code>, <code>aria-labelledby</code> or <code>title</code>.</td> </tr> <tr> <td><code>button-name</code></td> <td>error</td> <td>Button has no accessible name.</td> </tr> <tr> <td><code>input-label</code></td> <td>error</td> <td>Form control has no label. Wrapped in <code><label></code>, matched by <code>label[for]</code>, or has aria-label/aria-labelledby/title. Hidden, submit, button, reset and image inputs are skipped.</td> </tr> <tr> <td><code>heading-skip</code></td> <td>warning</td> <td>Heading level skips one or more levels.</td> </tr> <tr> <td><code>lang-missing</code></td> <td>error</td> <td><html> has no lang attribute.</td> </tr> <tr> <td><code>duplicate-id</code></td> <td>error</td> <td>The same id is used more than once on a page.</td> </tr> <tr> <td><code>contrast</code></td> <td>warning</td> <td>Inline text/background colors fail WCAG AA contrast. Computed only when both the text and background colors can be determined from inline styles on the element or its ancestors (hex, rgb(), common names; alpha colors are skipped). 4.5:1 normally, 3:1 for large text (24px, or 18.66px bold).</td> </tr> <tr> <td><code>tabindex-positive</code></td> <td>warning</td> <td>tabindex greater than 0 disrupts focus order.</td> </tr> <tr> <td><code>main-landmark</code></td> <td>warning</td> <td>Page has no <main> landmark.</td> </tr> </tbody> </table> <h2 id="performance">Performance</h2> <table> <thead> <tr> <th>Rule</th> <th>Default</th> <th>What it flags</th> </tr> </thead> <tbody> <tr> <td><code>page-weight</code></td> <td>warning</td> <td>Total page weight exceeds the budget. HTML + CSS + JS + images + fonts (including <code>url()</code> references from the page's stylesheets). Sizes come from disk or Content-Length. External resources are not counted.</td> </tr> <tr> <td><code>request-count</code></td> <td>warning</td> <td>Number of requests exceeds the budget. The page itself plus every distinct asset URL, including external ones.</td> </tr> <tr> <td><code>asset-too-large</code></td> <td>warning</td> <td>A single asset exceeds the size budget.</td> </tr> <tr> <td><code>image-oversized</code></td> <td>warning</td> <td>Image is much larger than its declared display width. Natural width (read from PNG/GIF/JPEG headers) greater than <code>oversize_factor</code> times the <code>width</code> attribute or inline <code>width: Npx</code>.</td> </tr> <tr> <td><code>image-not-lazy</code></td> <td>info</td> <td>Image far down the document lacks loading="lazy". The Nth image in document order (<code>lazy_after</code>, default 3) and later without <code>loading="lazy"</code>.</td> </tr> <tr> <td><code>text-uncompressed</code></td> <td>info</td> <td>Large text asset would shrink considerably with gzip. Text asset of at least <code>gzip_min_kb</code> that would compress below 70% of its size with zlib level 6. In HTTP mode it is skipped when the response carries Content-Encoding; in filesystem mode it is a hint to enable compression on the server.</td> </tr> <tr> <td><code>render-blocking-script</code></td> <td>warning</td> <td>Script in <head> blocks rendering (no defer/async). External classic script inside <code><head></code> without <code>defer</code>, <code>async</code> or <code>type=module</code>.</td> </tr> </tbody> </table></article></div></body></html>