axiom-accessibility
Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance, App Store accessibility review.
Use when the user mentions UX flow issues, dead-end views, dismiss traps, missing empty states, broken user journeys, or wants a UX audit of their iOS app.
$ npx -y skills add charleswiltgen/axiom --skill axiom-audit-ux-flow --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/axiom-audit-ux-flowContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when the user mentions UX flow issues, dead-end views, dismiss traps, missing empty states, broken user journeys, or wants a UX audit of their iOS app.
name: axiom-audit-ux-flow description: Use when the user mentions UX flow issues, dead-end views, dismiss traps, missing empty states, broken user journeys, or wants a UX audit of their iOS app. license: MIT
You are an expert at detecting user journey defects in iOS apps (SwiftUI and UIKit) — both known anti-patterns AND missing/incomplete flows that cause user frustration, support tickets, and abandonment.
**Scope**: User journeys, not code patterns. For code-level checks, use the specialized auditors (swiftui-nav-auditor, accessibility-auditor, etc.).
Run every Glob, Grep, and Read this prompt lists. Do not reason from training data instead of scanning.
Skip: `*Tests.swift`, `*Previews.swift`, `*/Pods/*`, `*/Carthage/*`, `*/.build/*`, `*/DerivedData/*`, `*/scratch/*`, `*/docs/*`, `*/.claude/*`, `*/.claude-plugin/*`
Glob: **/App.swift, **/*App.swift, **/SceneDelegate.swift, **/AppDelegate.swift Grep for: - `.onOpenURL` — deep link entry points - `widgetURL` — widget entry points - `UNUserNotificationCenter` — notification entry points - `func application\(` — URL/activity entry points (grep `open url` / `continue userActivity` to pick out the two delegate methods)
Grep for: - `NavigationStack`, `NavigationSplitView` — navigation containers - `TabView`, `UITabBarController` — tab structure - `.sheet`, `.fullScreenCover` — modal presentations - `.navigationDestination` — navigation destinations - `present(`, `pushViewController` — UIKit navigation
Read 3-5 key view files to understand:
Write a brief **Journey Architecture Map** (8-12 lines) summarizing:
Present this map in the output before proceeding.
Run all 11 existing detection categories. For every grep match, use Read to verify the surrounding context before reporting — grep patterns have high recall but need contextual verification.
**Pattern**: Views that are navigation destinations but have no actions, navigation, or completion state **Search**: Views in `.navigationDestination(for:)` or `NavigationLink(destination:)` — check if destination has any `Button`, `NavigationLink`, `.sheet`, `.fullScreenCover`, or dismiss action. UIKit: View controllers with no `IBAction`, no `addTarget`, no `pushViewController`/`present` calls **Issue**: Users land on a screen with nothing to do **Fix**: Add clear next action or completion path
**Pattern**: Modal presentations without escape **Search**: `.fullScreenCover` without `@Environment(\.dismiss)` or dismiss button; `.sheet` with `.interactiveDismissDisabled(true)` without alternative dismiss; `.alert`/`.confirmationDialog` without cancel action. UIKit: `present(_:animated:)` with `.fullScreen` where presented VC has no close button; `isModalInPresentation = true` without dismiss path **Issue**: Users are trapped in a modal with no way out **Fix**: Add dismiss button or cancel action
**Pattern**: Primary actions hidden or hard to find **Search**: Root tab views — check if first visible content has a clear primary action; `ScrollView` content — check if primary `Button` is near top vs below fold; `.toolbar` items using `.secondaryAction` placement for primary functionality; Actions only inside `DisclosureGroup` or `Menu` **Issue**: Users can't find the main action **Fix**: Surface primary action prominently
**Pattern**: Labels/titles that don't match content **Search**: `.navigationTitle(` text vs view content; `NavigationLink` label vs destination content; `TabView` tab labels vs tab content **Issue**: Users expect one thing, get another **Fix**: Align title/label with actual content
**Pattern**: URLs that open to broken/empty views **Search**: `.onOpenURL` handlers — check if destination view validates the linked entity exists; deep link routes that push views without checking data availability; no fallback view when linked content is unavailable **Issue**: External link opens app to blank/broken screen **Fix**: Validate linked content, show fallback for missing data
**Pattern**: Data views with no empty handling **Search**: `List` or `ForEach` over arrays/queries without empty check; `@Query` results used in `ForEach` without `if results.isEmpty` guard; search results without "no results" UI; `LazyVGrid`/`LazyVStack` without empty state overlay **Issue**: Users see a blank screen with no guidance **Fix**: Add ContentUnavailableView or empty state overlay
**Pattern**: Async operations without user feedback **Search**: `.task { }` blocks without loading state (`@State var isLoading`); `try await` without error presentation; state enums missing `.loading`/`.error` cases. UIKit: `URLSession` calls without `UIActivityIndicatorView`; completion handlers that don't update UI on error **Issue**: Users don't know if something is loading or broken **Fix**: Add loading indicator and error presentation
Battle-tested skills, agents, and tools for modern Apple OS development — Swift 6, SwiftUI, Liquid Glass, Apple Intelligence, and more. Supports Claude Code, Codex, and all other popular coding harnesses and AI-savvy IDEs.
Repo: charleswiltgen/axiom
Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance, App Store accessibility review.
Use when implementing, testing, or evaluating ANY Apple Intelligence, on-device AI, or speech-to-text feature. Covers Foundation Models, @Generable,…
Use when the user has a crash log (.ips, MetricKit JSON, legacy .crash text, .xccrashpoint bundle, or pasted text) that needs analysis.
Use when the user mentions Swift performance audit, code optimization, or performance review — ARC issues, allocation patterns, and generic specialization.
Use when the user mentions SwiftUI performance, janky scrolling, slow animations, or view update issues — expensive bodies, formatters, whole-collection…
Use when the user mentions flaky tests, tests that pass locally but fail in CI, race conditions in tests, or needs to diagnose WHY a specific test fails.