Equall

Verifying page-level rules

Landmark, title and language rules can't be judged from a single component. Scan your built output (dist/) to verify them on the real, composed page.

Some accessibility rules are about the whole page, not any single element: landmarks (is content inside a <main>?), the document <title>, the page lang, a skip link. A component or partial can't answer them — that structure lives in the layout that composes it. So on a source scan of a component, Equall marks those criteria not verifiable on this scan instead of inventing a false violation — or a false pass.

This is not rendered/DOM scanning. It's the same static engine, pointed at your built HTML — the composed page as a real document.

The two-scan pattern

Run Equall twice, each scan honest about what it sees:

  1. Write-time, on your source — fast, zero-noise feedback while you code. Page-level rules stay out of the way (not verifiable on this scan).
  2. Post-build, on your dist/ — the built HTML is a real, composed document, so page-level rules execute and their criteria move from Not evaluated to Supports / Does not support in the Support Summary.
equall scan src/                    # 1. write-time — components / partials
astro build && equall scan dist/    # 2. post-build — the composed pages

Framework recipes

Astro

astro build && npx equall scan dist/

Next.js (static export)

// next.config.js
module.exports = { output: 'export' }
next build && npx equall scan out/

CI: build, then gate

# .github/workflows/a11y.yml
- run: npm run build
- run: npx equall scan dist/ --min-score 90   # exit 1 if the score drops below 90

--min-score is the only gate — a successful scan otherwise exits 0. It tracks a trend; it makes no compliance claim.

The payoff: a visible coverage uplift

The same page, scanned two ways:

# source scan (a component)
○ Not evaluated         document-title (2.4.2), html-has-lang (3.1.1)  — verify on the built output

# post-build scan (dist/index.html)
✓ Supports (automated)  document-title (2.4.2), html-has-lang (3.1.1)

The built scan verified what the component couldn't: those criteria are now honestly resolved instead of sitting in Not evaluated.

Honest caveats

  • Static, not rendered. Content injected by client-side JavaScript, hydration, or a SPA router is not in the built HTML, so Equall won't see it. For SPA/SSR you need a rendered check Equall deliberately does not perform.
  • Verify, not certify. A clean post-build scan does not make the site conformant. The per-criterion verdicts are an automated evidence layer — a full statement needs manual + assistive-technology testing. See the Verdict reference and Scoring.

On this page