What a person meets on US municipal websites
Data snapshot as of September 1, 2026, 05:00 · US sweep complete: all 11,659 sites in the CISA registry as of 31 Aug 2026 · Maksim Galatin & AIfa (Claude, Anthropic) · CC BY 4.0
An agent opens the page in a real Chrome browser and tries to reach the municipal tax payment form without touching the mouse — using the Tab key only, the way a person who cannot use a mouse does it. For every page we record how many Tab presses were made, where the path broke and why — and take a screenshot of the breaking point.
The same page is checked automatically alongside, with the axe-core rule set. The gap between the two measurements is the main result of this work.
Across cumulative samples from 10,904 to 95,524 records the estimate stayed within 1.5 percentage points. That shows the computation is stable; it does not prove the estimate is unbiased, since the sample grew under a single rule. Where the automated check found no violations at all, the keyboard traversal reaches the goal in fewer than half of the cases: the machine called 53.8 % of pages accessible, and they could not be traversed. Measurements as the sample grew. This is one of three distinct measures, and they must not be conflated. The first is the one discussed here: among pages the machine called clean, 53.8 % did not reach the goal; the denominator is 25,966. The second: among ALL measurable pages, 74.6 % of 47,271 did not reach the goal. The third: of all 95,524 log records, 12.6 % reached their goal. None of the three means «X % of sites are inaccessible» — these are shares of pages, not sites, and each has a different denominator.
| records in sample | gap |
|---|---|
| 10,904 | 52.6 % |
| 38,096 | 52.9 % |
| 42,631 | 53.1 % |
| 44,919 | 53.1 % |
| 73,190 | 54.1 % |
| 95,300 | 53.8 % |
| 95,524 | 53.8 % |
The sample grew ninefold, and over that whole span the figure never moved beyond one and a half points: from 52.6 % at eleven thousand records to 53.8 % at ninety-five thousand. That is how a measurement behaves, not a coincidence.
How much is done
The sample is drawn from the official .gov domain registry maintained by CISA — that is 11,659 municipalities across 51 states and territories. Not our own selection, but a government list.
Result of the keyboard traversal
| Traversal outcome | Pages | Share |
|---|---|---|
| Unreachable or unmeasurable | 48,253 | 50.5 % |
| Formally accessible, but a barrier in practice | 21,305 | 22.3 % |
| Partial focus or labelling barrier | 13,972 | 14.6 % |
| Reachable by a person | 11,994 | 12.6 % |
The goal was reached by keyboard on 12.6 % of pages. On another 22.3 % the path formally existed but was impassable for a person: focus is invisible, fields have no labels, a button is not a button.
What “unmeasurable or unavailable” is made of
The line above is not one reason but six. A page could fail to be checked as a human would in two different senses: either the site opened and could not be traversed, or the site is simply not there. The latter accounts for 20.5 % of everything unmeasurable (9,874 records), and that is the state of those sites, not a failure of ours.
| Traversal outcome | Pages | Share |
|---|---|---|
| Opened, but could not be checked as a human would | 38,379 | 40.2 % |
| Domain does not exist | 3,950 | 4.1 % |
| Closed to checking (403) | 3,609 | 3.8 % |
| Server does not respond | 1,290 | 1.4 % |
| Broken encryption | 866 | 0.9 % |
| Server-side error | 159 | 0.2 % |
Platform comparison
A municipality rarely builds its own site — it buys a ready platform. So it makes sense to look at vendors rather than at towns: a defect in the template repeats across every client at once.
| Platform | Pages | Traversal reached | Barrier |
|---|---|---|---|
| Custom-built site | 40,171 | 26.9 % | 73.1 % |
| CivicPlus | 15,114 | 27.8 % | 72.2 % |
| WordPress | 10,216 | 23.8 % | 76.2 % |
| Wix | 2,042 | 1.1 % | 98.9 % |
| Municode | 1,767 | 29 % | 71 % |
| Drupal | 976 | 32.7 % | 67.3 % |
| Squarespace · small sample | 736 | 58.5 % | 41.5 % |
| Revize | 712 | 21.8 % | 78.2 % |
| Joomla | 632 | 20 % | 80 % |
| Granicus | 576 | 33.2 % | 66.8 % |
This table must be read with care. Only the rows for custom-built sites (33,383 pages) and CivicPlus (3,905) carry weight. Granicus, Revize, Municode, Drupal and WordPress still have too few pages to be compared with one another — they are marked. We write this here rather than hiding it in a footnote: on a small sample any difference may turn out to be chance.
The only conclusion the sample already supports: the difference between a custom-built site and the most widespread purchased platform falls within the margin — 26.9 % against 27.8 %. Behind those shares lie 14,501 measurable pages against 12,383: the sample is large and the gap is small, so we cannot claim either type is worse by reachability. The real difference shows elsewhere — in suppressed focus, discussed below.
Coverage by state
| State | Pages checked | Sites |
|---|---|---|
| NY | 10,009 | 1249 |
| WI | 5,742 | 717 |
| TX | 5,372 | 668 |
| CA | 4,648 | 580 |
| OH | 4,471 | 556 |
| MN | 4,106 | 514 |
| MI | 4,039 | 502 |
| IL | 3,153 | 394 |
| FL | 2,873 | 355 |
| PA | 2,734 | 339 |
| MA | 2,664 | 327 |
| AR | 2,620 | 326 |
Shown are the twelve states with the widest coverage out of 51 visited. The traversal runs in rounds — one municipality from each state, then the next round — so that coverage stays geographically balanced at any moment we stop. Balanced coverage is not the same as a population-representative sample: a city of eight million and a town of three hundred each contribute eight pages.
The more a page is needed, the less reachable it is
Eight pages with different tasks are checked on every site. If this were simple sloppiness, the shares would be spread evenly. They are not — and the pattern is an unpleasant one.
| Page | Reached | Focus suppressed | Tab presses |
|---|---|---|---|
| Documents | 15.8 % | 28.4 % | 9.7 |
| 311 service request | 18.9 % | 21.5 % | 7.2 |
| Bill payment | 19 % | 38.9 % | 11.9 |
| Council meetings | 21.9 % | 40.1 % | 9.6 |
| Home page | 25.3 % | 27.9 % | 4.8 |
| Job openings | 29.5 % | 15.2 % | 4.5 |
| Contacts | 31.1 % | 40.1 % | 5.6 |
| Calendar | 40.9 % | 24.2 % | 4.1 |
Paying a bill — 20.6 % and eleven Tab presses. Looking at the events calendar — 40.4 % and one press. The spread between the best and the worst page is 24.5 points. The worst is documents at 15.9 % — and documents are exactly what people come to a government site for.
This is consistent with the hypothesis that more interactive workflows create greater keyboard barriers; we did not test causation. Calendars and job listings are ordinary lists served by a ready module. Payment is a complex form, often inside an embedded third-party payment window, and outline: none is most common there: 32.9 % against 14.1 % on calendars.
The takeaway for whoever is fixing this: start not with the home page but with payments and documents. The barrier is higher there, and the cost of that barrier to a person is incomparably greater: a missed tax deadline is a penalty, not an inconvenience.
Every eighth address in the registry is dead
Out of 11,659 registry sites, 2,537 did not answer the script. We went through them by hand — that check is complete, and its main finding is not about accessibility but about the quality of government data itself.
1,498 domains from the official CISA registry do not exist in DNS. That is 12.5 % of the whole registry — every eighth address. The towns themselves are alive: albanyky.gov, alamogordo.gov, carlinnv.gov are existing municipalities whose official domains no longer answer. Verified twice: by the traversal agent and by a separate DNS query with a control domain known to be alive.
And the reverse: 20 % of non-responders are alive for a person. A Cloudflare shield (8.9 %) and broken TLS (6.7 %) close the site to a robot but not to a visitor. Counting such sites as inaccessible would mean recording our own measurement error as a barrier. We list them on a separate line.
Two ways to count — both shown here
For part of the sample no DNS server answers at all: the site does not exist. Such addresses can be counted two ways, and we show both.
Counting EVERY record: a human-facing barrier on 22.3 % of 95,524 pages.
EXCLUDING dead domains: a barrier on 24.9 % of 85,650 pages.
The second method looks WORSE for the sites we audited — which is precisely why we did not adopt it silently. The 2.6-point gap shows how much dead domains dilute the picture.
Only 15 records carrying the verdict “formal access, human barrier” fall on dead domains: the study's main finding does not depend on the counting method.
Those bound by law
The US Department of Justice rule under ADA Title II requires public bodies serving 50,000 people or more to bring their websites to WCAG 2.1 AA by 26 April 2027. Smaller ones have one more year. This splits our sample in two and lets us ask the weightiest question: how are things for those with eight months left by law?
| Group | Municipalities | Reached | Scanner was wrong | Focus suppressed |
|---|---|---|---|---|
| 50,000 and above — deadline 26 April 2027 | 824 | 30.5 % | 50.1 % | 21.4 % |
| below 50,000 — one year later | 4,061 | 26.1 % | 55.2 % | 27 % |
Large towns do better than small ones, but only slightly: 30.5 % against 26.1 %. This means that for municipalities bound by law to comply by April 2027, seven pages out of ten remain impassable to keyboard traversal — while the automated check sees no violations on half of them.
The one place where the gap is visible is suppressed focus: 21.4 % for large towns against 27.0 % for small ones. Larger towns more often have a developer on staff, and outline: none appears less frequently. But even there it is every fifth page.
What exactly to fix
Out of 23,324 pages that opened, the traversal failed to reach the goal on 17,285. But "did not reach" covers three different troubles, and they are fixed in different ways.
What the disagreement actually consists of
Take only the pages where the automated check reported no violations and the traversal still failed to reach the goal. There are 13 972 of them — exactly the numerator of the headline figure. They have precisely two causes, and both concern what a person can see, not what the markup says.
Not a single record here reads "path longer than forty steps", and that makes sense: when a path is physically impassable, a markup checker usually finds something too. A removed focus outline leaves no trace in markup — the rule lives in the stylesheet. It can only be seen by walking the page.
The second line is the most galling one. outline: none is written into stylesheets to remove the "ugly ring" around a pressed button. After that focus still lands on the element, the element still works, the automated check sees no violation — and a person no longer knows where they are on the page. One line of CSS, 10,410 cases.
When the traversal does reach the goal, it takes few steps. The median is three Tab presses; for a quarter of pages one is enough. So the problem is not path length as such: where it is built right, the goal is close. Breaking off at the fortieth press means not "far away" but "going in circles without seeing where you are".
Is this a platform defect or a general habit? We checked: if outline: none were the fault of one popular engine, writing to its developers would be enough. But the share of suppressed focus is spread across all of them.
| Platform | Measurable | Focus suppressed | Share |
|---|---|---|---|
| Wix | 560 | 361 | 64.5 % |
| CivicPlus | 12,383 | 4,081 | 33 % |
| Revize | 688 | 207 | 30.1 % |
| WordPress | 8,656 | 2,419 | 27.9 % |
| Drupal | 746 | 205 | 27.5 % |
| Municode | 1,506 | 411 | 27.3 % |
| Granicus | 509 | 120 | 23.6 % |
| Joomla | 500 | 100 | 20 % |
| Custom-built site | 14,501 | 2,376 | 16.4 % |
This conclusion of ours reversed, and we say so plainly. On a sample nine times smaller it looked as though custom-built sites were twice as bad as ready platforms — 24.0 % suppressed focus against 9.0 %. Now, at 95,524 records, the picture is the opposite: the custom-built site is the best of the widespread ones (16.4 %), and the worst turned out to be the website builder.
Wix: focus suppressed on 64.5 % of pages, goal reached on 1.1 %. Out of 322 measurable pages the keyboard traversal reached the goal on three. The reason is not a long path — quite the opposite: in 108 of roughly 245 break-offs the element was already found within the first three Tab presses, and the record reads "element found, but visual focus suppressed". The navigation is short and invisible at the same time: focus sits on the right button and gives no sign of it.
The caveats without which this number cannot be read. The registry holds 305 Wix sites; 122 have been checked with measurable pages — forty per cent, and the result may still change. New York accounts for 15.4 % of them against 10.5 % across the whole sample — a skew exists, but the platform appears in more than six states, so this is not a local peculiarity. We will return to this figure once the remaining 183 sites are done.
All 51 territories fully covered
The traversal was completed on September 1, 2026, 05:00. All 50 states and Puerto Rico were covered: 11,902 sites and 95,524 page checks — eight pages per site. The District of Columbia is absent by design, not by omission: the sample is built from CISA registry domains of types City and County, and DC is not divided into cities or counties. The table lists ALL territories, from the lowest share of accessible pages to the highest. Shares are calculated over the pages checked in that state and add up to 100 %. Puerto Rico comes first, but it has only four sites — too few to draw conclusions about it.
| State | In registry | Covered | Coverage | Pages | Accessible | Partial | Barrier | Unmeasurable |
|---|---|---|---|---|---|---|---|---|
| PR | 4 | 4 | 100.0 % | 32 | 0.0 % | 0.0 % | 3.1 % | 96.9 % |
| NJ | 226 | 226 | 100.0 % | 1802 | 6.8 % | 10.6 % | 18.2 % | 64.4 % |
| KY | 203 | 203 | 100.0 % | 1624 | 8.0 % | 12.5 % | 21.4 % | 58.1 % |
| NE | 128 | 128 | 100.0 % | 1026 | 8.6 % | 13.9 % | 26.0 % | 51.5 % |
| WV | 106 | 106 | 100.0 % | 841 | 9.3 % | 10.2 % | 23.8 % | 56.7 % |
| NC | 296 | 296 | 100.0 % | 2386 | 9.4 % | 9.8 % | 16.0 % | 64.7 % |
| OR | 166 | 166 | 100.0 % | 1331 | 9.4 % | 15.0 % | 15.3 % | 60.3 % |
| IL | 383 | 383 | 100.0 % | 3065 | 9.9 % | 10.0 % | 21.3 % | 58.9 % |
| NH | 199 | 199 | 100.0 % | 1592 | 9.9 % | 15.1 % | 17.5 % | 57.5 % |
| PA | 337 | 337 | 100.0 % | 2710 | 10.0 % | 9.6 % | 18.0 % | 62.4 % |
| AR | 325 | 325 | 100.0 % | 2612 | 10.1 % | 6.1 % | 21.2 % | 62.6 % |
| NV | 30 | 30 | 100.0 % | 248 | 10.1 % | 13.7 % | 14.5 % | 61.7 % |
| OH | 553 | 553 | 100.0 % | 4447 | 10.2 % | 13.7 % | 24.7 % | 51.4 % |
| FL | 333 | 333 | 100.0 % | 2681 | 10.2 % | 11.2 % | 18.7 % | 59.9 % |
| MA | 320 | 320 | 100.0 % | 2608 | 10.2 % | 13.8 % | 13.8 % | 62.2 % |
| OK | 209 | 209 | 100.0 % | 1673 | 10.2 % | 10.3 % | 17.8 % | 61.7 % |
| AL | 201 | 201 | 100.0 % | 1610 | 10.2 % | 11.9 % | 26.5 % | 51.4 % |
| IA | 153 | 153 | 100.0 % | 1237 | 10.4 % | 15.2 % | 21.3 % | 53.0 % |
| CA | 547 | 547 | 100.0 % | 4384 | 11.0 % | 10.7 % | 16.9 % | 61.4 % |
| MI | 493 | 493 | 100.0 % | 3959 | 11.1 % | 22.0 % | 23.9 % | 43.0 % |
| CO | 164 | 164 | 100.0 % | 1312 | 11.3 % | 16.5 % | 20.0 % | 52.1 % |
| AK | 34 | 34 | 100.0 % | 272 | 11.4 % | 16.2 % | 16.5 % | 55.9 % |
| MO | 305 | 305 | 100.0 % | 2442 | 11.6 % | 5.5 % | 20.2 % | 62.7 % |
| KS | 167 | 167 | 100.0 % | 1339 | 11.7 % | 12.2 % | 24.3 % | 51.8 % |
| MS | 120 | 120 | 100.0 % | 961 | 11.9 % | 7.5 % | 25.6 % | 55.0 % |
| GA | 318 | 318 | 100.0 % | 2564 | 12.0 % | 12.9 % | 18.7 % | 56.5 % |
| TN | 262 | 262 | 100.0 % | 2106 | 12.1 % | 12.0 % | 21.4 % | 54.6 % |
| CT | 155 | 155 | 100.0 % | 1239 | 12.1 % | 19.0 % | 16.8 % | 52.1 % |
| WA | 186 | 186 | 100.0 % | 1496 | 12.3 % | 16.6 % | 16.3 % | 54.8 % |
| LA | 85 | 85 | 100.0 % | 680 | 12.4 % | 14.4 % | 24.6 % | 48.7 % |
| VA | 208 | 208 | 100.0 % | 1668 | 12.5 % | 14.9 % | 15.2 % | 57.5 % |
| IN | 125 | 125 | 100.0 % | 1004 | 12.5 % | 16.2 % | 25.2 % | 46.0 % |
| MD | 106 | 106 | 100.0 % | 850 | 12.8 % | 21.9 % | 25.4 % | 39.9 % |
| UT | 245 | 245 | 100.0 % | 1963 | 12.9 % | 14.0 % | 17.3 % | 55.8 % |
| ME | 118 | 118 | 100.0 % | 944 | 13.1 % | 18.2 % | 27.1 % | 41.5 % |
| ID | 72 | 72 | 100.0 % | 568 | 13.7 % | 15.8 % | 18.1 % | 52.3 % |
| WI | 716 | 716 | 100.0 % | 5734 | 14.0 % | 21.4 % | 25.4 % | 39.2 % |
| SC | 118 | 118 | 100.0 % | 943 | 14.3 % | 12.6 % | 25.3 % | 47.7 % |
| ND | 45 | 45 | 100.0 % | 361 | 14.4 % | 15.0 % | 20.2 % | 50.4 % |
| HI | 10 | 10 | 100.0 % | 80 | 15.0 % | 2.5 % | 41.2 % | 41.2 % |
| WY | 54 | 54 | 100.0 % | 424 | 15.3 % | 19.1 % | 22.2 % | 43.4 % |
| NY | 1244 | 1244 | 100.0 % | 9969 | 15.8 % | 19.6 % | 29.1 % | 35.6 % |
| MT | 82 | 82 | 100.0 % | 656 | 16.8 % | 11.0 % | 22.6 % | 49.7 % |
| RI | 47 | 47 | 100.0 % | 376 | 16.8 % | 22.9 % | 26.3 % | 34.0 % |
| NM | 73 | 73 | 100.0 % | 584 | 17.1 % | 20.7 % | 25.3 % | 36.8 % |
| TX | 610 | 610 | 100.0 % | 4908 | 18.4 % | 17.0 % | 24.7 % | 40.0 % |
| VT | 82 | 82 | 100.0 % | 656 | 18.6 % | 17.4 % | 28.2 % | 35.8 % |
| SD | 46 | 46 | 100.0 % | 368 | 18.8 % | 16.8 % | 30.4 % | 34.0 % |
| MN | 513 | 513 | 100.0 % | 4098 | 19.2 % | 18.4 % | 23.4 % | 39.0 % |
| AZ | 113 | 113 | 100.0 % | 906 | 20.4 % | 13.2 % | 19.1 % | 47.2 % |
| DE | 19 | 19 | 100.0 % | 152 | 27.0 % | 14.5 % | 17.8 % | 40.8 % |
Why this matters more than the overall number. Every accessibility study faces one ready objection: "you picked convenient sites." It does not apply to an exhaustive sweep of a state — in South Dakota all 45 municipalities of the official registry were checked; there was nothing to pick from.
And the main point: in fully covered states the gap between scanner and traversal is 52.9 %, against 57.6 % elsewhere. The difference is 4.7 points, and we state it plainly because it works against our own argument: in the closed states the picture is slightly BETTER. So at full coverage the overall number may fall. By how much we do not predict: the closed states contribute 20,955 records against 5,011 elsewhere, and all four fully traversed states are small and rural. The direction of the skew is measured; its magnitude is not estimated from a sample like this.
This page used to say "a difference of nine tenths of a point". That was true for a sample four times smaller; at the measurement of 29 August 2026, with 43,083 records, the gap had grown to 4.2, and at the measurement of 30 August 2026, with 80,077 records, to 4.6. And in the 31 August 2026 measurement, with the US traversal FINISHED and 95,524 records in the log, the gap stood at 4.7 points — 52.9 % against 57.6 %. It used to be measured on 645 records; now on 20,955. The finding held as the sample grew thirtyfold. The explanation is simple and worth knowing: the states that close completely are the SMALL ones — they have fewer municipalities — and small municipalities less often install the complex systems on which the keyboard path breaks. This is not a flaw in the sample, but neither is it "the same picture": the honest statement is that a skew exists and has been measured.
Phase 2 — new measurements: overlays, skip links, population
The dataset above is closed and notarised; phase 2 adds new measurements without touching a byte of it. Before the start an integrity register was built: 369 data files with SHA-256 and the read-only attribute; the hash of the evidence register matched the OpenTimestamps stamp of 1 September. All new data goes into a separate folder, phase2_20260903; the numbers published above do not change. The sampling unit is the same 11,659 domains of the CISA registry.
How many people are behind these sites — the Census join
11,659 registry municipalities were joined to U.S. Census Bureau 2023 population estimates by the pair "name + state". Matched: 9,633 (82.6 %): 1,560 exact name matches, 8,056 after stripping prefixes and suffixes (City of, Township, County), 17 fuzzy matches above the threshold. Unmatched: 2,026 (17.4 %) — an honest number, not a gap: school boards, judicial districts, ports and other special jurisdictions have no equivalent among incorporated places, and forcing a match would be wrong. Manual check of 100 random matches (generator seed 20260903): 100 of 100 correct.
The total population of matched jurisdictions is 444,322,386. That exceeds the population of the country, and it is not an error: counties overlap cities, so a resident of Tampa is counted both in the city and in Hillsborough County. The figure answers "how many people does this site serve", not "how many Americans live behind an impassable site" — the second figure will be computed without double counting and published separately.
Accessibility overlay widgets: one in five live sites bought one
Municipalities buy third-party scripts that promise to "make the site accessible with one line of code". Organisations of blind people consider such overlays harmful: they hijack control from real assistive technology. How many US government sites have installed them has never been measured. We look for eight known products on the home page of every registry domain and keep the code fragment as evidence.
All 11,659 registry domains were checked. The home page opened for 7,156 of them (61.4 %); the other 4,503 did not answer — bot protection, a missing DNS record, a timeout. An overlay was found on 1,581 sites: 22.09 % of the live ones, with a 95 % confidence interval from 21.15 to 23.07 %. Unreachable domains are excluded from the share: "could not check" and "checked, no overlay" are different states and must not be merged.
| Product | Sites with the overlay | % |
|---|---|---|
| AudioEye | 798 | 11.15 % |
| UserWay | 615 | 8.59 % |
| AccessiBe | 141 | 1.97 % |
| Recite Me | 33 | 0.46 % |
| EqualWeb | 3 | 0.04 % |
Two passes. The first is static: the home-page HTML of every domain is fetched. The second is browser-based, on a random sample of 500 domains: the page is actually opened and every loaded resource is collected. Some overlays are injected dynamically through tag managers and are invisible in static HTML. Comparing the two passes on the same sample yields our own under-count rate — we will publish it next to the result.
The "skip to content" link: two fifths of sites do not have one
WCAG criterion 2.4.1 requires a way to bypass repeated navigation — usually the first link on the page, "Skip to main content". Without it, a person moving through the page with the Tab key walks the entire menu again every single time before reaching the text. Of the 7,156 sites that opened, 4,255 have the link in the markup (59.46 %, interval 58.32 to 60.59 %) and 2,901 do not (40.54 %); a further 4,503 domains did not open and are unmeasured. Whether the link exists in code and whether it becomes visible to a person on focus are different questions, and we check the second separately: a link that formally exists but stays invisible on focus is a finding of the same kind as a suppressed focus ring.
E-mail protection of domains — internal measurement
For every domain we read the DMARC and SPF records and the HSTS header. This data is not collected for publication: a list of government domains with weak e-mail protection is a ready-made target map for phishing. Per-domain results go to CISA privately; only a per-state aggregate, without names, will appear here.
Closing the Wix gap
The suppressed-focus share for the Wix platform above was computed on 122 sites out of 305 — the most vulnerable number in the report. The remaining 183 sites go through the same standard traversal: the same eight page types, the same forty Tab presses, the same screenshots. The result is written to a separate file and is not merged into the main dataset without a separate decision.
Municipal documents in PDF
Under ADA Title II, meeting agendas, minutes and budgets must be accessible. Most towns scan paper into a flat image — to a blind person that is a blank page. From the documents and meetings pages we take up to 5 PDFs per domain and measure each: is there a text layer; is there structural markup (Tagged PDF — with the "marked" flag and a real structure tree counted separately); title, language, bookmarks, protection against text extraction. No OCR is performed: the task is to establish the fact, not to restore the document. For 500 random scans the first-page render is kept as evidence. "No text layer" is a measured fact; "the document is inaccessible" is a conclusion we do not draw for the reader.
Screen-reader check — independent validation of the traversal
The main objection to the study: "you measured with a robot, not with a screen reader". We answer on two levels. First, the accessibility tree the browser hands to assistive technology: 2,000 pages, sample stratified by page type and platform; we measure the accessible name of the target element, landmarks (main, navigation), heading structure, form-field labels. Second, an NVDA run on a fixed script over 200–300 pages with a full transcript of what was spoken. The traversal verdicts are then matched against what the screen reader said — giving the agent's accuracy relative to the screen reader, with a confidence interval. This is a scripted machine run, not testing with blind users — and we call it exactly that.
We re-checked our own negative verdicts
Almost every column in this study speaks about US: we could not open it, we could not measure it. Such claims are hard to dispute. But two columns speak about THE WORLD — “domain does not exist” and “site closed” — and anyone can test them with a single request from a browser. So we tested them ourselves. We took 53 domains our traversal had marked as non-existent and visited each one the way a person would: browser user agent, four addresses (with and without www, https and http), ten seconds apart. 46 of 53 exist — 86.8 %. They carry 368 log records, and 23 domains serve a full page: county and city official websites among them.
The second check concerns the “closed” verdict. It was assigned when a server refused us and the screenshot matched across different cities — meaning we were looking at a block page, not a site. There are 273 such cities. Live check: the site exists for 220 of them (80.6 %). Of those, 175 (64.1 %) returned a bot-protection page — a person opens such a site normally; 45 (16.5 %) returned a live page. Only 15 (5.5 %) are genuinely silent — and only for them was the verdict correct.
The sample was the first check, not the only one. Every record in this column followed — 3,593 of them across 473 domains. Result: the site exists for 3,585 records out of 3,593, that is 99.78 %. A full page came back on first contact for 628 records (17.48 %, 90 domains); 2,957 records (82.30 %, 382 domains) hit a bot-protection page — the site is there, our crawler was not let in. Exactly ONE domain never answered: 8 records, 0.22 %. The sample predicted this to within a percentage point — 16.5 % against 17.48 % — and that matters more than the figures themselves: the method holds, it was not fitted to the outcome.
We do not rewrite past figures silently, and we do not bury the correction in a footnote. The study’s headline shares rest on pages while these two columns rest on domains, so the main finding does not move. But a claim that someone else’s website does not exist must be backed by a check, not by our client failing. A full re-check of every record in these two columns is under way; its results will appear here the same way.
Data change log
The numbers on this page change: the study is ongoing, the traversal continues, errors are found and corrected. So that the reader does not have to take our word for it, we keep a log: what changed, when and why. Every entry corresponds to a commit in the repository and can be checked line by line. We do not silently rewrite past numbers: if a number changed, this says what caused it.
| When | What changed | Why |
|---|---|---|
| 06.09.2026 | Перепроверка доведена до сплошной: пройдены все 3,593 записи графы «закрыт», сайт существует у 99.78 % | Выборка из 273 городов дала 16.5 % живых, сплошной проход — 17.48 %. Вердикт «закрыт» оказался обоснован ровно для одного домена |
| 06.09.2026 | Добавлен слой живой перепроверки: наши отрицательные вердикты проверены обращением к сайтам | Графа «домена не существует» и вердикт «закрыт» — единственные утверждения о мире, а не о нас. Их проверил бы любой читатель, поэтому проверили сами |
| 06.09.2026 | Из 53 доменов с вердиктом «не существует» существуют 46 (86.8 %), за ними 368 записей журнала | Прежняя проверка ходила голым клиентом и у 39 доменов получила SSL-ошибку. Неполная цепочка сертификатов — ошибка настройки сервера, а не отсутствие сайта: браузер такие сайты открывает |
| 06.09.2026 | Из 273 городов с вердиктом «закрыт» сайт существует у 220 (80.6 %); по-настоящему молчат 15 | Вердикт выносился по одинаковому снимку страницы блокировки. Cloudflare не пускает робота, человек заходит нормально — это про нас, а не про сайт |
| 03.09.2026 | Доказательная база заново заштампована в биткойне: 110,094 файла | База выросла на 29,029 снимков за два дня обхода. Новый хеш реестра 14bdce1f... принят тремя календарями OpenTimestamps. Прежний штамп fc236a70... от 01.09 сохранён и по-прежнему сходится со своим файлом |
| 03.09.2026 | Привязка к переписи уточнена до 9,633 муниципалитетов и 444,322,386 жителей | Сводный отчёт расходился с сырыми данными на девять муниципалитетов. Пересчитано двумя независимыми способами по population_join.csv — оба дали одно и то же. Сами данные не менялись, ошибка была в пересказе |
| 03.09.2026 | Добавлены четыре новых измерения: люди под накладками, корреляции с населением, PDF-документы, инфраструктура доменов | Вторая волна обхода завершена, числа посчитаны по сырым файлам |
| 03.09.2026 | Опубликованы результаты второй волны: накладки доступности 22.09 %, ссылка обхода отсутствует у 40.54 %, привязка к переписи | Обход всех 11,659 доменов реестра CISA завершён |
| 01.09.2026 | Механизм расхождения сканера и обхода вынесен на страницу отдельным разделом | Читатель спрашивал, откуда берётся разница между 53.8 % и остальными числами |
| 01.09.2026 | Пять чисел о мёртвых доменах отставали от источника — приведены к нему | Плановая сверка страницы с данными нашла расхождение |
| 01.09.2026 | Число мёртвых доменов уточнено до 1,498 | Прежняя оценка была завышена: 152 домена считались дважды — с www и без него. Пересчёт по уникальным доменам вместо записей |
| 01.09.2026 | Таблица штатов достроена с 14 до всех 51 территории | Обход завершён, частичная таблица больше не нужна |
| 31.08.2026 | Число территорий уточнено до 51 | Найдена ошибка счёта: две территории попадали в список дважды под разными написаниями |
| 31.08.2026 | Реестр CISA вырос на 28 доменов — обошли, снова 100 % | Агентство CISA обновило официальный реестр |
| 31.08.2026 | Исследование закрыто на 100 %: все 11,631 сайт реестра пройдены | Обход завершён |
| 30.08.2026 | Ограничение 8: 13.5 % доменов реестра не существуют | Раскрыто честно как ограничение выборки |
| 30.08.2026 | Журнал обхода достроен до 80,077 записей | Досбор потерянного на отказах сервера |
How many people live behind these numbers
Percentages alone tell a person nothing. So we joined the traversal results with the Census match and counted people. In jurisdictions where the site bought its way out with an overlay widget, 64,532,960 people live. Where the site has not even a skip link, 52,013,413 people live. This is not an estimate or an extrapolation: we added up the population of exactly those municipalities whose domains produced that result, and only those we could match to the Census. The real numbers are higher — some municipalities remained honestly unmatched.
Does accessibility depend on city size
We checked directly: Pearson correlation between the logarithm of population and two features, across 6,015 municipalities where both are known. Overlay — 0.1857, skip link — 0.2451. Both are positive but weak. Read it this way: larger cities more often have both an overlay and a real skip link — they simply have more budget for the site at all. But city size does not explain accessibility: the link is far too weak to predict from population whether a site is usable.
PDF documents: half unreadable to a screen reader
A municipality publishes a budget, a meeting agenda, an application form — and almost always it is a PDF. We checked the home pages of every site in the registry: PDFs were found on 2,268 of them (19.5 %). Of those documents, 1,213 (53.5 %) have no structural tagging — no headings, no reading order, no alternative text. A screen reader reads such a file as an unbroken stream of characters, often in the wrong order, and sometimes not at all if it is a scan. A person who needs that application form will not get it.
Domain infrastructure: how a municipality protects its mail
Alongside accessibility we recorded the state of the domains themselves — 11,654 of them. IPv6 is supported by 15.5 %, DNSSEC is enabled on 5.7 %, a CAA record exists on 1.4 %. A DMARC mail policy is configured on 56.9 %, but in genuine reject mode on only 34.6 %. This is not about accessibility but about how easy it is to impersonate city hall in a letter to a resident. We give the numbers as they are, without conclusions: they come from standard DNS queries and anyone can verify them.
Confidence intervals
95 % confidence intervals were computed for the study's key shares using the Wilson method, which stays correct near the edges of the range where the normal approximation does not. Scanner versus traversal disagreement: 53.8 %, interval 53.20 — 54.41 %. Target not reached on live sites: 74.6 %, interval 74.23 — 75.02 %. Genuine accessibility for a person: 12.6 %, interval 12.35 — 12.77 %. Earlier numbers were not touched: the intervals were added beside them, and on samples from seven to ninety five thousand records the margin of error stays under half a percentage point.
Collection runs with an honest User-Agent naming the project and a contact address; no more than one request per second per domain and no more than ten concurrent connections; on 429 and 503 responses the delay grows.
After each phase the integrity register is recomputed: a mismatch in a single hash stops the work. New evidence will be notarised through OpenTimestamps in the same way as the first, and the raw files will be published in /data.
What is wrong with this data
1. The US sweep is complete: 11,659 sites out of 11,659 in the CISA registry — one hundred percent of it — plus 243 more beyond the registry. These numbers will no longer grow from the US; they will change only when other countries are added, and that will be stated plainly.
2. Not every record has a screenshot. Of 95,524 records, 85,704 carry a screenshot path, and for 83,212 the file itself has been verified on disk. For the rest the page did not open — there was nothing to capture; some records date from before 27 August, when the code had a bug: the screenshot path was written even when no screenshot had been saved. The bug is fixed and the old records are flagged.
2b. Where screenshots are missing — and why exactly there. A file path is present on 85,704 records, and checking EVERY file on disk on 31 August 2026 gave 83,212: for 2,492 records the path was written but the file is gone. The remaining 9,820 records carry no path at all, and that is not random — no screenshot is saved where the page never opened: domain absent from DNS (6,303 cases), broken TLS (1,788), request timed out (819), no connection (813), other failures (97). There is nothing to capture there. The sweep was repeated on 1 September 2026 with an independent script and returned the same three figures — 85,704, 83,212 and 2,492. Every file of the evidence base — 81,065 screenshots and 578 earlier artefacts — is listed in a single registry, and its SHA-256 was timestamped into Bitcoin via OpenTimestamps on 1 September 2026 (three independent calendars accepted it, at zero cost). The registry and the timestamp are published at /data/evidence-hashes-2026-09-01.txt.gz. The hash is computed over the DECOMPRESSED file — the procedure is described in /data/evidence-hashes-README.txt. Backdating a screenshot is now impossible without rewriting Bitcoin.
2-ter. Records and checks are not the same thing. The figure above counts traversal records. Unique checks — distinct pairs of address and page type — number 95,492; repeat visits to an already-traversed page number 32 (0.03 %). The repeats are traces of the follow-up traversal: some addresses were walked again while the log was being completed. They do not affect the shares: thirty-odd records out of ninety-five thousand move no figure even in the first decimal place. This page previously said there were no repeats — true for the log of that day, and no longer true after the follow-up traversal. Found by a full reconciliation of every figure on the page, not by a spot check.
So the correct figure is this: for measurable pages — those that opened — a screenshot has been verified on disk in 87.1 % of cases (83,212 из 95,524). By verdict: "reachable by a person" — 99.6 %, "partial barrier" — 99.7 %, "formally accessible, but a barrier" — 89.6 %. For pages judged "unreachable or unmeasurable" a screenshot is missing in 43 % of cases, and that is not lost evidence but evidence that cannot exist: there is nothing to prove when a site does not answer.
This line used to hold a count of PATHS to files rather than of the files themselves, and it overstated the evidence base by 17 %. What stands here now is a verified number: every file was opened, its size and PNG signature checked.
Separately about 2,421 files under five kilobytes. Their sizes cluster implausibly tightly: 4,714 bytes — 1,566 files, 4,719 bytes — 808. Hashing showed that among the first six hundred files there are only ten unique images, and two of them cover 571 files. We opened them: a plain white rectangle. A normal screenshot weighs 158 kilobytes, thirty-three times more.
The cause is technical: the screenshot was taken before the page had painted — the browser had already reported the navigation complete while the content was not yet drawn. Such a file exists and opens, but proves nothing, and so it is not counted among the evidenced records. Capture has been fixed: the screenshot is now taken after text appears on the page, and the file size is checked immediately after saving.
3. A bot shield is not the same as inaccessibility. Sites that answered with a CAPTCHA or a browser check are marked "unmeasurable" and are not counted as bad. We do not know what is behind the shield.
4. Traversal assessment does not replace a live user. That is why every record carries a screenshot: the conclusion can be checked by eye.
5. Forty per cent of records are not measured — and that is the state of the sites, not a shortcoming of ours. Of 95,524 records, 38,379 (40.2 %) received the verdict 'unreachable or unmeasurable'. Almost all of these are sites that did not answer: the page failed to open with a network error in 14,535 cases (15.2 %) and with a server refusal in 14,310 (15.0 %) — 30.2 % together. We did not skip them: there was nothing to measure. Counting such a page as 'inaccessible to a person' would be a substitution: a human at the same address would see the same error, but that speaks about the site, not about its accessibility for people with disabilities. Such records are therefore kept as a separate verdict and are NOT included in the share of barriers.
6. One thousand two hundred and sixty-four records were made against addresses absent from the registry, and we say so ourselves. In places the traversal assembled the address from the city name instead of taking it from the official CISA list: houston.gov instead of houstontx.gov, garland.gov instead of garlandtx.gov, frisco.gov instead of friscotexas.gov. Such addresses do not answer, and the records received the verdict 'unmeasurable', inflating the share of the unreachable. We measured what this changes: the unmeasurable share is 41.5 % with them and 40.9 % without, the headline gap 53.4 % against 53.5 % — a shift of four hundredths of a point. Twelve hundred records dissolve in ninety-one thousand. We state this not because it damages the conclusion, but because the resilience of the number to such a cleanup is an argument in its favour.
7. The registry we follow is itself incomplete — and we say that ourselves too. Of 91,129 records, 1,272 were made against addresses absent from the CISA registry. We split them into two distinct cases, because merging them would be dishonest. The first is our own error: 1,264 records across 78 addresses the traversal assembled from the city name instead of the official list, where the same city does exist in the registry under a different address. The second is eight records for a single address, bellevueohio.gov: the site answers, yet the city of Bellevue, Ohio, is not in the registry at all. So the official list omits working municipal sites. Eight records out of ninety-one thousand change nothing in the figures, but they say something that matters: where the registry is silent, the traversal still sees.
8. One address in seven from the registry does not exist, and this affects the figure above. A fresh DNS check: of 11,902 domains in the log, 1,498 (12.6 %) do not resolve at all — there is no site, and there is nothing to measure. They account for 11,982 records. Of those, 9,125 (9.6 % of the log) carry the verdict "unmeasurable or unavailable" rather than "domain does not exist" — meaning the unmeasurable share mixes two different things: a site a human could not traverse, and a site that is not there. The first speaks to the quality of government websites, the second to the quality of the federal registry. We state this plainly because correcting it would move the headline figure IN OUR FAVOUR: without dead domains the share of barriers rises. The figures on this page are given WITHOUT that correction. Separately: 3 records carry the verdict "accessible" while the domain no longer answers today — a human opened that page, so the site died after the traversal.
Who this actually affects
Accessibility work is usually described as helping people with disabilities. By the numbers, that description is incomplete.
About a million people in the US are blind and about seven million have vision loss. 128,000,000 have age-related farsightedness. More than 80 % of people develop it by the age of forty: it is not a disease and not a disability, it is what happens to everyone. By 2030 the rate of vision loss in the US will double along with the ageing population.
It is not only about eyesight. With age the hand obeys less well — a small button becomes hard to hit. Reaction slows — forms with timeouts shut older people out first. Memory weakens — multi-step forms become impassable. Everything this study tests — target size, contrast, field labels, keyboard operation — fails first not for a blind person, but for an ordinary sixty-year-old.
The numbers in this section are external, not ours: NIH StatPearls, BCLA CLEAR, American Foundation for the Blind. Our own measurements are given above and marked separately.
Disclosure
The author provides services remediating accessibility violations. This research is self-funded. Nobody paid to be included in the sample and nobody paid to be left out of it. The conclusions name platforms and vendors rather than individual towns: a municipality buys a ready solution and is not responsible for a defect in the template.
Data versions
How many times this was re-checked and what changed. Rows marked "in progress" are re-checks not yet released as separate files. Their counts are shown deliberately: staying silent about them reads as "measured once and left at that".
| Date | What was done | Records |
|---|---|---|
| 2026-08-26 | First independent re-check: Antigravity swept the registry domains on its own. 15,045 records. in progress | 15 045 |
| 2026-08-30 | Published: domains with no DNS record — listed in the federal CISA registry, yet nonexistent. published | 1 209 |
| 2026-08-31 | List extended after sweeping the remaining states: +442 domains. published | 1 651 |
| 2026-09-01 | The count went DOWN by 152: domains we had called dead answered on re-check with a real browser trying four addresses each. We corrected ourselves rather than trimming the data. published | 1 499 |
| 2026-09-01 | Raw keyboard-traversal log published: 95,524 records across 11,902 domains. The federal CISA registry sweep is complete — all 11,659 sites. published | 95 524 |
| 2026-09-01 | Full manual review of the log: every record checked by a human. Results merged into the log; never published as a separate version. in progress | 95 524 |
| 2026-09-01 | Integrity registry: SHA-256 of every screenshot. Its own hash was timestamped into Bitcoin via OpenTimestamps the same day, block 965040. published | 81 657 |
| 2026-09-03 | Integrity registry extended by 28,442 records: screenshots from repeat passes brought under proof. published | 110 099 |
| 2026-09-05 | Re-traversal of 84,265 objects after a slow-disk failure: some earlier records were measurement artefacts, not properties of the sites. published · download file | 84 265 |
| 2026-09-06 | All 3,593 records marked "closed" were checked live across 473 domains: 99.78% of sites exist, 17.48% served a real page, the rest are WAF stubs. The "closed" verdict held for exactly one domain. published · download file | 3 593 |
| 2026-09-06 | Refinement of 7,076 records against screenshots: each verdict checked against what the picture shows, not only the response code. published · download file | 7 076 |
| 2026-09-06 | Live re-check of 4,877 records marked "404": some addresses answer when tried with www or over http. published · download file | 4 877 |
| 2026-09-07 | A new sweep is running: US commercial sites, 156,255 domains queued. 21,258 done — 13.6%. 142,409 WCAG 2.1 AA violations found so far. Publication follows completion: releasing an unfinished sample invites a fair charge of cherry-picking. in progress | 21 258 |
Full methodology — aifa.works/research/methodology
Found an error in the data — write to us: contact@codeofdigitaleternity.com
The automated checking tool used for the first half of this work is open and runs without registration: aifa.works/accessibility