a11y-crawler
- typescript
- playwright
- axe-core
- postgres
Auditing the accessibility of a large site has a catch: most of its pages are the same template, repeated. Checking them one by one means paying a hundred times for the same work.
a11y-crawler groups them before it looks. It computes a structural fingerprint of each page, clusters the ones that look alike, and audits only a representative of each group; the result propagates to the rest. A hundred pages become five or ten templates. By far the decision that saved the most time.
The hard analysis is deterministic: axe rules, keyboard and focus tests, pixel diffs to simulate color blindness. The language model comes in at the end, and only for what the rules can’t settle: discarding false positives, judging whether an alt text really describes the image. Last tier, not engine.
There’s one part that made me smile. To avoid repeating work between audits I built a tree of hashes: only what changed gets re-checked, just like git. Once it was working I found it was almost identical to a technique from a Princeton paper. Reading papers doesn’t just give you arguments — it gives you design.
How it’s built — TypeScript · Bun · Playwright · axe-core · PostgreSQL · SimHash clustering