Rule catalog

93 rules across 15 categories. Thirteen categories need nothing but the fetched HTML and response headers. Two, links and images, make extra requests. Accessibility and the Core Web Vitals half of performance need a rendered page.

Every rule id is category/name, and the category half is what only and skip accept.

import { allRules, selectRules } from "safi-studio-scanner";

console.log(allRules.length); // 93
const security = selectRules(allRules, ["security"]);

Core SEO

10 rules. The checks a search engine reads first.

RuleTitleSeverity
core-seo/title-presentTitle tag presenterror
core-seo/title-lengthTitle lengthwarning
core-seo/meta-description-presentMeta description presenterror
core-seo/meta-description-lengthMeta description lengthwarning
core-seo/single-h1Exactly one H1warning
core-seo/canonical-presentCanonical URL presentwarning
core-seo/charset-declaredCharset declaredwarning
core-seo/viewport-presentViewport meta presentwarning
core-seo/robots-meta-indexablePage is indexableerror
core-seo/open-graph-basicsOpen Graph basicsinfo

Performance

12 rules. The first six read the response. The last six need a rendered page and are skipped without one.

RuleTitleSeverity
performance/render-blocking-scriptsRender-blocking scriptswarning
performance/stylesheet-countStylesheet countinfo
performance/inline-script-sizeInline script sizeinfo
performance/text-compressionText compressionwarning
performance/cache-controlCache headersinfo
performance/html-weightHTML document sizeinfo
performance/lcpLargest Contentful Painterror
performance/clsCumulative Layout Shiftwarning
performance/ttfbTime to First Bytewarning
performance/dom-sizeDOM sizeinfo
performance/page-weightPage weightwarning
performance/request-countRequest countinfo

Security

12 rules, all read from response headers.

RuleTitleSeverity
security/httpsServed over HTTPSerror
security/mixed-contentMixed contenterror
security/hstsHSTS headerwarning
security/cspContent-Security-Policywarning
security/x-frame-optionsClickjacking protectionwarning
security/x-content-type-optionsX-Content-Type-Optionswarning
security/cookie-secureSecure cookieswarning
security/referrer-policyReferrer-Policyinfo
security/permissions-policyPermissions-Policyinfo
security/coopCross-Origin-Opener-Policyinfo
security/server-disclosureServer header disclosureinfo
security/x-powered-byX-Powered-By disclosureinfo

Structured data

11 rules covering JSON-LD parsing, types, and the two schemas that matter most.

RuleTitleSeverity
structured-data/jsonld-presentJSON-LD presentinfo
structured-data/jsonld-validJSON-LD parseswarning
structured-data/jsonld-typeJSON-LD has @typeinfo
structured-data/context-declaredJSON-LD @contextinfo
structured-data/duplicate-jsonldDuplicate JSON-LD typesinfo
structured-data/org-or-websiteOrganization or WebSite schemawarning
structured-data/org-logoOrganization logoinfo
structured-data/org-sameasOrganization sameAs linksinfo
structured-data/article-requiredArticle required fieldswarning
structured-data/article-imageArticle schema has imageinfo
structured-data/breadcrumb-validBreadcrumb schemainfo

URL structure

8 rules, applied to every crawled URL.

RuleTitleSeverity
url-structure/lowercaseLowercase URLwarning
url-structure/hyphensHyphens not underscoreswarning
url-structure/no-spacesNo spaces in URLwarning
url-structure/asciiASCII or encoded charactersinfo
url-structure/param-countFew query parametersinfo
url-structure/readableReadable, word-based pathinfo
url-structure/lengthURL lengthinfo
url-structure/depthShallow path depthinfo

Content

6 rules on the page text and its heading structure.

RuleTitleSeverity
content/heading-hierarchyHeading hierarchywarning
content/no-empty-headingsNo empty headingswarning
content/html-langHTML lang attributewarning
content/word-countWord countinfo
content/keyword-stuffingKeyword stuffinginfo
content/text-html-ratioText to HTML ratioinfo

Crawlability

6 rules. robots.txt and the sitemap are fetched once per site and shared.

RuleTitleSeverity
crawlability/page-indexablePage indexableerror
crawlability/robots-existsrobots.txt existswarning
crawlability/sitemap-presentSitemap presentwarning
crawlability/canonical-validCanonical validwarning
crawlability/robots-validrobots.txt validinfo
crawlability/x-robots-tagX-Robots-Tag headerinfo

Images

6 rules, read from every <img> on the page.

RuleTitleSeverity
images/img-altImage alt texterror
images/img-dimensionsImage dimensionswarning
images/img-empty-srcImage src presentwarning
images/img-modern-formatModern image formatsinfo
images/img-lazy-loadingLazy loadinginfo
images/img-filename-qualityImage filenamesinfo

5 rules. This category makes extra requests: every unique link is checked once and the result is cached for the whole run.

RuleTitleSeverity
links/broken-internalBroken internal linkserror
links/broken-externalBroken external linkswarning
links/redirect-chainsRedirect chainswarning
links/weak-anchor-textWeak anchor textinfo
links/external-relExternal link relinfo

Social media

4 rules on the sharing metadata.

RuleTitleSeverity
social-media/og-image-absoluteOpen Graph image is absolutewarning
social-media/twitter-cardTwitter Cardinfo
social-media/og-url-canonicalog:url matches canonicalinfo
social-media/profile-linksSocial profile linksinfo

4 rules looking for the pages a compliant site is expected to carry.

RuleTitleSeverity
legal/privacy-policyPrivacy policy linkwarning
legal/termsTerms of service linkinfo
legal/cookie-consentCookie consentinfo
legal/contactContact informationinfo

E-E-A-T

4 rules on experience, expertise, authority, and trust signals.

RuleTitleSeverity
eeat/authorAuthor attributioninfo
eeat/datePublished or updated dateinfo
eeat/outbound-citationsOutbound citationsinfo
eeat/about-pageAbout pageinfo

Analytics

2 rules.

RuleTitleSeverity
analytics/tag-presentAnalytics installedinfo
analytics/consent-modeConsent modeinfo

Internationalization

2 rules on hreflang.

RuleTitleSeverity
internationalization/hreflang-presenthreflang annotationsinfo
internationalization/hreflang-validhreflang values validwarning

Accessibility

1 rule that emits many findings. The full axe-core WCAG pass runs against the rendered page and each violation becomes its own finding, carrying its own axe rule id, impact, and help URL.

RuleTitleSeverity
accessibility/axeAccessibility (axe-core)warning

Without browser: true or a psiKey, this rule is skipped rather than failed.