Case study
1 min de leituraWeb Accessibility Auditor
Auditor automatizado de WCAG por URL
O usuário cola uma URL e a ferramenta roda Puppeteer com axe-core num worker em background, agrupa as violações por severidade e devolve um relatório navegável. Monorepo com API em Express, worker, dashboard em Next.js, MongoDB e Redis em containers.
Auditoria assíncrona por URL
Decisões
Worker desacoplado da API via fila
BullMQ sobre Redis. A API publica um job; o worker processa em background. Throttling natural: para parar o sistema, basta parar o worker. Para escalar, sobe replicas.
Puppeteer com axe-core injetado
Headless Chromium navega, espera networkidle, injeta axe e roda contra wcag2a, wcag2aa, wcag21aa e best-practice. Resultado é tipado, agrupado por impact, persistido com URL e timestamp.
MongoDB como armazenamento dos relatórios
Documento por run. Schema flexível porque o output do axe evolui entre versões. Índice por (url, createdAt) para paginar histórico.
Monorepo com Docker Compose
API, worker, dashboard, Mongo e Redis em um docker-compose para reprodutibilidade local. CI roda os mesmos containers; produção é a mesma topologia atrás de Caddy.
“Acessibilidade automática só pega as violações triviais. Mas se as triviais já não são checadas, as não-triviais nunca serão.”
Tradeoffs
Resultado por URL, não por SPA flow
A ferramenta audita uma página de cada vez. Fluxos com etapas (login, checkout) precisam ser auditados manualmente. Aceitável para um MVP focado em landing pages e marketing sites.
Sem deduplicação inteligente entre runs
Relatórios consecutivos do mesmo site reaparecem por inteiro. Diff entre runs é o próximo passo: mostrar o que regrediu desde a última auditoria.
Estado atual
O auditor é deliberadamente um MVP focado. A ambição não é substituir a auditoria humana; é remover a desculpa de que "ninguém testou o axe".