The accessibility watch: the law changed in 2025, your website did not
A weekly scan of your own site against the EU accessibility rules, on a box you already own, for EUR 0
- A sitemap.xml that actually lists the pages customers use, otherwise the scan covers whatever someone remembered to type in a list
- Any always-on machine with Node and the system libraries headless Chrome needs; a mini-VPS at EUR 4-6/month if you have none
- Someone who can change the site once findings arrive, whether that is you, an agency or a web person on retainer
- A decision, written down and dated, on whether the microenterprise exemption applies to your business
Version history
Since 28 June 2025 an accessible website is a legal requirement for a lot of European businesses, not a nice-to-have. This is the weekly check that tells you where you stand, runs on a box you already own, and costs EUR 0.
The architecture
the same flow as text
│ once a week, overnight, one cron line
▼
[ pa11y-ci — headless Chrome + the axe-core rule engine ]
├─ standard: WCAG2AA · runner: axe
├─ per-page threshold = last week's count (the ratchet)
└─ output: --json → reports/2026-09-03.json
▼
[ 30-line diff script ] this week vs last week, per page
▼
[ local model (Ollama) ] one plain sentence per violation: what, where, why it matters
▼
[ Telegram or email ] + [ reports/ folder = your dated evidence trail ]
The whole thing is one scheduled command and one small script. There is no server to expose, no login page, nothing on the public internet. The reports folder is the part that matters most and gets the least attention: a dated JSON file per week is the difference between "we take accessibility seriously" and a record that survives being asked to prove it.
The problem
The European Accessibility Act (Directive (EU) 2019/882) became applicable on 28 June 2025. It puts accessibility obligations on private companies for the first time, and e-commerce is explicitly one of the covered services. The reference standard is EN 301 549, which points at WCAG 2.1 level AA. Two things follow from that, and most owners know neither. First: if you employ fewer than 10 people and your turnover or balance sheet total stays under EUR 2 million, the service exemption applies to you — but it is not a grace period. Cross either threshold and the exemption is gone the same day. Second: nobody sends you a warning letter that says "your menu cannot be reached with a keyboard". You find out from a market-surveillance authority, a complaint, or a customer who cannot check out. And the moment you do get asked, the question is not "is your site perfect" — it is "show me what you checked, and when". Most small businesses have nothing to show. That is the gap this blueprint closes: a dated, repeatable record of what your own site does and does not pass, produced automatically, every week, without a subscription.
Tool choices — and why
sitemap.xml with pa11y-ci --sitemap https://yoursite.example/sitemap.xml and it loads every page in a headless Chrome, tests it, and exits non-zero when any page is over its allowance. Sitemap mode is the low-maintenance choice: a page you publish tomorrow is scanned next week without anybody editing a list. Its sibling pa11y (LGPL-3.0, 4,500 stars, last commit 28/08/2026) is the single-page version — useful while you are actually fixing something."runners": ["axe"] in your config and use it instead of pa11y's default engine. Two reasons: the findings are conservative, so what it reports is almost always real and fixable, and it is the same engine as the free axe DevTools browser extension — so anything the weekly scan flags, you or your web person can reproduce in a browser with one click. Deque's own measurement puts automated coverage at about 57% of WCAG issues; independent guidance is more conservative and usually says 30-40%. Take the low number as your planning assumption. Either way, half the work is not automatable, and any tool that tells you otherwise is selling something.Setup outline
- Check whether the exemption applies to you: fewer than 10 people and turnover or balance sheet total not above EUR 2 million, for services. Write the answer down with today's date. If you are close to either line, build this anyway — the exemption ends the day you cross it, with no transition.
- On any always-on box, install Node and
pa11y-ciglobally. On a Linux box you also need the system libraries headless Chrome wants; the project README lists them, and thebuildkite/puppeteerDocker image has them pre-installed if you would rather not. - Write a
.pa11yciconfig:"standard": "WCAG2AA","runners": ["axe"],"timeout": 30000,"concurrency": 1(one page at a time — see the pitfalls), andhideElementsfor third-party widgets you genuinely cannot fix. - Run it once by hand against your sitemap and write the JSON to a file. That first run is your baseline, not a failure. Expect a lot of findings and do not panic at the number — most sites produce the same handful of rules repeated across every page from one template.
- Set each page's threshold to its current count, so tomorrow's run passes. From then on the rule is simple: the number may go down, never up. That is the ratchet, and it is what stops a redesign quietly undoing six months of work.
- Add the cron line — weekly, overnight. Keep every JSON in a
reports/folder, named by date. Never delete them. - Add the diff script: compare this week's per-page counts to last week's and send the difference to Telegram or email. Silence when nothing changed is the point.
- Optional: pipe each new violation through a local model for the plain-language line, and fix the top three items each month rather than trying to clear the list.
- Publish an accessibility statement on your site: what standard you aim at, what you know is not yet compliant, and how someone can reach you about it. It costs an hour and it is the single most visible thing you can do.
Pitfalls — what goes wrong when you build this
Verified repos
pa11y-ci — LGPL-3.0, 629 stars, last commit 29/08/2026
pa11y — LGPL-3.0, 4,500 stars, last commit 28/08/2026
axe-core — MPL-2.0, 7,468 stars, last commit 01/09/2026
pa11y-dashboard — GPL-3.0, 1,089 stars, last commit 25/03/2026 (optional, needs MongoDB)
Ollama — MIT, 180k stars, active (optional, for the plain-language step)