From axiom
Diagnoses iOS/macOS performance issues: memory leaks, slow execution, battery drain, profiling with Instruments. Covers Time Profiler, Allocations, xctrace, and hang diagnostics.
How this skill is triggered — by the user, by Claude, or both
Slash command
/axiom:axiom-performanceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**You MUST use this skill for ANY performance issue including memory leaks, slow execution, battery drain, or profiling.**
You MUST use this skill for ANY performance issue including memory leaks, slow execution, battery drain, or profiling.
Use this router when:
Memory leaks (Swift) → See skills/memory-debugging.md
Memory leak scan → Launch memory-auditor agent or /axiom:audit memory (5-phase semantic audit: maps resource ownership, detects 6 leak patterns, reasons about missing cleanup, correlates compound risks, scores lifecycle health)
Memory leaks (Objective-C blocks) → See skills/objc-block-retain-cycles.md
Performance profiling (GUI) → See skills/performance-profiling.md
OS27)Automated profiling (CLI) → See skills/xctrace-ref.md
Run automated profile → Use performance-profiler agent or /axiom:profile
Compare two traces / detect regressions → See skills/trace-comparison.md or /axiom:compare-traces
xcprof compare --fail-on-regression (non-zero exit)App hangs or freezes → See skills/hang-diagnostics.md
Corpus/aggregate hang triage (Sentry, ASC) → axiom-shipping (skills/production-triage.md) + triage-analyzer agent
anr_idle_runloop vs anr_main_thread_block across the corpusSlow app launch → See skills/app-launch.md
dyld Activity, measurement hygiene+load, mergeable libraries), main-thread deferral, priority inversionXCTApplicationLaunchMetric regression test, MXAppLaunchMetric field histograms, custom "app is interactive" signpostBattery drain, high energy → See skills/energy.md
Symptom-based diagnosis → See skills/energy-diag.md
API reference with code → See skills/energy-ref.md
Energy scan → Launch energy-auditor agent or /axiom:audit energy (8 anti-patterns: timer abuse, polling, continuous location, animation leaks, background mode misuse, network inefficiency, GPU waste, disk I/O)
Timer crash patterns (DispatchSourceTimer) → See axiom-integration (skills/timer-patterns.md)
Timer API reference → See axiom-integration (skills/timer-patterns-ref.md)
Swift performance optimization → See skills/swift-performance.md
Swift performance scan → Launch swift-performance-analyzer agent or /axiom:audit swift-performance (unnecessary copies, ARC overhead, unspecialized generics, collection inefficiencies, actor isolation costs, memory layout)
Modern Swift idioms → See axiom-swift (skills/swift-modern.md)
MetricKit API reference → See skills/metrickit-ref.md
OS27): MetricManager AsyncSequence streams, typed MetricResult metrics (incl. Metal frame rate, storage), typed diagnostics with termination categories, launch-task trackingOS27): split hitch/hang/memory metrics by tab, mode, or experimentOS27): process crashes at crash time with in-extension symbolication (Part 10)Capture simulator console output → /axiom:console
--timeout and --max-linesLLDB interactive debugging → See axiom-build (skills/lldb.md)
LLDB command reference → See axiom-build (skills/lldb-ref.md)
axiom-shipping (skills/production-triage.md) + triage-analyzeraxiom-concurrency (callback contention, not profiling)/axiom:console.ips, MetricKit, or legacy .crash text file to symbolicate/triage? → axiom-tools (skills/xcsym-ref.md) or /axiom:analyze-crash| Thought | Reality |
|---|---|
| "I know it's a memory leak, let me find it" | Memory leaks have 6 patterns. memory-debugging diagnoses the right one in 15 min vs 2 hours. |
| "I'll just run Time Profiler" | Wrong Instruments template wastes time. performance-profiling selects the right tool first. |
| "Battery drain is probably the network layer" | Energy issues span 8 subsystems. energy skill diagnoses the actual cause. |
| "App feels slow, I'll optimize later" | Performance issues compound. Profiling now saves exponentially more time later. |
| "It's just a UI freeze, probably a slow API call" | Freezes have busy vs blocked causes. hang-diagnostics has a decision tree for both. |
| "Memory is climbing AND scrolling stutters — two separate bugs" | Memory pressure causes GC pauses that drop frames. Fix the leak first, then re-check scroll performance. |
| "It only freezes on first launch, must be loading something" | First-launch hangs have 3 patterns: synchronous I/O, lazy initialization, main thread contention. hang-diagnostics diagnoses which. |
| "Launch feels slow — I'll trim some startup code" | Launch has 3 phases (pre-main / main→first frame / extended) and a watchdog. app-launch tells you which phase to profile, with measurement hygiene so the number means something. |
| "Launch is fine, it's fast on my phone" | Measure on your oldest supported device with a Release build. app-launch has the full hygiene checklist — newest-device numbers hide the regression. |
| "Resume from the app switcher is slow too" | Resume isn't a launch — never measure it as one. app-launch distinguishes cold/warm/hot/notification and how to reproduce each. |
| "UI locks up when network requests finish — that's slow" | Multiple callbacks completing at once = main thread contention = concurrency issue. Cross-route to axiom-concurrency. |
| "I'll just add print statements to debug this" | Print-debug cycles cost 3-5 min each (build + run + reproduce). An LLDB breakpoint costs 30 seconds. axiom-build (skills/lldb.md) has the commands. |
| "I can't see what the app is logging" | xclog captures print() + os_log from the simulator with structured JSON. /axiom:console. |
| "I'll hand-parse this .ips JSON to see the top frame" | xcsym parses, discovers dSYMs, symbolicates, and categorizes in one call — structured JSON with pattern_tag. /axiom:analyze-crash. |
| "I'll just use Timer.scheduledTimer, it's simpler" | Timer stops during scrolling (.default mode), retains its target (leak). timer-patterns has the decision tree. |
| "DispatchSourceTimer crashed but it's intermittent, let's ship" | DispatchSourceTimer has 4 crash patterns that are ALL deterministic. timer-patterns diagnoses which one. |
| "Claude already knows modern Swift" | Claude defaults to pre-5.5 patterns (Date(), CGFloat, filter().count). swift-modern has the correction table. |
| "MetricKit is that old MX delegate API" | The 27 cycle rebuilt it: MetricManager AsyncSequence streams, typed metrics, per-state aggregation. metrickit-ref Part 1 has the new surface. |
| "My field metrics are one blended average, can't tell which screen is slow" | StateReporting splits every metric by app state you define (per-tab, per-experiment). metrickit-ref Part 1. |
| "No single function is hot, so the profile is useless" | Scattered overhead (dynamic dispatch, retain/release, existentials) hides in flame graphs. Top Functions mode merges it. performance-profiling. |
Memory Debugging (memory-debugging):
Performance Profiling (performance-profiling):
Energy Optimization (energy):
User: "My app's memory usage keeps growing" → See skills/memory-debugging.md
User: "I have a memory leak but deinit isn't being called" → See skills/memory-debugging.md
User: "My app feels slow, where do I start?" → See skills/performance-profiling.md
User: "My Objective-C block callback is leaking" → See skills/objc-block-retain-cycles.md
User: "My app drains battery quickly" → See skills/energy.md
User: "Users say the device gets hot when using my app" → See skills/energy-diag.md
User: "What's the best way to implement location tracking efficiently?" → See skills/energy-ref.md
User: "Profile my app's CPU usage"
→ Use: performance-profiler agent (or /axiom:profile)
User: "How do I run xctrace from the command line?" → See skills/xctrace-ref.md
User: "I need headless profiling for CI/CD" → See skills/xctrace-ref.md
User: "My app hangs sometimes" → See skills/hang-diagnostics.md
User: "The UI freezes and becomes unresponsive" → See skills/hang-diagnostics.md
User: "Main thread is blocked, how do I diagnose?" → See skills/hang-diagnostics.md
User: "Triage my Sentry hangs" / "Which ANR reports are real blocks?"
→ See axiom-shipping (skills/production-triage.md) + triage-analyzer agent (or /axiom:triage sentry)
User: "My app takes 3 seconds to launch" → See skills/app-launch.md
User: "Xcode Organizer says my launch time regressed" → See skills/app-launch.md
User: "How do I reduce pre-main / dyld time?" → See skills/app-launch.md
User: "App is slow to come up after tapping a push notification" → See skills/app-launch.md
User: "How do I write a launch performance test?" → See skills/app-launch.md
User: "How do I set up MetricKit?" → See skills/metrickit-ref.md
User: "How do I parse MXMetricPayload?" → See skills/metrickit-ref.md
User: "How do I use the new MetricManager / migrate off MXMetricManager?" → See skills/metrickit-ref.md (Part 1)
User: "Can I get hitch metrics per tab or per experiment?" → See skills/metrickit-ref.md (Part 1, StateReporting)
User: "How do I profile my Foundation Models / agentic feature?" → See skills/performance-profiling.md (Foundation Models instrument), then axiom-ai
User: "How do I compare two Instruments runs to verify a fix?" → See skills/performance-profiling.md (Run Comparisons) or skills/trace-comparison.md (CLI/CI)
User: "Scan my code for memory leaks"
→ Invoke: memory-auditor agent
User: "Check my app for battery drain issues"
→ Invoke: energy-auditor agent
User: "Audit my Swift code for performance anti-patterns"
→ Invoke: swift-performance-analyzer agent
User: "How do I inspect this variable in the debugger?" → Invoke: See axiom-build (skills/lldb.md)
User: "What's the LLDB command for conditional breakpoints?" → Invoke: See axiom-build (skills/lldb-ref.md)
User: "I need to reproduce this crash in the debugger" → Invoke: See axiom-build (skills/lldb.md)
User: "My list scrolls slowly and memory keeps growing" → See skills/memory-debugging.md first, then skills/performance-profiling.md if stutter remains
User: "App freezes for a few seconds on first launch then works fine" → See skills/hang-diagnostics.md
User: "UI locks up when multiple API calls return at the same time"
→ Cross-route: /skill axiom-concurrency (callback contention)
User: "My timer stops when the user scrolls"
→ Read: axiom-integration (skills/timer-patterns.md)
User: "EXC_BAD_INSTRUCTION crash in my timer code"
→ Read: axiom-integration (skills/timer-patterns.md)
User: "Should I use Timer or DispatchSourceTimer?"
→ Read: axiom-integration (skills/timer-patterns.md)
User: "How do I create an AsyncTimerSequence?"
→ Read: axiom-integration (skills/timer-patterns-ref.md)
User: "Review my Swift code for outdated patterns" → Invoke: See axiom-swift (skills/swift-modern.md)
User: "Is there a more modern way to do this?" → Invoke: See axiom-swift (skills/swift-modern.md)
User: "What is the app logging? I need to see console output"
→ Invoke: /axiom:console
User: "Capture the simulator logs while I reproduce this bug"
→ Invoke: /axiom:console
npx claudepluginhub charleswiltgen/axiom --plugin axiomProfiles iOS app performance with Instruments: Time Profiler for CPU, Allocations and Leaks for memory, Network for traffic, Energy Log for battery impact. Optimizes launch times, scrolling, and energy use.
Debug iOS app crashes, retain cycles, hangs, and build failures using LLDB, the Memory Graph Debugger, and Instruments. Profiles CPU, memory, energy, and network performance.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.