What we scan
Starting from your homepage, the scanner reads your sitemap.xml (and robots.txt) and your homepage's own links, then selects up to 30 pages, prioritizing the pages residents actually use — agendas and minutes, services, permits, forms, payments, contact, employment, elections. Each page is fetched live and analyzed against automated checks mapped to WCAG 2.1 Level AA, the standard named in the DOJ's Title II web rule (28 CFR Part 35).
We also collect PDF documents linked from those pages and audit a sample of up to 10 PDFs at the byte level: whether the file has an accessibility tag structure (StructTreeRoot/MarkInfo), a declared document language, a title, whether it's encrypted, and whether it appears to be a scanned image needing OCR. The Title II rule covers documents, and document remediation is usually the largest hidden workload.
Stylesheet and inline-style color pairs are additionally analyzed for contrast against the 4.5:1 ratio (3:1 for large text) required by WCAG 1.4.3. We only flag combinations we can verify with certainty from your CSS — a conservative approach that produces few false positives but will not catch every contrast failure (colors composed through images, gradients, or JavaScript are excluded).
The checks
Engine v2.0 runs 25+ checks across four severity-weighted groups:
| Severity | Weight | Examples |
|---|---|---|
| Critical | 3 | Images without alt text · unlabeled form fields · links/buttons with no accessible name · undeclared page language |
| Serious | 2 | Low color contrast · video without captions · zoom disabled · data tables without headers · broken heading structure · timed refresh · interactive elements hidden from assistive tech · auto-playing media · untitled iframes · missing page titles |
| Moderate | 1 | Vague link text · forced tab order · missing main landmark · missing skip link · duplicate IDs · empty headings · redundant alt text |
| Documents | reported separately | Untagged PDFs · missing document language · scanned images without OCR · encrypted files |
The scoring formula
For each check we count occurrences across all scanned pages, cap any single check at 40 (so one broken template can't zero the score alone), and multiply by its severity weight. The weighted total divided by pages scanned gives an issue density d. The score is a diminishing-returns curve:
score = 100 / (1 + d ⁄ 16)
Grades: A ≥ 90 · B ≥ 75 · C ≥ 60 · D ≥ 45 · F below 45. Document results are reported alongside but do not change the page score — they're a separate workstream with separate remediation costs, and blending them would hide both.
The curve means early fixes move the number fast (exactly what a team needs to show a council) and a badly broken site can't hide behind averaging. The formula, weights, and check list are versioned; a report generated by Engine v2.0 will say so, and we don't change scoring silently.
What automated scanning cannot see — read this part
Industry measurements consistently find automated tools detect roughly a third of WCAG 2.1 AA failures. Our scan cannot judge: whether alt text is accurate, whether captions are correct, keyboard traps, focus visibility, reading order in complex layouts, cognitive load, contrast in images or over gradients, or most PDF reading-order problems. It also analyzes the HTML your server sends; content assembled entirely in the browser by JavaScript may be underrepresented — if your score looks surprisingly clean, that's a reason for human review, not celebration.
Responsible scanning
The scanner identifies itself honestly (AccessHawkBot/2.0 user agent), fetches at most 30 HTML pages, 3 stylesheets, and 10 PDFs per scan, only scans publicly reachable pages, and never attempts logins, form submissions, or anything destructive. Only public websites can be scanned — private addresses are refused.
Engine v2.0 · Methodology last updated July 22, 2026. Questions or a false positive to report: [email protected].