← All Sparks

Sparks, Accessibility

An accessibility statement generator that won't lie for you

Most statement generators let you claim conformance nobody tested. I open sourced one that only writes what a real audit found.

By Mike Binder3 min read

A form-based statement versus one built from a real auditLeft, a typical statement generator: a form with a company name field and a dropdown set to WCAG 2.1 AA, producing a page that says the site conforms, though nothing was measured. Right, this tool's output from a clean axe-core run: 55 WCAG 2.2 A and AA success criteria shown as squares. 7 are marked Supports because a test measured them. 48 are Not Evaluated because no automated rule covers them.A typical generatorA form. Nothing gets tested.Company nameAcme IncStandardWCAG 2.1 AAGenerate statementThis site conforms toWCAG 2.1 AA.NEVER MEASUREDBuilt from the auditA clean axe-core run, all 55 WCAG 2.2 A and AA criteria7SupportsA test measured it48Not EvaluatedNo automated rule covers itUntested stays untested. AAA is never claimed.No measurements, no statement.

An accessibility statement is a legal claim. Most of them read like a mission statement.

Earlier this year I read the accessibility statements of five of the biggest companies in the US. Most of them said the same things. “We strive to.” An old version of WCAG. No date for when the site was last tested. No way to tell what anyone actually checked.

Then I looked at the tools people use to make these pages. Most of them are a form. You pick “WCAG 2.1 AA” from a dropdown, type in your company name, and get a page that says your site conforms. Nobody tested anything.

I wanted the opposite: a statement that can only say what a real test found.

What it does

You give it the results of a real audit. It gives you an accessibility statement with a table covering every WCAG 2.2 A and AA rule. Every row in that table goes back to something that was actually tested.

It is free and open source: InnerSpark/accessibility-statement. No dependencies. Runs on Node 18 or newer.

node render.mjs axe.json --from-axe --org "Acme Inc" > accessibility.html

You can’t talk it into lying

The rules live in the code, with tests, so nobody can skip them.

  • If it wasn’t tested, it says so. Anything without a result is marked “Not Evaluated.” It never assumes a pass.
  • No AAA claims. If your data says you meet a AAA rule, it changes that to “Not Evaluated” and adds a note. Passing a scanner isn’t enough to claim AAA.
  • No results, no statement. If nothing was tested, it stops with an error. You don’t get a confident page with nothing behind it.
  • A failure never gets lost. Even if your data spells “Does not support” a little differently, it still counts.
  • It’s upfront about its limits. The page says plainly that automated testing can’t check every rule, and lists what was in scope.

The number that surprises people

Run it on a clean axe-core result, zero issues found, and you get 7 Supports and 48 Not Evaluated out of 55 rules.

That is what a passing scan really proves. axe is great at what it checks. It just doesn’t check most of the standard. Seeing that in your own statement is the point, and the tests make sure it stays that way. If a change ever turned that table mostly green, the tool would be lying.

Two more calls I made on purpose:

  • “Nothing to test” doesn’t count as a pass. A page with no video doesn’t get credit for captions just because there’s no video.
  • It never writes “Partially Supports.” That is a judgment call about how bad a problem is. A scanner can’t make it, so the tool won’t pretend to.

Make it yours

It drops into any site. Output just the markup for your own template, or keep the full page and change a few CSS variables to match your brand.

It also reads the same format AccessSpark publishes for its own site. The screenshot in the README is a real statement from real data.

Why I gave it away

Better statements help the people who rely on them: someone checking if a site works with their screen reader, or a buyer reading a VPAT.

If your statement says you conform, you should be able to show the test that proves it.

Keep reading

Work with meAccessibility and design systems consulting