VoiceOver AAA audit report
Manual screen-reader audit of https://a11yequitas.org against WCAG 2.2 AAA using VoiceOver on macOS + Safari.
Run · 2026-05-24 · All checks pass43/43 checks passed · 100% complete · VoiceOver + Safari (macOS) · WCAG 2.2 AAA
Why a manual VoiceOver passAutomated engines (axe-core, Alfa) catch most contrast, ARIA, and structural issues. A human VoiceOver pass catches what only a listener can hear: announcement quality, reading order intent, custom-widget state changes, and screen-off task completion. Each AAA criterion below was verified against a live walkthrough.
Raw reportDownload the full JSON: voiceover-2026-05-24.json
0. Setup (do once)
5/5 checks passed
| SC | Check | Result |
|---|---|---|
| — | Confirm core keys: VO = Control+Option, toggle ⌘F5, Rotor VO+U, Read-all VO+A, stop Control, next VO+→. | Pass |
| — | Set VoiceOver Utility → Verbosity → High for the audit (but don't design to High-only). | Pass |
| — | Test in Safari first, then spot-check Chrome — AT+browser combos differ. | Pass |
| — | Do at least one screen-off pass per page: complete the task by ear alone. | Pass |
| — | Decide record format: per-page notes (URL, criterion, pass / N-A reason / defect + repro). | Pass |
1. Global / every-page
9/9 checks passed
| SC | Check | Result |
|---|---|---|
| 2.4.1 | [2.4.1] Skip link: first Tab hits 'Skip to main content'; activating moves VO focus into #main. | Pass |
| 1.3.1 / 2.4.1 | [1.3.1 / 2.4.1] Landmark sweep (VO+U → Landmarks): banner, nav, main, contentinfo present and named; no duplicate unlabeled navs. | Pass |
| 1.3.1 / 2.4.10 | [1.3.1 / 2.4.10] Heading sweep (VO+U → Headings): one h1, no skipped levels, coherent outline by ear. | Pass |
| 2.4.4 / 2.4.9 | [2.4.4 / 2.4.9] Link sweep (VO+U → Links): every link makes sense out of context; no 'click here / read more'. | Pass |
| 1.1.1 | [1.1.1] Logo link announces a text name, not 'image' or a filename. | Pass |
| 1.3.2 | [1.3.2] Reading order: VO+A read-all flows logically, matching visual layout. | Pass |
| 2.4.7 / 2.4.13 | [2.4.7 / 2.4.13] VO cursor and visible focus indicator stay together; focus never lands on an empty/unlabeled element. | Pass |
| 3.1.1 / 3.1.2 | [3.1.1 / 3.1.2] Correct voice/pronunciation; html lang set; inline foreign phrases marked. | Pass |
| 2.1.2 | [2.1.2] No keyboard/focus trap: Tab and VO+→ through and back out of every region. | Pass |
2. Masthead — font & theme switchers
5/5 checks passed
| SC | Check | Result |
|---|---|---|
| 4.1.2 / 1.3.1 | [4.1.2 / 1.3.1] Font switcher (System/Lexend/Atkinson/OpenDyslexic): each announces name + role + current state; change is announced. | Pass |
| 4.1.2 | [4.1.2] Theme switcher (System/Light/Dark): name + role + selected state announced; selection updates state. | Pass |
| 1.3.1 | [1.3.1] State persists & is perceivable: after choosing OpenDyslexic and navigating back, VO still reports correct selection. | Pass |
| 2.1.1 | [2.1.1] Both switchers reachable and operable via VO+Space / arrows; no mouse-only behavior. | Pass |
| 1.4.12 | [1.4.12] OpenDyslexic is a visual-only change: VO output and reading order unaffected. | Pass |
3. How-to guide pages (content + embedded examples)
6/6 checks passed
| SC | Check | Result |
|---|---|---|
| 1.3.1 | [1.3.1] Tables page: navigate live table with VO table commands — row/column headers announced per cell, caption announced, scope correct. | Pass |
| 1.1.1 / 1.3.1 | [1.1.1 / 1.3.1] Charts page (Chart.js bar + doughnut): canvas is aria-hidden/labeled, sibling data table reachable; numbers available by ear. | Pass |
| 1.1.1 / 2.1.1 | [1.1.1 / 2.1.1] Charts page (OpenStreetMap WA/OR/CA): text/data equivalent of map content exists; map isn't a pile of image announcements. | Pass |
| 1.1.1 | [1.1.1] Images page: informative images announce useful description; decorative ones silent; complex SVGs have reachable text equivalent. | Pass |
| 1.2.x / 4.1.2 | [1.2.x / 4.1.2] Videos page: VO operates player controls (name+state); captions toggle announced; transcript present and readable. | Pass |
| 3.1.3 / 3.1.4 / 3.1.5 | [3.1.3 / 3.1.4 / 3.1.5] Plain-language by ear: prose holds at Grade 8; abbreviations (ARIA, WCAG, DOJ) expanded or have accessible expansion. | Pass |
4. Custom ARIA components
4/4 checks passed
| SC | Check | Result |
|---|---|---|
| 4.1.2 / 1.3.1 | [4.1.2 / 1.3.1] Accordion: headers announce as buttons with aria-expanded state; activation announces change; collapsed content not reachable. | Pass |
| 4.1.2 / 2.1.1 | [4.1.2 / 2.1.1] Tabs: tablist + tabs announce role + selected state; arrow keys move; panel associated. Test auto AND manual activation. | Pass |
| 4.1.2 / 2.1.1 / 2.1.2 | [4.1.2 / 2.1.1 / 2.1.2] Dropdown/combobox: native select announces value; custom combobox announces role/expanded/active option/selection; Escape returns focus audibly. | Pass |
| 4.1.3 | [4.1.3] Live regions: updates announced without moving focus, once, with correct politeness (status vs alert). | Pass |
5. Forms (where present)
4/4 checks passed
| SC | Check | Result |
|---|---|---|
| 1.3.1 / 3.3.2 | [1.3.1 / 3.3.2] Every field announces a programmatic label (not just placeholder); required state announced. | Pass |
| 3.3.1 / 3.3.3 | [3.3.1 / 3.3.3] Errors announced; VO can navigate to the field in error; error text associated, not just colored. | Pass |
| 3.3.5 / 2.2.6 | [3.3.5 / 2.2.6] AAA help available where claimed (3.3.5); any timeout warned (2.2.6). | Pass |
| 1.3.5 | [1.3.5] Autocomplete/purpose set so field purpose is programmatically determinable. | Pass |
6. AAA-specific by-ear checks
6/6 checks passed
| SC | Check | Result |
|---|---|---|
| 2.4.8 | [2.4.8] Location: breadcrumb or current-page indicator announced so a VO user knows where they are. | Pass |
| 2.4.12 / 2.4.13 | [2.4.12 / 2.4.13] Focus not obscured by sticky header/footer; focus indicator substantial (visual + VO-cursor correlation). | Pass |
| 1.4.6 / 1.4.8 | [1.4.6 / 1.4.8] Enhanced contrast holds across theme + font combos; check OpenDyslexic + dark theme. | Pass |
| 2.1.3 | [2.1.3] Everything operable by keyboard, including map and charts, or a documented accessible alternative. | Pass |
| 2.2.3 / 2.3.2 | [2.2.3 / 2.3.2] No timed content; no flashing in any chart animation. | Pass |
| 3.2.5 | [3.2.5] Font/theme switch and nav don't trigger unexpected context changes; nothing auto-navigates. | Pass |
7. Wrap-up
4/4 checks passed
| SC | Check | Result |
|---|---|---|
| — | Re-run screen-off task test end-to-end on the two most complex pages (charts page, one component demo). | Pass |
| — | For every AAA criterion you cannot meet, write the N/A rationale into the accessibility statement; match VPAT/ACR language. | Pass |
| — | Anything VoiceOver flagged that axe/Alfa/Insights passed → new Playwright assertion or permanent manual line-item. | Pass |
| — | Record browser/AT versions (Safari + VoiceOver build, macOS version). | Pass |
Methodology
Checklist source: VoiceOver AAA audit checklist. Each criterion was tested by ear with VoiceOver in Safari, with at least one screen-off task pass per page. Results were exported as JSON from the checklist tool.
