Checkers
Two WCAG engines — one in a real browser, one on your markup
Accessibility cannot be checked from source. Colour contrast depends on computed styles, focus order depends on the rendered tree, and an element hidden by CSS is a different thing from one absent from the markup - so this runs a real a real headless browser and evaluates the page as a browser built it.
A primary WCAG rule engine runs live and merges into the same scoring pipeline as everything else with no special casing. A second, independent engine runs alongside it, because different engines encode different WCAG techniques and one alone is not exhaustive - on a real site the second surfaced findings the first reported nothing about.
The second engine's findings are reported and never scored. Its rules overlap the first's heavily, and counting both would penalise the same missing label twice - the same double-counting that inflated scores once before and was fixed. Coverage without distortion is the right trade.
Why this matters
You can see the layout, you use a mouse, and you already know what every field wants. Take those away - the page read aloud, a keyboard with no mouse, text at 200% - and parts of it stop working: a button with no name, a field announced as blank, grey text nobody can read. Almost nobody who hits that writes in to say so. They leave, and it looks like an ordinary bounce.
A screen reader reads the label, not the placeholder - and the placeholder disappears the moment someone starts typing. A field with neither is announced as an edit box with no name, so the person filling it in is guessing. You find out from an order that arrives half empty, or a phone call asking what the third box was for.
Contrast is a measured ratio, not a matter of taste: WCAG asks for 4.5:1 on normal text, and light grey on white can fall well below that. Put user-scalable=no in the viewport tag and a phone will not let anyone enlarge it either. Nobody reports this - they abandon the checkout and you record a bounce.
Tab through your own site and watch where the focus ring goes. A closed menu marked aria-hidden that still holds focusable links will swallow it, a positive tabindex reorders the page unpredictably, and with no skip link every visit begins by tabbing through the entire navigation. Complaints about this arrive quoting the criterion number, which is later than you want to hear about it.
The scoring engine runs inside the browser after your scripts have finished, so it judges the page as built. The second engine reads the HTML your server actually sent, before any script ran. Markup that exists in only one of those two states still gets checked.
The scoring engine attaches to the page the renderer already opened rather than fetching the URL again. Two loads of a page with anything time-dependent on it are two different DOMs, so the second load can report findings about a page nothing else in your report ever saw. One load, one DOM, one set of facts.
The live engine's rules are not the whole module. A further hundred are maintained in this repository - a placeholder used as the only label, zoom disabled in the viewport tag, a details element with no summary - each citing the standard it comes from and the date that reference was last checked. 205 accessibility rules in total, 146 of them scored.
This check runs on its own here, and as part of the full audit alongside the other 985 rules. Either way the findings carry their evidence and their citation, and the report is never published or kept.
Automated testing catches roughly a third of WCAG failures, and the third it catches are the ones with mechanical fixes. Start there, then test by hand.
Give every image an alt attribute — descriptive when it carries meaning, empty (alt="") when it is decorative. Both are correct; a missing attribute is not.
Raise text contrast to at least 4.5:1 against its background, or 3:1 for text above 18.66px bold or 24px regular.
Associate every form input with a visible <label>. A placeholder is not a label and disappears the moment someone types.
Give every interactive element an accessible name, and make sure it is reachable and operable with a keyboard alone.
Set the lang attribute on <html> so screen readers choose the right pronunciation rules.
Just the domain is enough — example.com, with or without the https. No account, no card, no crawl of your whole site.
Your page opens in a real browser and JavaScript runs to completion, so what gets audited is the page a person actually sees — not the raw HTML your server sent. A screenshot comes back with the report as evidence of exactly what we measured.
Up to 986 checks run against that rendered page. Each finding names the rule, quotes the evidence found on your page, cites the public specification behind it, and says what to change. Nothing is a judgement call — run it twice on an unchanged page and the score is identical.
Named because provenance is the product. Every finding in your report says which of these produced it, so you can check the reasoning rather than take a score on faith.
This page answers these searches too — they are the same job, so they share one page rather than being split across near-identical ones:
No signup, no credit card. Quick answers in seconds; a full audit takes about a minute.
Run a free scanNo signup. No credit card. Nothing stored but the result.