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.
Links & crawling
| 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 |
title-length |
warning | Title is shorter or longer than the configured range. Range from [seo] title_min/title_max (default 10-60). |
description-missing |
warning | Page has no meta description. |
description-length |
warning | Meta description is shorter or longer than the configured range. Range from [seo] description_min/description_max (default 50-160). |
duplicate-title |
warning | Several pages share the same title. |
duplicate-description |
warning | Several pages share the same meta description. |
canonical-missing |
info | Page has no canonical link. |
canonical-invalid |
warning | 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. |
og-incomplete |
info | Open Graph or Twitter card tags are missing. Requires og:title, og:description, og:image and twitter:card. |
h1-count |
warning | Page should have exactly one . |
noindex |
warning | Page is excluded from search engines by robots meta. |
sitemap-missing |
info | No sitemap.xml was found. |
sitemap-url-broken |
error | URL listed in the sitemap does not resolve. |
sitemap-missing-page |
warning | 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. |
hreflang-invalid |
warning | hreflang value is not a valid language tag. |
hreflang-broken |
error | hreflang alternate points to a missing page. |
hreflang-no-return |
warning | hreflang alternate does not link back. Page A lists B as an alternate but B does not list A. |
Accessibility
| Rule | Default | What it flags |
|---|---|---|
img-alt-missing |
error | Image has no alt attribute. |
link-name |
error | Link has no discernible text. Accessible name comes from text content, an image alt inside the link, aria-label, aria-labelledby or title. |
button-name |
error | Button has no accessible name. |
input-label |
error | Form control has no label. Wrapped in <label>, matched by label[for], or has aria-label/aria-labelledby/title. Hidden, submit, button, reset and image inputs are skipped. |
heading-skip |
warning | Heading level skips one or more levels. |
lang-missing |
error | has no lang attribute. |
duplicate-id |
error | The same id is used more than once on a page. |
contrast |
warning | 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). |
tabindex-positive |
warning | tabindex greater than 0 disrupts focus order. |
main-landmark |
warning | Page has no |
Performance
| Rule | Default | What it flags |
|---|---|---|
page-weight |
warning | Total page weight exceeds the budget. HTML + CSS + JS + images + fonts (including url() references from the page's stylesheets). Sizes come from disk or Content-Length. External resources are not counted. |
request-count |
warning | Number of requests exceeds the budget. The page itself plus every distinct asset URL, including external ones. |
asset-too-large |
warning | A single asset exceeds the size budget. |
image-oversized |
warning | Image is much larger than its declared display width. Natural width (read from PNG/GIF/JPEG headers) greater than oversize_factor times the width attribute or inline width: Npx. |
image-not-lazy |
info | Image far down the document lacks loading="lazy". The Nth image in document order (lazy_after, default 3) and later without loading="lazy". |
text-uncompressed |
info | Large text asset would shrink considerably with gzip. Text asset of at least gzip_min_kb 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. |
render-blocking-script |
warning | Script in blocks rendering (no defer/async). External classic script inside <head> without defer, async or type=module. |