
Performance
Make a macOS app fast by measuring hangs, stutter, CPU, memory, and energy, then moving...
Install
npx skills add daveebbelaar/bama --skill performance -g -a claude-code -y- Repository
- daveebbelaar/bama1.3k
- Category
- Engineering
- Updated
- 3d ago
- License
- MIT
- Context cost
- Lightabout 843 tokens
- Runs scripts
- No, instructions only
What it does
Make a macOS app fast by measuring hangs, stutter, CPU, memory, and energy, then moving work off the main thread and onto the GPU. Use when the app freezes, a shortcut feels slow, dragging stutters, the fan spins, memory grows, or the user asks to optimize or profile.
Performance
Fast means two numbers: the first frame after a key press shows in under 100 ms, and nothing on the main thread blocks for more than 50 ms. Every change in this skill starts and ends with a measurement, so you know it helped. Symptom-by-symptom fixes are in recipes.md. For video, audio, camera, Metal, or large image pipelines, also read gpu-media.md.
The loop
reproduce -> measure (release build) -> find the line -> fix -> measure again -> commit with the numbers
-
Reproduce. Write the exact steps, or add a probe command to the debug bridge (
test-mac-appskill) that runs the slow action and logs the time of each step. -
Measure the release build. Debug Swift is 3 to 10 times slower and points at the wrong code.
-
Find the line. Pick the tool for the symptom:
Symptom Tool App freezes, spinning pointer sample <App> 5, then read the main thread stackSlow action Time Profiler: xcrun xctrace record --template 'Time Profiler' --attach <App> --time-limit 10sShort freezes while typing or dragging --template 'Hangs'Stutter while moving or animating --template 'Animation Hitches'Memory grows footprint <App>,leaks <App>,--template 'Allocations'Fan, battery --template 'Energy Log', look for timers and pollingRead traces as text, not in the Instruments GUI: see "Measuring" in recipes.md. Delete every
.traceafter reading. A trace stores the app's full environment, and an app opened from an agent's shell inherits that shell's tokens. Never commit or share one. -
Fix with the matching recipe.
-
Measure again with the same steps. Put before and after in the commit message: "Picker opens in 40 ms, was 600 ms".
