skills/ios/accessibility-audit/SKILL.md
Run a structured accessibility audit on an iOS/macOS app — automated XCUITest audits, Accessibility Inspector, manual VoiceOver/Dynamic Type passes, and App Store Accessibility Nutrition Label evaluation. Use before release, when preparing Nutrition Label declarations, or for EU Accessibility Act compliance.
npx skillsauth add rshankras/claude-code-apple-skills accessibility-auditInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A repeatable audit workflow that takes an app from "we think it's accessible" to evidence: automated audits in CI, an Inspector pass, manual assistive-tech passes, and an Accessibility Nutrition Label evaluation you can defend. Distilled from Apple's WWDC23 "Perform accessibility audits" (10035), WWDC19 "Accessibility Inspector" (257), WWDC25 "Evaluate your app for Accessibility Nutrition Labels" (224), and the 2026 Tech Talk "Prepare your app for Accessibility Nutrition Labels" (111433).
Why it matters: Accessibility Nutrition Labels on the App Store make your support (or its absence) visible before download.
performAccessibilityAudit, Accessibility Inspector, or automated a11y testingrelease-review)List the primary tasks people download the app for, plus the fundamentals: first-launch experience, login, purchase, settings. Every subsequent pass evaluates these tasks, on every device family the app supports.
try app.performAccessibilityAudit() audits the current view exactly as the Inspector does; the test fails automatically on findings. Full API, audit-type table, issue filtering, and CI patterns: automated-audits.md. Baseline rules:
continueAfterFailure = true before the audit to surface all issues in one run.Xcode → Open Developer Tool → Accessibility Inspector, target the app:
Classic findings and fixes: filename-as-label (give a real accessibilityLabel; move technical IDs to accessibilityIdentifier), text drawn via CATextLayer invisible to VoiceOver (isAccessibilityElement = true + label), contrast below threshold (Inspector flags pairs; fix with darker/lighter variants until it passes).
| Pass | How | Pass criterion |
|---|---|---|
| VoiceOver | Swipe right through every element; double-tap to activate; complete each common task eyes-free | Every element speaks label + trait + value; task completable with gestures only |
| Voice Control | Complete tasks by voice only | Every interactive element has a speakable label (accessibilityInputLabels for synonyms) |
| Dynamic Type | Test at 200% and at the largest accessibility size (310%) | Text wraps (never truncates), fields grow, layout adapts |
| Sufficient Contrast | Light + dark appearance, with Increase Contrast on | Legible everywhere |
| Dark Interface | Dark mode + Smart Invert | Photos/video NOT inverted (accessibilityIgnoresInvertColors) |
| Reduced Motion | Reduce Motion on | Zoom/slide transitions, autoplay, parallax replaced (modified, not just removed) |
| Keyboard (Mac / iPad FKA) | Complete tasks keyboard-only | Focus reaches everything; no hover-only affordances |
Map the evidence from passes 2–4 onto the nine App Store features and declare only what holds for all common tasks on all supported device families. Per-feature criteria, disqualifier examples, and the declaration flow: nutrition-labels.md. The model behavior (Apple's own demo): find bugs at 235%/310% text size → fix first, claim after.
Report findings as:
For each finding: the screen/task, the failing feature category, the fix (API-level), and which audit pass detects the regression.
generators/accessibility-generator — implementation patterns (labels, Dynamic Type, custom actions, rotors) to fix what the audit findsmacos/ui-review-tahoe/accessibility.md — Mac-specific VoiceOver/keyboard depthios/assistive-access — the separate Assistive Access experience (cognitive disabilities)design/typography — Dynamic Type design rulesrelease-review — this audit slots into the pre-release gatedevelopment
US web checkout via the StoreKit External Purchase Link entitlement — currently 0% Apple commission (litigation ongoing), how to ship it safely, and how to architect for a commission flip so a future ruling is a config change, not a rewrite. Use when adding external purchase links, weighing web checkout vs IAP, or planning US-storefront pricing strategy.
tools
Revenue beyond the single-app price tag — own-app bundles, Family Sharing as a conversion lever, cross-developer bundles & suites, and institutional licensing via Group Purchases / Apple School & Business Manager. Use when a developer has multiple apps, a subscription worth sharing, complementary indie partners, or school/clinic/business buyers.
tools
Stage-by-stage audit of an app's App Store growth machinery against a 54-item P0–P9 playbook — every item scored from an App Store Connect MCP call, a codebase check, or an explicit question to the user, then routed to the skill or command that fixes it. Read-only on App Store Connect. Use for a growth audit or scorecard, a pre-launch growth plan, a quarterly re-audit, or "which growth levers am I missing."
development
Performance profiling and SwiftUI debugging skills — Instruments guidance, hangs, memory issues, slow launches, energy drain, unnecessary re-renders, and view identity problems. Use when an app is slow, janky, or resource-hungry.