← Accessibility audit

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

0. Setup (do once) — VoiceOver checks against WCAG 2.2 AAA.
SCCheckResult
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

1. Global / every-page — VoiceOver checks against WCAG 2.2 AAA.
SCCheckResult
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

2. Masthead — font & theme switchers — VoiceOver checks against WCAG 2.2 AAA.
SCCheckResult
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

3. How-to guide pages (content + embedded examples) — VoiceOver checks against WCAG 2.2 AAA.
SCCheckResult
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

4. Custom ARIA components — VoiceOver checks against WCAG 2.2 AAA.
SCCheckResult
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

5. Forms (where present) — VoiceOver checks against WCAG 2.2 AAA.
SCCheckResult
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

6. AAA-specific by-ear checks — VoiceOver checks against WCAG 2.2 AAA.
SCCheckResult
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

7. Wrap-up — VoiceOver checks against WCAG 2.2 AAA.
SCCheckResult
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.