From ios-dev-toolkit
Run technical quality checks on iOS/SwiftUI code across accessibility, performance, HIG compliance, theming, and anti-patterns. Generates a scored report with P0-P3 severity ratings and an actionable fix plan. Use this skill whenever the user wants an accessibility check, performance audit, HIG compliance review, Dark Mode verification, Dynamic Type audit, or technical quality review of iOS code. Also use when preparing an iOS app for App Store submission, TestFlight, or user testing — any request to verify iOS code quality should trigger this skill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ios-dev-toolkit:ios-auditThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are running a systematic technical quality audit on SwiftUI code. Don't fix issues — document
You are running a systematic technical quality audit on SwiftUI code. Don't fix issues — document them with precise locations, severity, and fix recommendations. This is a code-level audit, not a design critique.
Read every file in scope. Run comprehensive checks across 5 dimensions. Score each 0-4.
Check for:
VoiceOver:
.accessibilityLabel() (especially icon-only buttons).accessibilityElement(children: .combine).accessibilityHidden(true).accessibilityHint() on non-obvious interactions.accessibilityValue() on stateful controls.accessibilityAddTraits() (.isButton, .isSelected, etc.)Dynamic Type:
.system(size: N) instead of .font(.body) etc.)relativeTo: parameterViewThatFits).minimumScaleFactor() or layout adaptation)Contrast:
Motor:
.frame() on buttons, use .contentShape() to expand)onTapGesture instead of Button (loses accessibility, highlight state, keyboard support).accessibilityAction() alternativeReduce Motion:
@Environment(\.accessibilityReduceMotion)Score 0-4: 0=Inaccessible, 1=Major gaps (no VoiceOver labels, hard-coded fonts), 2=Partial effort, 3=Good (most covered, minor gaps), 4=Excellent (VoiceOver navigable, Dynamic Type to AX, contrast verified)
Check for:
View body complexity:
body properties with complex conditional logic (should extract subviews)body@State / @Observable granularity causing unnecessary re-rendersLists & scroll performance:
ForEach without stable id (causes identity churn)VStack instead of LazyVStack).scrollTargetLayout() for paging.resizable() + .aspectRatio() sizingAnimation performance:
.animation(_, value:) on parent views (broad invalidation)drawingGroup()Data & networking:
.task cancellation handlingMemory:
self strongly in long-lived contextsScore 0-4: 0=Severe (ANR risk, memory leaks), 1=Major (janky scroll, expensive body), 2=Partial, 3=Good (mostly optimized), 4=Excellent (lean, stable identity, lazy everywhere)
Check for:
Navigation:
NavigationStack + .navigationTitle + .toolbarNavigationView instead of NavigationStack (deprecated)Controls:
onTapGesture on elements that should be Button, NavigationLink, or Toggle.confirmationDialog or .alert for destructive actions.destructive roleLists:
.refreshable {} on server-backed lists.searchable() on lists with 10+ items.listRowSeparator().swipeActions where quick actions make senseVStack + ForEach + Divider instead of ListFeedback:
.sensoryFeedback()) on any interactionsContentUnavailableView)Layout:
UIScreen.main.bounds usage (deprecated, non-adaptive)GeometryReader where containerRelativeFrame() worksScore 0-4: 0=Ignores HIG, 1=Major violations (custom nav, no refreshable), 2=Partial, 3=Good (mostly compliant), 4=Excellent (feels like a first-party app)
Check for:
Colors:
Color.white, Color.gray, Color(red:green:blue:))Color("name") colors — verify each has Both Appearances in asset catalogColor(.label), Color(.systemBackground))Backgrounds:
.background(.white) or .background(Color.white) (breaks in dark mode)Images:
.foregroundStyle() (won't adapt)Testing:
Score 0-4: 0=Light mode only, 1=Many hard-coded colors, 2=Partial (some semantic), 3=Good (dark mode works, minor issues), 4=Excellent (all semantic, both modes polished)
Check for each and flag:
.easeInOut or .linear animations (should be springs)Color.gray usageonTapGesture where Button should beObservableObject / @Published / @StateObject (prefer @Observable)NavigationView (deprecated, use NavigationStack)foregroundColor() (deprecated, use foregroundStyle())cornerRadius() (deprecated, use clipShape(.rect(cornerRadius:)))try in non-critical pathsScore 0-4: 0=Web-app-in-native-wrapper (5+ tells), 1=Heavy web feel (3-4 tells), 2=Some tells (1-2), 3=Mostly clean, 4=Feels like a first-party Apple app
| # | Dimension | Score | Key Finding |
|---|---|---|---|
| 1 | Accessibility | ?/4 | |
| 2 | Performance | ?/4 | |
| 3 | HIG Compliance | ?/4 | |
| 4 | Theming & Dark Mode | ?/4 | |
| 5 | Anti-Patterns | ?/4 | |
| Total | ??/20 |
Rating bands: 18-20 Ship it, 14-17 Good (address weak areas), 10-13 Needs work, 6-9 Major overhaul, 0-5 Start over
Pass/fail on each anti-pattern check. Be blunt.
Tag every issue P0-P3:
For each:
/ios-polish, /ios-animate, /ios-critiqueRecurring problems that indicate patterns, not one-offs:
.accessibilityElement(children: .combine) on any card views"What's working well. Good practices to maintain.
Prioritized fix plan:
/skill-name — What to fix (context from findings)/skill-name — What to fixEnd with /ios-polish as the final step.
Re-run
/ios-auditafter fixes to see your score improve.
npx claudepluginhub elvinouyang/claude-skill-collection --plugin ios-dev-toolkitReviews SwiftUI and Swift code for modern APIs, best practices, performance, accessibility, data flow, navigation, and Clean Architecture.
Reviews SwiftUI code for best practices, modern APIs, maintainability, performance, accessibility, and Swift conventions. Use when reading, writing, or reviewing SwiftUI projects.
Reviews SwiftUI code for view composition, state management (@State, @Binding, @Observable), performance, and accessibility. Use for .swift files with SwiftUI views or UI code.