The Landmark Layer: 308 Accessible Names on 56 Pages, and Every Form Control Arrives After the Bundle Boots
I work on OnePassApps, so this is our own site and our own build. Every number below was measured today on app.onepassapps.com: the served documents read with plain curl from one server (no session, no cookies, no JavaSc
I work on OnePassApps, so this is our own site and our own build. Every number below was measured today on app.onepassapps.com: the served documents read with plain curl from one server (no session, no cookies, no JavaScript), and four pages opened in a real Chrome on our own box and left to settle for nine seconds, so the numbers after the bundle boots are numbers a browser saw.
We have written about the bytes we send, the scripts we ship, the tags in our head and the ids in our JSON-LD. This one is about the layer that names things: the landmarks and accessible names across 56 pages.
What I measured
- The 56 URLs in https://app.onepassapps.com/sitemap.xml, fetched one by one with plain curl.
- Each document parsed tag by tag for form controls, labels, roles and accessible names.
- Four pages opened in a real browser on our own server and read after the app had booted.
The served document has no controls at all
Across all 56 pages, the HTML the server sends contains:
- 0 form elements
- 0 inputs, 0 selects, 0 textareas
- 0 buttons
- 0 label elements, and 0 labels with a for attribute
- 0 details elements, 0 noscript elements
Not one page ships an interactive control in its HTML. Every field, every button and every radio group on the pages I opened exists only after the React bundle boots. A crawler that never runs JavaScript sees text and links, and nothing you can press.
What is there instead: 308 names
The served documents carry 158 aria-label attributes and 150 aria-labelledby attributes - 308 accessible names in total, and that is the whole vocabulary of the pre-JavaScript document.
By tag, the names sit on:
- nav: 125
- div: 33
- section: 150 (the aria-labelledby ones)
And there are only 7 distinct strings behind all of them:
| Name | Pages that carry it |
|---|---|
| Public information | 33 |
| Loading OnePassApps | 33 |
| Site navigation | 23 |
| Breadcrumb | 23 |
| Legal and help | 23 |
| On this page | 22 |
| Terms sections | 1 |
Two families of pages sit under those numbers. 33 pages carry the startup shell - a div with role="status", aria-live="polite", aria-label="Loading OnePassApps" and aria-busy="true" - and a second name, Public information, on a nav element. The terms page adds one more of its own, Terms sections. The other 23 pages carry the guide chrome instead: Site navigation, Breadcrumb and Legal and help, plus On this page on 22 of them.
1,058 links, and no page without one
- 1,058 anchors across the 56 served pages
- the guide pages carry 598 of them
- the app and studio pages carry 312
- the remaining pages carry 148
- every page carries at least one link
A guide page opens with a jump link to its own content - the first anchor on /guides/newsflow is #guide-content - then the breadcrumb, then its own section links, #features, #steps and #limits on that page. The footer is not the same everywhere. All 56 pages carry Terms of use, Privacy, Refunds and cancellation, Plans and pricing and App guides; 33 of them also carry All apps and Support, and the other 23 - the guides index and the guide pages - carry five links instead of seven.
After the bundle boots, the controls arrive
Here is the same four pages in a real browser, nine seconds after load:
| Page | Buttons | Text fields | Labels | Anchors | Names |
|---|---|---|---|---|---|
| /guides/newsflow | 0 | 0 | 0 | 22 | 4 |
| /studios/files | 15 | 8 | 0 | 12 | 25 |
| /apps/movie-tracker | 144 | 1 | 0 | 13 | 191 |
| /sign-up | 55 | 6 | 1 | 51 | 129 |
The guide page is the odd one out: it paints no buttons and no fields at all. The other three are the opposite - the movie tracker alone paints 144 buttons, and the sign-up page paints 55.
The names are the interesting part. The file studio's radio group and its file picker are 8 controls with no accessible name at all - 7 radio, 1 file - and the page's names come from its buttons instead. The sign-up page has exactly 1 label element, and it belongs to the one textarea on the page; its 4 radio buttons are named by nothing, while its search field is named "Find an app".
Limits
One build on 8 November 2026, signed out, one network, plain curl for the served documents and one browser on our own server for the four rendered pages, nine seconds to settle. I did not test a screen reader, a keyboard-only pass, a phone-sized viewport, or any build other than today's. The counts above are what one measurement saw.
If you want to look at the same layer yourself, the home page and the guides are linked below.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.