All rules

43 built-in rules generated from the check registry.

Every rule accepts error, warn, info, off or [severity, options] in ranklint.config and can be suppressed per page with useRanklintIgnore().

RuleCategoryScopeDefault severityDescription
canonical:no-chainmetasitewarncanonical doesn't point to a page with a different canonical
canonical:requiredmetapageerrorrel=canonical exists
canonical:validmetapageerrorcanonical responds 200 (network)
headings:h1-lengthheadingspagewarnh1 length; { min, max }
headings:hierarchyheadingspagewarnno level skips (h2 → h4)
headings:no-emptyheadingspagewarnno empty headings
headings:single-h1headingspageerrorexactly one h1
headings:unique-h1headingssitewarnh1s are unique across pages
hreflang:symmetrici18nsiteerrorhreflang links are reciprocal
hreflang:valid-targetsi18npageerrorhreflang targets respond 200
http:no-mixed-contenthttppageerrorno http resources on an https page
http:no-soft-404httpsiteerror404s aren't masked as 200
http:ttfb-budgethttpsitewarnp75 TTFB per group; { p75, budgets }
http:x-robots-consistenthttppageerrorX-Robots-Tag doesn't contradict meta robots
i18n:no-locale-leaki18npageerrorcontent language matches URL locale and html lang; code blocks are ignored
images:alt-requiredimagespagewarncontent imgs have alt
images:dimensions-requiredimagespagewarnwidth/height against CLS
images:no-lazy-above-foldimagespagewarnno loading=lazy in the viewport; { firstImages }
indexability:ssr-contentindexabilitypageerrorcontent exists in SSR, not only after hydration; { minRatio }
jsonld:parseablestructured-datapageerrorJSON-LD parses
jsonld:valid-schemastructured-datapageerrorvalidity against Schema.org schemas; { schemas } — your own
links:no-brokenlinkspageerrorinternal links aren't 4xx/5xx (HEAD, cached per run)
links:no-orphanslinkssitewarnsitemap pages nobody links to
links:no-redirect-chainlinkspagewarnredirect chains; { maxHops }
links:no-utm-internallinkspagewarninternal links carry no UTM or click-id parameters
links:permanent-redirectslinkspagewarn302 where a 301 belongs
links:trailing-slash-consistentlinkssitewarntrailing-slash consistency
meta:description-lengthmetapagewarnmeta description length, 70–160 chars by default; { min, max }
meta:description-requiredmetapageerrormeta description exists
meta:no-duplicate-descriptionmetasiteerroridentical descriptions; mutual hreflang alternates are not counted as duplicates
meta:no-duplicate-titlemetasiteerroridentical titles across pages; mutual hreflang alternates are not counted as duplicates
meta:og-requiredmetapagewarnog:title, og:description, og:image — one issue per page listing the missing tags
meta:title-lengthmetapagewarntitle length, 30–60 chars by default; { min, max }
meta:title-requiredmetapageerror exists
meta:twitter-cardmetapagewarntwitter:card is valid
mobile:viewporthttppageerrorviewport meta exists
robots:env-policyrobotssiteerrorprod open / non-prod closed
robots:expected-disallowrobotssitewarnrobots.expect expectations hold
robots:reachablerobotssiteerrorrobots.txt responds 200
robots:sitemap-declaredrobotssitewarnSitemap directive declared
robots:zone-not-blockedrobotssiteerrorown zone isn't Disallow'ed
sitemap:no-noindexindexabilitysiteerrorno noindex pages in the sitemap
sitemap:reachableindexabilitysiteerrorevery sitemap URL responds < 400 (crawl result or HEAD probe, maxProbes: 100, 0 = unlimited); unverified leftovers are reported