New to Claude Skills? Learn how to install them →

steipete on GitHub

SwiftUI Performance Audit

Free

Optimize your SwiftUI app's performance with targeted audits.

by steipete6.5k stars on steipete/agent-scripts
1 views
Updated Aug 10, 2026
Get this skill

Free · Opens the source repo

What SwiftUI Performance Audit does

The SwiftUI Performance Audit skill provides a structured approach to diagnosing and enhancing the performance of SwiftUI applications. It guides users through a systematic process that begins with a code review, where potential performance bottlenecks are identified based on symptoms and code context. By collecting relevant code snippets and understanding the data flow, users can pinpoint issues such as view invalidation storms, unstable identities in lists, and heavy computations in the view body.

Once the initial review is complete, if the code does not yield clear insights, the skill directs users to utilize profiling tools like Instruments. This step involves capturing performance data during specific interactions, allowing for a detailed analysis of the app's performance metrics. Users are instructed on how to export relevant traces and screenshots, which are crucial for diagnosing deeper issues.

After gathering the necessary data, the skill helps users analyze the performance traces to identify root causes of sluggishness, such as layout thrash or excessive animations. It provides actionable remediation steps, including suggestions for code refactoring and optimization techniques. Users can learn to stabilize identities in lists, limit state scope, and optimize image handling, among other strategies.

Finally, the skill emphasizes the importance of verification, encouraging users to compare performance metrics before and after applying fixes. This end-to-end audit process ensures that developers can effectively enhance their SwiftUI applications, making them more responsive and efficient.

When to use it

Use this skill when you notice performance degradation in your SwiftUI app, such as slow rendering or lag during interactions.

When not to use it

This skill may not be suitable for very simple apps where performance is not a concern or for non-SwiftUI projects.

What you can build with it

Diagnosing Slow Scroll Performance

A developer notices that scrolling through a list in their SwiftUI app is laggy. They use this skill to analyze the code and identify a view invalidation storm as the root cause.

Optimizing Image Loading

An app displays large images that cause delays. The skill guides the user to downsample images before rendering, significantly improving load times.

Refactoring for Better Performance

After identifying heavy computations in the view body, a developer uses the skill's suggestions to refactor their code, moving expensive operations outside the body.

How to install SwiftUI Performance Audit

View source

1. Install with the skills CLI

npx skills add steipete/agent-scripts/swiftui-performance-audit --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by steipete

SwiftUI Performance Audit

Attribution: copied from @Dimillian’s Dimillian/Skills (2025-12-31).

Overview

Audit SwiftUI view performance end-to-end, from instrumentation and baselining to root-cause analysis and concrete remediation steps.

Workflow Decision Tree

  • If the user provides code, start with "Code-First Review."
  • If the user only describes symptoms, ask for minimal code/context, then do "Code-First Review."
  • If code review is inconclusive, go to "Guide the User to Profile" and ask for a trace or screenshots.

1. Code-First Review

Collect:

  • Target view/feature code.
  • Data flow: state, environment, observable models.
  • Symptoms and reproduction steps.

Focus on:

  • View invalidation storms from broad state changes.
  • Unstable identity in lists (id churn, UUID() per render).
  • Heavy work in body (formatting, sorting, image decoding).
  • Layout thrash (deep stacks, GeometryReader, preference chains).
  • Large images without downsampling or resizing.
  • Over-animated hierarchies (implicit animations on large trees).

Provide:

  • Likely root causes with code references.
  • Suggested fixes and refactors.
  • If needed, a minimal repro or instrumentation suggestion.

2. Guide the User to Profile

Explain how to collect data with Instruments:

  • Use the SwiftUI template in Instruments (Release build).
  • Reproduce the exact interaction (scroll, navigation, animation).
  • Capture SwiftUI timeline and Time Profiler.
  • Export or screenshot the relevant lanes and the call tree.

Ask for:

  • Trace export or screenshots of SwiftUI lanes + Time Profiler call tree.
  • Device/OS/build configuration.

3. Analyze and Diagnose

Prioritize likely SwiftUI culprits:

  • View invalidation storms from broad state changes.
  • Unstable identity in lists (id churn, UUID() per render).
  • Heavy work in body (formatting, sorting, image decoding).
  • Layout thrash (deep stacks, GeometryReader, preference chains).
  • Large images without downsampling or resizing.
  • Over-animated hierarchies (implicit animations on large trees).

Summarize findings with evidence from traces/logs.

4. Remediate

Apply targeted fixes:

  • Narrow state scope (@State/@Observable closer to leaf views).
  • Stabilize identities for ForEach and lists.
  • Move heavy work out of body (precompute, cache, @State).
  • Use equatable() or value wrappers for expensive subtrees.
  • Downsample images before rendering.
  • Reduce layout complexity or use fixed sizing where possible.

Common Code Smells (and Fixes)

Look for these patterns during code review.

Expensive formatters in body

var body: some View {
    let number = NumberFormatter() // slow allocation
    let measure = MeasurementFormatter() // slow allocation
    Text(measure.string(from: .init(value: meters, unit: .meters)))
}

Prefer cached formatters in a model or a dedicated helper:

final class DistanceFormatter {
    static let shared = DistanceFormatter()
    let number = NumberFormatter()
    let measure = MeasurementFormatter()
}

Computed properties that do heavy work

var filtered: [Item] {
    items.filter { $0.isEnabled } // runs on every body eval
}

Prefer precompute or cache on change:

@State private var filtered: [Item] = []
// update filtered when inputs change

Sorting/filtering in body or ForEach

List {
    ForEach(items.sorted(by: sortRule)) { item in
        Row(item)
    }
}

Prefer sort once before view updates:

let sortedItems = items.sorted(by: sortRule)

Inline filtering in ForEach

ForEach(items.filter { $0.isEnabled }) { item in
    Row(item)
}

Prefer a prefiltered collection with stable identity.

Unstable identity

ForEach(items, id: \.self) { item in
    Row(item)
}

Avoid id: \.self for non-stable values; use a stable ID.

Image decoding on the main thread

Image(uiImage: UIImage(data: data)!)

Prefer decode/downsample off the main thread and store the result.

Broad dependencies in observable models

@Observable class Model {
    var items: [Item] = []
}

var body: some View {
    Row(isFavorite: model.items.contains(item))
}

Prefer granular view models or per-item state to reduce update fan-out.

5. Verify

Ask the user to re-run the same capture and compare with baseline metrics. Summarize the delta (CPU, frame drops, memory peak) if provided.

Outputs

Provide:

  • A short metrics table (before/after if available).
  • Top issues (ordered by impact).
  • Proposed fixes with estimated effort.

References

Add Apple documentation and WWDC resources under references/ as they are supplied by the user.

  • Optimizing SwiftUI performance with Instruments: references/optimizing-swiftui-performance-instruments.md
  • Understanding and improving SwiftUI performance: references/understanding-improving-swiftui-performance.md
  • Understanding hangs in your app: references/understanding-hangs-in-your-app.md
  • Demystify SwiftUI performance (WWDC23): references/demystify-swiftui-performance-wwdc23.md

Frequently asked questions about SwiftUI Performance Audit

Similar skills