CrawlCheck

Findings · 2026-09-01 · By

Accessibility from the delivered HTML: nine things a screen reader needs before contrast matters

Not a WCAG audit. A check on whether the structure assistive technology depends on exists in the document the server returned.

An owner asked whether this scanner measures accessibility. The honest answer was no: it measures whether a machine can reach, read and quote a site, and accessibility is whether a person using assistive technology can use it. They overlap in places, a screen reader and a crawler go blind at the same missing headings, but they are not the same thing, and a tool that calls one the other is making a claim it cannot back.

What can be measured from a fetch, without rendering, is whether the structure a screen reader depends on is present at all. So that is what the new section measures, and it says in its own footer what it is not. Contrast, focus order, keyboard traps and motion need a rendered page and a person. None of that is claimed.

The nine rows

A lang attribute on the root element, because a screen reader picks its voice from it. A non-empty title, the first thing announced. An alt attribute on every image, where alt="" is correct for decoration and a missing attribute is the defect; the two are not the same and conflating them has produced false findings before. A name on every form control, from a label, a wrapping label, aria-label or a title, because a placeholder disappears on the first keystroke. A name on every button. A title on every frame a reader can reach. Exactly one main landmark. A way past the navigation, either a skip link or nav and main landmarks together. And no duplicate ids, because labels and aria references resolve by id and a duplicate silently points them at the wrong element.

Heading order, zoom lock and link text are already scored in other sections and are not counted twice. The section is weighted into the overall grade and kept out of the three AI-visibility pillars, because a screen reader is not an answer engine.

Two false positives, caught before shipping

The first run counted <main role="main"> as two landmarks: one for the element, one for the role on it. That would have told a well-built personal site it had a duplicate main. The second counted a tag manager's <noscript> tracking pixel as an untitled frame. A frame with height zero, hidden by style, or inside noscript is never reached by a reader, and it is not held to a title now. Both were found by hand-verifying every failing row against the live page before the section went live, which is the standing rule for anything that accuses a site.

What it found on sites we run

Two of our own properties had no main landmark on any page. Both run a page builder on top of a theme that prints <main> on its own templates and nothing on the builder's, so every builder page, which was every page that mattered, dropped the landmark. One of them also embedded a map with no title. A theme that is accessible on its demo content is not evidence about the pages you actually built with it.

Both fixes were small and both were verified on bare URLs after the caches cleared: a landmark wrapped around the builder's content on one site, a role on the content wrapper plus a title on the map frame on the other. The rows went from 89 and 71 to 100. The lesson for anyone running a theme plus a builder: fetch a real page, not the theme demo, and look for <main.

How to check your own in one command

curl -s https://yoursite.com/ | grep -o '<main[^>]*>\|role="main"\|<html[^>]*lang=[^ >]*' 

You want one line for the landmark and one for the language. Then count images without an alt attribute at all: grep -o '<img[^>]*>' | grep -vc 'alt='. Zero is the target. The glossary defines landmark region, accessible name and skip link.

Every figure above came out of this scanner.

Point it at your own domain and see the same measurements, free.

Scan a domain — free

Questions this post answers

Is this a WCAG audit?

No. It reads only the document the server returns and checks whether the structure a screen reader depends on is present: language, title, names on images, controls, buttons and frames, one main landmark, a bypass route, unique ids. Contrast, focus order, keyboard traps and motion need a rendered page and a person and are not measured.

Is alt="" a missing alt?

No. An empty alt attribute marks an image as decorative and is correct. The defect is an image with no alt attribute at all, which makes a screen reader announce the file name.

Related findings

All findings · The dataset · How the dataset works