PAUL GUERRERO software engineer
← projects

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