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.

Result

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.

Frequently asked questions

Does passing this mean I comply with WCAG?
No. WCAG has criteria no automated tool can evaluate, and most of the ones that matter for real use are in that group. This finds a specific, useful subset.
What should I do after fixing these?
Unplug the mouse and use the page for five minutes. Then turn on the screen reader your operating system already has — VoiceOver, NVDA, Narrator — and listen to one page. That hour will tell you more than any scanner.
Why not check colour contrast?
Because doing it properly needs the computed styles of every element, which needs a browser engine. The contrast checker on this site does the job for a pair of colours you already have.
Is an accessibility overlay a shortcut?
No. They are widely rejected by disabled users and have not protected anybody from the legal exposure they were sold against. Fix the markup.
Can it check a page behind a login?
No. It fetches the page as an anonymous visitor, so anything behind a login is out of reach from here.
Weekly drops

New tools, when there are new tools

One email when something worth using ships. No schedule to fill, so no filler.

Your address goes nowhere else, and one click unsubscribes.