Website Accessibility Checker
The accessibility problems that can be found in HTML alone: missing alt, unlabelled controls, nameless buttons, heading jumps, duplicate ids, disabled zoom.
This tool needs JavaScript: the server makes the request, because a browser cannot read another site headers.
One page, read as delivered. Colour contrast and focus order need a browser and are listed as out of scope rather than guessed at.
This is one of the few tools here that asks the server rather than your browser, because a browser cannot do it. Nothing you put in is stored; the request is rate limited by address and the answer is not cached.
Automated accessibility checking finds roughly a third of the barriers on a page. This does that third honestly and then tells you what it could not look at, which is the part most scanners replace with a score and a green tick.
The third it finds is the mechanical one: an image with no alt attribute, a form control with no label, a button that announces itself as “button”, a heading level that jumps, a duplicate id, zoom disabled in the viewport. All of those are real, all of them are cheap to fix, and none of them are the hard part.
How to use
Put in a page. The HTML is read as delivered, which is what assistive technology receives before any JavaScript has run.
Example
Page https://example.com/
Checked 659 elements of HTML, as delivered
Found 3 thing(s) to fix
4 form control(s) with no label
why it matters placeholder text is not a label: it disappears as soon as
somebody types
1 duplicate id(s)
why it matters labels, aria-labelledby and anchors all resolve to the first
one, so the rest silently point at the wrong thing
Zoom is disabled in the viewport
why it matters user-scalable=no stops people enlarging the text, which is
the single commonest accommodation there is
Already right
Language declared en-GB
Every image has an alt attribute 18 images
Exactly one h1
Main landmark present
Pitfalls
A clean report is not an accessible page. It means the mechanical checks passed. The page can still be impossible to use with a keyboard, illegible at low contrast, or incomprehensible in a screen reader’s reading order.
Placeholder text is not a label. It disappears when somebody types, it is often too low contrast to
read, and several screen readers ignore it. A <label> is the answer; aria-label is the fallback.
alt="" is correct for decoration. An empty alt tells assistive technology to skip the image. The
check here flags a missing attribute, which is different, and flags alt text that looks like a file name,
which is worse than nothing.
Positive tabindex almost always makes things worse. It pulls elements to the front of the tab order
regardless of where they appear, which is how a keyboard user ends up in the footer after the logo. Use
0 or nothing.
Duplicate ids break the things that reference them. A label points at the first match, so the second control ends up unlabelled while looking fine in the markup.
Disabling zoom is the commonest accessibility failure on mobile. user-scalable=no or
maximum-scale=1 in the viewport meta removes the one accommodation almost everybody uses at some
point.
An overlay widget does not fix any of this. The “accessibility toolbar” products that promise compliance in one line of JavaScript are widely rejected by the people they claim to help, and have been the subject of lawsuits rather than a defence against them.
Automated checks cannot judge quality. Alt text exists or it does not; whether it describes the picture is a human question, and the same goes for link text, heading wording and error messages.
Compatibility
One request, the HTML read as delivered. This is one of the few tools here that runs on the server, because a browser cannot read another origin’s markup.
What is checked: the lang attribute, the page title, images without an alt attribute, alt text that
looks like a file name or runs past 150 characters, form controls with no label of any kind including a
wrapping one, links and buttons with no accessible name, the number of h1s, heading level jumps, the
presence of a main landmark, duplicate ids, positive tabindex, iframes with no title, autoplaying
media, and a viewport that disables zoom.
What is not checked, and is listed as such in the output: colour contrast, focus order, keyboard traps, whether alt text is any good, and screen reader flow. Contrast in particular needs the computed styles, which needs a rendering engine; guessing from inline styles produces confident nonsense.
The address goes through the same guard as the other server tools, and the endpoint is rate limited to 20 requests a minute per address with nothing stored.