Open research data
Accessibility of US municipal websites · CC BY 4.0
This is the raw data behind every figure we publish. Any number can be recomputed independently, without access to our code. The files are served directly and are not protected in any way — that is what open data means.
How to cite
Maksim Galatin & AIfa (Claude, Anthropic). Municipal Website Accessibility: Automated Scan versus Keyboard Traversal. Open dataset, version of 1 September 2026. CC BY 4.0.
Licensed CC BY 4.0: use it however you like, including commercially, as long as you credit the authors.
What is in the dataset
| File | Contents | Size |
|---|---|---|
| traversal-log-2026-09-01.jsonl.gz | The main log. One line is one keyboard traversal of one page: URL, city, state, page type, how many Tab presses to the target, where the path broke and why, whether form fields carry labels, screenshot filename, verdict. | 3,2 МБ 95,524 lines |
| traversal-log-SCHEMA.md | Schema of the log: every field explained, which values are possible and how to read them. | 13 КБ |
| us-registry-cisa.jsonl.gz | The federal CISA registry as of 31 August 2026 — the source sample of US city and county domains. | 276 КБ 11,659 lines |
| measurement-dates.jsonl.gz | When exactly each screenshot was taken. As many lines as screenshots verified on disk. | 853 КБ 83,212 lines |
| evidence-hashes-2026-09-01.txt.gz | Integrity registry: SHA-256 of every evidence file. Its own hash is timestamped into Bitcoin via OpenTimestamps. | 2,7 МБ 81,065 lines |
| evidence-hashes-2026-09-01.timestamp.json | The timestamp proof: which calendars accepted the hash and when. | 2,7 КБ |
| solana-anchor-status.json | The honest status of on-chain anchoring: what is already done in Bitcoin and where the Solana record stands. | 2,3 КБ |
| dead-domains-2026-09-01.csv | Registry domains that did not answer. Reviewed by hand; this finding is not about accessibility but about the quality of government data. | 30 КБ 1,499 lines |
| unreachable-reasons.csv.gz | Reasons for unreachability, tabulated: DNS, TLS, timeout, connection refused and the rest. | 19 КБ 905 lines |
| tls-certificates.jsonl.gz | TLS certificate state for the traversed domains. | 483 КБ 8,979 lines |
| entity-classification.jsonl.gz | Entity classification: city, county, other type. | 173 КБ 11,997 lines |
| recaptured-screenshots.jsonl.gz | Screenshots re-captured later, stating which one was replaced and when. Previous versions are not deleted. | 14 КБ 757 lines |
Change log
What changed in the dataset and why. Counts were taken by opening the files, not by reading their names. Twice the record count went DOWN — that is a correction against our own interest, not a trim, and each case is explained.
| Date | File | Contents | Change |
|---|---|---|---|
| 2026-08-30 | dead-domains-2026-08-30.csv | First release of the list of domains with no DNS record — present in the federal CISA registry, yet nonexistent. | 1,209 lines |
| 2026-08-31 | dead-domains-2026-08-31.csv | List extended after sweeping the remaining states. | 1,651 lines +442 |
| 2026-09-01 | dead-domains-2026-09-01.csv | The count went DOWN, and the correction is against our own interest: 152 domains we had called dead answered on re-check with a real browser trying four addresses per domain. We corrected ourselves rather than trimming the data. | 1,499 lines −152 |
| 2026-09-01 | traversal-log-2026-09-01.jsonl.gz | The main keyboard-traversal log: 95,524 records across 11,902 domains. The sweep of the federal CISA registry is complete — all 11,659 sites covered. | 95,524 lines |
| 2026-09-01 | evidence-hashes-2026-09-01.txt.gz | Integrity registry: SHA-256 of every screenshot. The same day its own hash was timestamped into Bitcoin via OpenTimestamps — backdating a screenshot now means rewriting Bitcoin. | 81,657 lines |
| 2026-09-03 | evidence-hashes-2026-09-03.txt.gz | Integrity registry extended by 28,442 records: screenshots from repeat passes brought under proof. | 110,099 lines +28,442 |
Format
Files ending in .jsonl.gz are line-delimited JSON compressed with gzip: one line, one object. Any archiver decompresses them, and any program can read them line by line without loading the whole file into memory. A browser cannot display such a file, so it saves it to disk instead — that is normal behaviour for an archive, not an error.
Fields of the main log
| url | URL of the page checked |
| город / штат | city and state of the site owner |
| страница_тип | which page it is: home, payment, jobs, documents, meetings, 311_request and so on |
| шагов_до_цели | how many Tab presses it took to reach the target; 0 means the target was not reached |
| где_оборвалось | the element where the path broke |
| причина | in words: page did not open, target not reached in 40 presses, success in N steps |
| есть_метки_у_полей | whether form fields carry labels for a screen reader |
| контраст_ок | whether text passes the contrast requirement |
| скриншот | filename of the screenshot taken at the moment of measurement |
| вердикт_человека | the human verdict: accessible, partial barrier, barrier, unreachable and so on |
| что_сказал_скрипт | what the automated check said about the same page |
| вендор_платформы | the platform the site runs on, where it could be identified |
| когда_замер | time of measurement |
How to be sure the data was not swapped
Every evidence file has a SHA-256; all hashes are collected into one registry, and the registry hash is timestamped into Bitcoin via OpenTimestamps — free of charge, accepted by three independent calendars. Backdating a screenshot is now impossible without rewriting Bitcoin. The verification procedure is described in evidence-hashes-README.txt.
Careful with the shares
The study reports three different shares, each with its own denominator. First: among pages the automated check called clean, 53.8 % did not reach the goal — denominator 25,966. Second: among ALL measurable pages, 74.6 % of 47,271 did not reach it. Third: of all 95,524 log records, 12.6 % reached the goal. None of the three means "X % of sites are inaccessible" — these are shares of pages, not sites.