← knowledge.oriz.in

Pa11y

service a11yaccessibilitypa11yciprimary

Pa11y

Role

Dynamic a11y test runner using the HTML_CodeSniffer (HTMLCS) ruleset — different from axe's catalog. Catches a slightly different set of WCAG violations; we run it alongside axe-core and Lighthouse CI as the three-tool a11y stack.

Free tier

Card / subscription required?

NO. OSS — installed via pnpm add -D pa11y-ci.

How CI consumes it

- name: a11y (Pa11y)
  run: |
    npx pa11y-ci --config .pa11yci.json
// .pa11yci.json
{
  "defaults": {
    "standard": "WCAG2AA",
    "runners": ["htmlcs", "axe"],
    "timeout": 30000
  },
  "urls": [
    "$PREVIEW_URL/",
    "$PREVIEW_URL/about",
    "$PREVIEW_URL/support"
  ]
}

Pa11y is configured to run both the HTMLCS and axe runners — so it catches violations from both rulesets in a single tool.

What it catches (vs axe alone)

Alternatives

Swap cost

Low — Pa11y's config is portable. Dropping it and configuring @axe-core/playwright with HTMLCS rules retains most coverage; the visual rules are the gap.

Why this is our pick

Different ruleset from axe-core means we catch issues neither would on its own. CLI-driven, runs in the existing PR pipeline, free. The three-tool stack (axe + Pa11y + Lighthouse CI) is locked in a11y-three-tools.md.

Cross-refs