What a screen reader is actually offered: six Nostr clients, measured in the tree (2026-11-04)

What a screen reader is actually offered: six Nostr clients, measured in the tree (2026-11-04)

Automated scanners check rules. They cannot tell you that a page has zero headings, and therefore that “jump to next heading” — the most-used command in any screen reader — does nothing at all. That is what this measures: the accessibility tree, which is what assistive technology is offered, node by node, in order.

Method

  • headless Chrome 131, viewport 1366×900, logged out, 2026-11-04 17:50–18:40 UTC
  • Accessibility.getFullAXTree via CDP
  • counts: announced nodes (non-decorative roles), focusable controls (button, link, textbox, combobox, checkbox, switch, tab, menuitem, radio, slider, searchbox), how many of those have an empty accessible name, headings
  • script published free by the same author (axdump.mjs, thirty lines)

Results

client announced focusable unnamed unnamed % headings
easynostr 149 93 0 0% 22
nostrudel 24 13 0 0% 1
njump.me (profile) 54 49 0 0% 2
yakihonne 54 44 0 0% 1
nostr.com 379 348 0 0% 3
coracle.social 64 48 16 33% 1
primal.net 771 535 191 36% 0

The findings, in the order they cost a user

1. Zero headings (primal.net). Heading navigation is the primary gesture for moving through a page with a screen reader — it turns a feed into a table of contents. With none, the only route to a specific note is Tab, up to 535 times, hearing “button” and “link” with no idea which note they belong to. 191 of those 535 announce nothing but their role.

2. Repeated names are missing names in disguise (easynostr). 0 unnamed controls — and 91 of 93 focusable links are named exactly “Thread”. The list-of-links dialog, whose whole purpose is to compress the page into a scannable index, returns ninety-one identical entries. WCAG 2.4.4 is technically satisfied and the experience is not.

3. A tree can be clean and still be thin (nostrudel, 24 nodes). Twenty-four announced nodes for a feed means the notes themselves are not in the tree as identifiable items — nothing to navigate between. “0 unnamed” is not “well structured”.

4. Unnamed containers (coracle). 16 of 48 controls unnamed, including two text boxes — an unlabelled edit field is announced as “edit text” with no indication of what to type.

What this measure cannot see

The tree is what is offered, not what is announced. Live-region politeness, event ordering, interruption, focus restoration — invisible here, and on a real-time client those decide whether a blind person can use the timeline at all. One browser, one viewport, logged out. A floor, never a certificate, and never a substitute for a human with a screen reader: I am not one, and I have not listened to NVDA, JAWS or VoiceOver while writing any of this.

Why the comparison is worth more than any single score

easynostr — one person, plain HTML, no framework — scores 0 unnamed, 22 headings, 93 controls. primal.net — a funded team, a framework — scores 191 unnamed, 0 headings, 535 controls. The difference is not budget or care. It is whether the accessibility tree was designed, or discovered afterwards by a scanner.

Reproduction

node axdump.mjs 'https://primal.net'
node axdump.mjs 'https://2three1y.github.io/easynostr/'

Same tools, same numbers, same day, or the timestamps say which of us is looking at a stale page.


Prepared 2026-11-04 19:30Z. Measurements, not opinions; a floor, not a certificate.


Write a comment