axiom-accessibility — Claude Code skill: Apple accessibility audits
A skill for fixing and auditing accessibility in Apple apps: VoiceOver, Dynamic Type, contrast, touch targets, WCAG.
npx skills add CharlesWiltgen/Axiom --skill axiom-accessibility -a claude-codeWhat axiom-accessibility does
The skill kicks in whenever you touch accessibility in an Apple-platform app. It routes by symptom: VoiceOver labels and hints, Dynamic Type scaling, contrast failures, touch targets under 44x44pt, keyboard navigation, Reduce Motion, Assistive Access. A separate branch covers UX flow — dead-end views, dismiss traps, buried CTAs, missing loading and error states. watchOS gets its own file for the Digital Crown rotor, AssistiveTouch and Double Tap.
Under the hood it is a router: a symptom table plus a decision tree pointing at skills/accessibility-diag.md, skills/ux-flow-audit.md or skills/watchos-a11y.md. Automated scanning lives in separate auditors. axiom-audit-accessibility checks labels, Dynamic Type, contrast and WCAG; axiom-audit-ux-flow hunts dead ends and missing states. In Codex those auditors are invoked as skills rather than Claude agents. Anything that shells out — builds, tests, simulators — needs shell access to run.
Install it before the UI is finished. VoiceOver labels bolted on at the end cost more work, and until they exist you cannot claim VoiceOver support. Contrast is not something you eyeball either; WCAG ratios need measurement, and that is what the diagnostic leans on.
What it helps with
- label UI elements for VoiceOver and add hints
- catch Dynamic Type scaling violations
- measure contrast against WCAG AA and AAA
- grow touch targets to 44x44pt
- find dead-end views and dismiss traps in a flow
Example prompts for the agent
- audit the settings screen for VoiceOver labels and reading order
- why does Dynamic Type break on my cards — run the diagnostic
- run axiom-audit-accessibility across the project and list contrast failures
How to install axiom-accessibility
1Skills CLI (Vercel)
npx skills add CharlesWiltgen/Axiom --skill axiom-accessibility -a claude-code2Manually: put the files in place
~/.claude/skills/axiom-accessibility/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/axiom-accessibility/
1Skills CLI (Vercel)
npx skills add CharlesWiltgen/Axiom --skill axiom-accessibility -a codex2Manually: put the files in place
.agents/skills/axiom-accessibility/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add CharlesWiltgen/Axiom --skill axiom-accessibility -a cursor2Manually: put the files in place
.cursor/skills/axiom-accessibility/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install CharlesWiltgen/Axiom axiom-accessibility2Manually: put the files in place
.github/skills/axiom-accessibility/SKILL.md1Skills CLI (Vercel)
npx skills add CharlesWiltgen/Axiom --skill axiom-accessibility -a gemini-cli2Platform CLI
gemini skills install https://github.com/CharlesWiltgen/Axiom --path axiom-codex/skills/axiom-accessibilityManually: put the files in place
.devin/skills/axiom-accessibility/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add CharlesWiltgen/Axiom --skill axiom-accessibility -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about axiom-accessibility
How do I install axiom-accessibility in Claude?
Run npx skills add CharlesWiltgen/Axiom --skill axiom-accessibility -a claude-code. The skill then sits at ~/.claude/skills/axiom-accessibility/SKILL.md.
What does axiom-accessibility do?
It handles accessibility work in Apple apps: VoiceOver, Dynamic Type, contrast, touch target sizes, keyboard navigation, WCAG. Some checks are delegated to the axiom-audit-accessibility and axiom-audit-ux-flow auditors.
How is it different from a plain accessibility scan?
The skill routes a symptom to the right diagnostic file, while the auditors produce an automated scan. Checks involving builds, tests or simulators need shell access.
Source text
SKILL.md · MIT
---
name: axiom-accessibility
description: Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance, App Store accessibility review.
license: MIT
---
# Accessibility
**You MUST use this skill for ANY accessibility work including VoiceOver, Dynamic Type, color contrast, WCAG compliance, and UX flow auditing.**
<!-- AXIOM_AUDITOR_INLINE_BEGIN — rewritten for Codex by scripts/build-codex.ts; do not hand-edit -->
> **Auditors are skills here.** Where this router says "Launch `some-auditor` agent", invoke the
> matching Codex skill instead — same procedure, no Claude Code agent required.
>
> Available: `axiom-audit-accessibility`, `axiom-audit-concurrency`, `axiom-audit-swiftdata`, `axiom-audit-swiftui-nav`, `axiom-audit-ux-flow`.
>
> The ones that shell out — builds, tests, simulators, crash symbolication — need shell access to run.
<!-- AXIOM_AUDITOR_INLINE_END -->
## Quick Reference
| Symptom / Task | Reference |
|----------------|-----------|
| VoiceOver labels, hints, navigation | See `skills/accessibility-diag.md` |
| Dynamic Type scaling violations | See `skills/accessibility-diag.md` |
| Dynamic Type on tvOS (Large Text, tvOS 27) | See `skills/accessibility-diag.md` |
| Long-form reading apps (continuous reading, Speak Screen, text navigation) | See `skills/accessibility-diag.md` |
| Captions & subtitle styling in video players (generated subtitles, style preview) | See `skills/accessibility-diag.md` |
| Custom control technique choice (adjustable, passthrough, direct touch) | See `skills/accessibility-diag.md` |
| Accessibility Nutrition Labels | See `skills/accessibility-diag.md` |
| Color contrast (WCAG AA/AAA) | See `skills/accessibility-diag.md` |
| Touch target sizes (< 44x44pt) | See `skills/accessibility-diag.md` |
| Keyboard navigation (iPadOS/macOS) | See `skills/accessibility-diag.md` |
| Button Shapes, Large Content Viewer, Full Keyboard Access, Switch Control | See `skills/accessibility-diag.md` |
| VoiceOver order broken after resize / column collapse; table & grid semantics | See `skills/accessibility-diag.md` |
| Reduce Motion support | See `skills/accessibility-diag.md` |
| Assistive Access (cognitive, iOS 17+) | See `skills/accessibility-diag.md` |
| Accessibility Inspector workflows | See `skills/accessibility-diag.md` |
| UX dead ends, dismiss traps | See `skills/ux-flow-audit.md` |
| Buried CTAs, missing empty states | See `skills/ux-flow-audit.md` |
| Missing loading/error states | See `skills/ux-flow-audit.md` |
| Deep link dead ends | See `skills/ux-flow-audit.md` |
| Accessibility dead ends (gesture-only) | See `skills/ux-flow-audit.md` |
| watchOS-specific (VoiceOver rotor on Digital Crown, AssistiveTouch, Double Tap) | See `skills/watchos-a11y.md` |
## Cross-Suite Routes
- Full watchOS development context → See axiom-watchos
- Live accessibility validation on the simulator (set toggles, assert announcements) → `simulator-tester` agent + `xcui` — see axiom-tools (skills/xcui-ref.md)
- Asserting VoiceOver speech in an XCUITest (`XCUIDevice.shared.voiceOverService`, `OS27`) → axiom-testing (skills/ui-testing.md Pattern 7)
## Decision Tree
```dot
digraph accessibility {
start [label="Accessibility issue" shape=ellipse];
what [label="What type?" shape=diamond];
start -> what;
what -> "skills/accessibility-diag.md" [label="VoiceOver/labels/hints"];
what -> "skills/accessibility-diag.md" [label="Dynamic Type"];
what -> "skills/accessibility-diag.md" [label="color contrast"];
what -> "skills/accessibility-diag.md" [label="touch targets"];
what -> "skills/accessibility-diag.md" [label="keyboard nav"];
what -> "skills/accessibility-diag.md" [label="resizable window / desktop-class"];
what -> "skills/accessibility-diag.md" [label="Reduce Motion"];
what -> "skills/accessibility-diag.md" [label="Assistive Access"];
what -> "skills/accessibility-diag.md" [label="custom control techniques"];
what -> "skills/accessibility-diag.md" [label="continuous reading / text navigation"];
what -> "skills/accessibility-diag.md" [label="captions / subtitle styling"];
what -> "skills/accessibility-diag.md" [label="App Store prep / Nutrition Labels"];
what -> "skills/ux-flow-audit.md" [label="UX dead end/dismiss trap"];
what -> "skills/ux-flow-audit.md" [label="missing states"];
what -> "skills/watchos-a11y.md" [label="watchOS VoiceOver / AssistiveTouch / Double Tap"];
what -> "accessibility-auditor" [label="automated scan" shape=box];
}
```
1. ANY VoiceOver, Dynamic Type (including tvOS Large Text), contrast, touch target, or WCAG issue → `skills/accessibility-diag.md`
2. Assistive Access (cognitive disabilities, iOS 17+) → `skills/accessibility-diag.md`
3. Accessibility Nutrition Labels, or an App Review note about accessibility → `skills/accessibility-diag.md`
4. Reading app: VoiceOver stops at paragraphs/pages, Speak Screen halts → `skills/accessibility-diag.md`
5. UX dead ends, dismiss traps, buried CTAs, missing states → `skills/ux-flow-audit.md`
6. watchOS-specific accessibility (rotor on Digital Crown, AssistiveTouch, Double Tap) → `skills/watchos-a11y.md`
7. Want automated accessibility scan? → `accessibility-auditor` agent or `axiom-audit-accessibility`
## Automated Scanning
**Accessibility audit** → `axiom-audit-accessibility`
- VoiceOver labels and hints
- Dynamic Type violations
- Color contrast failures
- WCAG compliance scanning
**UX flow audit** → `axiom-audit-ux-flow`
- Dead-end views, dismiss traps
- Buried CTAs, missing empty/loading/error states
- Deep link dead ends, accessibility dead ends
## Critical Patterns
#### Image Accessibility
- Use `Image(decorative: "photo")` for purely decorative images — automatically hidden from VoiceOver (equivalent to `accessibilityHidden(true)` but semantically clearer)
- Use `accessibilityInputLabels()` for buttons with complex or changing labels — improves Voice Control accuracy by providing alternative labels
- Respect `accessibilityDifferentiateWithoutColor` environment value — when active, provide non-color cues (icons, patterns, labels) alongside color indicators
## Anti-Rationalization
| Thought | Reality |
|---------|---------|
| "I'll add VoiceOver labels when I'm done building" | Accessibility is foundational, not polish. Retrofitting labels across a finished app takes far longer, and until they're done VoiceOver support can't be declared. |
| "My app doesn't need accessibility" | All apps need accessibility. It isn't an App Store rule, but people who rely on VoiceOver or Larger Text can't use the app without it, and its Accessibility Nutrition Labels show that before they download. |
| "Dynamic Type just needs .scaledFont" | Dynamic Type has 7 common violations. accessibility-diag catches them all. |
| "Color contrast looks fine to me" | Visual assessment is unreliable. WCAG ratios require measurement. accessibility-diag validates. |
| "UX issues are just polish" | UX dead ends cause 1-star reviews. They're defects, not enhancements. |
| "The dismiss gesture handles it" | fullScreenCover has no dismiss gesture. That's the trap. |
## Example Invocations
User: "My button isn't being read by VoiceOver"
→ See `skills/accessibility-diag.md`
User: "How do I support Dynamic Type?"
→ See `skills/accessibility-diag.md`
User: "Check my app for accessibility issues"
→ See `skills/accessibility-diag.md`
User: "Prepare for App Store accessibility review"
→ See `skills/accessibility-diag.md`
User: "Scan my app for accessibility issues automatically"
→ `axiom-audit-accessibility`
User: "How do I support Assistive Access?"
→ See `skills/accessibility-diag.md`
User: "How do I prepare my tvOS app for Large Text?"
→ See `skills/accessibility-diag.md`
User: "VoiceOver reads my screen in the wrong order after the window resizes"
→ See `skills/accessibility-diag.md`
User: "How do I support Button Shapes / the Large Content Viewer in my custom controls?"
→ See `skills/accessibility-diag.md`
User: "VoiceOver stops reading at the end of each page in my book app"
→ See `skills/accessibility-diag.md`
User: "How do I let users restyle subtitles or get generated captions in my video player?"
→ See `skills/accessibility-diag.md`
User: "Check for UX dead ends and dismiss traps"
→ See `skills/ux-flow-audit.md`
User: "My fullScreenCover has no way to dismiss"
→ See `skills/ux-flow-audit.md`
User: "Are there missing empty states in my app?"
→ See `skills/ux-flow-audit.md`
© CharlesWiltgen · MIT · CharlesWiltgen/Axiom