app-resizability
Use when an app's layout must adapt to a window that changes size while the app runs, or when…
Capture and interpret ETTrace profiles for iOS simulator apps, including symbolicated launch and runtime flamegraphs. Use when asked to profile an iOS app flow, gather simulator performance traces, identify CPU-heavy stacks, compare before/after traces, or produce flamegraph
$ npx -y skills add omarshahine/HomeClaw --skill ios-ettrace-performance --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/ios-ettrace-performanceContext preview
The summary Claude sees to decide when to auto-load this skill.
Capture and interpret ETTrace profiles for iOS simulator apps, including symbolicated launch and runtime flamegraphs. Use when asked to profile an iOS app flow, gather simulator performance traces, identify CPU-heavy stacks, compare before/after traces, or produce flamegraph
name: ios-ettrace-performance description: Capture and interpret ETTrace profiles for iOS simulator apps, including symbolicated launch and runtime flamegraphs. Use when asked to profile an iOS app flow, gather simulator performance traces, identify CPU-heavy stacks, compare before/after traces, or produce flamegraph evidence for startup, scrolling, navigation, rendering, or other user-visible latency.
Use this skill to capture a focused, symbolicated ETTrace profile from an iOS simulator app. Pair it with `../ios-debugger-agent/SKILL.md` when the task also needs simulator build, install, launch, UI driving, logs, or screenshots.
1. Pick one focused flow and write down the expected start and stop points. 2. Build the exact simulator app that will be installed and profiled. 3. Temporarily link ETTrace into that app target for simulator/debug profiling. 4. Collect UUID-matched dSYMs for the app executable and embedded dynamic frameworks. 5. Capture one launch or runtime trace. 6. Preserve the processed flamegraph JSON immediately after the run. 7. Analyze only the processed JSON and report the flow, artifacts, hotspots, and caveats.
Avoid broad "use the app for a while" captures. One trace should correspond to one user-visible flow.
Use a writable run folder for each profiling session:
if [ -z "${RUN_DIR:-}" ]; then
RUN_DIR="$(mktemp -d "${TMPDIR:-/tmp}/codex-ios-ettrace.XXXXXX")"
fi
mkdir -p "$RUN_DIR"Install the ETTrace runner CLI if it is not already available:
brew install emergetools/homebrew-tap/ettrace
`ettrace` is the host-side macOS runner. The app must also link an `ETTrace.xcframework` for the iOS Simulator architecture. This workflow is validated for ETTrace v1.1.0 processed `output_<thread>.json` files with top-level `nodes`.
Wire ETTrace into the exact app target being profiled. Keep the integration in a clearly temporary patch and remove it when the profiling task is done unless the user explicitly asks to keep it.
Preferred options:
Build a simulator framework when needed:
ETTRACE_TAG="${ETTRACE_TAG:-v1.1.0}" # Override to match the installed runner when Homebrew updates.
ETTRACE_SRC="$RUN_DIR/ETTrace-src"
if [ ! -d "$ETTRACE_SRC" ]; then
git clone --depth 1 --branch "$ETTRACE_TAG" https://github.com/EmergeTools/ETTrace "$ETTRACE_SRC"
fi
rm -rf "$RUN_DIR/ETTrace-iphonesimulator.xcarchive" "$RUN_DIR/ETTrace.xcframework"
pushd "$ETTRACE_SRC" >/dev/null
xcodebuild archive \
-scheme ETTrace \
-archivePath "$RUN_DIR/ETTrace-iphonesimulator.xcarchive" \
-sdk iphonesimulator \
-destination 'generic/platform=iOS Simulator' \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
INSTALL_PATH='Library/Frameworks' \
SKIP_INSTALL=NO \
CLANG_CXX_LANGUAGE_STANDARD=c++17
xcodebuild -create-xcframework \
-framework "$RUN_DIR/ETTrace-iphonesimulator.xcarchive/Products/Library/Frameworks/ETTrace.framework" \
-output "$RUN_DIR/ETTrace.xcframework"
popd >/dev/nullFor Bazel apps, a temporary import usually looks like:
load("@rules_apple//apple:apple.bzl", "apple_dynamic_xcframework_import")
package(default_visibility = ["//visibility:public"])
apple_dynamic_xcframework_import(
name = "ETTrace",
xcframework_imports = glob(["ETTrace.xcframework/**"]),
)For Xcode projects, temporarily add the simulator `ETTrace.xcframework` to the app target's Link Binary With Libraries / Embed Frameworks phases for the debug simulator build you are profiling, then remove that wiring after profiling.
Do not draw conclusions from an unsymbolicated flamegraph. Before every capture, prepare a dSYM folder that includes the app dSYM and any embedded first-party dynamic framework dSYMs.
Collect dSYMs after the final build that produced the installed app:
SKILL_DIR="<absolute path to this loaded skill folder>" APP="<path-to-built-simulator-App.app>" DSYMS="$RUN_DIR/dsyms" "$SKILL_DIR/scripts/collect_ios_dsyms.sh" \ --app "$APP" \ --out-dir "$DSYMS" \ --search-root "$(dirname "$APP")" \ --search-root "$PWD" \ --extra-dsym "$RUN_DIR/ETTrace-iphonesimulator.xcarchive/dSYMs/ETTrace.framework.dSYM"
Add `--require-framework <FrameworkName>` for app-owned dynamic frameworks that must symbolicate; use `--require-all-frameworks` only when every embedded framework is app-owned or expected to have symbols. If the helper reports a missing required app or framework dSYM, rebuild the exact simulator app with dSYM generation before tracing, or add the build output directory that contains those dSYMs as another `--search-root`.
Verify important UUIDs before tracing when the report looks suspicious:
dwarfdump --uuid "$APP/$(/usr/libexec/PlistBuddy -c 'Print :CFBundleExecutable' "$APP/Info.plist")"
find "$DSYMS" -maxdepth 1 -type d -name '*.dSYM' -print -exec dwarfdump --uuid {} \;After ETTrace exits, read its symbolication summary. Treat meaningful first-party "have library but no symbol" lines as a failed trace unless they are tiny noise. Unsymbolicated system-framework or ETTrace internal buckets are usually acceptable.
For launch traces:
cd "$RUN_DIR" CAPTURE_MARKER="$RUN_DIR/.ettrace-capture-start" : > "$CAPTURE_MARKER" find "$RUN_DIR" -maxdepth 1 \( -name 'output.json' -o -name 'output_*.json' \) -delete ettrace --simulator --launch --verbose --dsyms "$DSYMS"
Use `--launch` only when mea
HomeKit smart home control via MCP — lights, locks, thermostats, and scenes for Claude Desktop, Claude Code, and OpenClaw
Repo: omarshahine/HomeClaw
Use when an app's layout must adapt to a window that changes size while the app runs, or when…
Design and implement App Intents, app entities, and App Shortcuts for iOS apps so useful…
Use XcodeBuildMCP to build, run, launch, and debug the current iOS project on a booted…
Capture, inspect, compare, and root-cause iOS memory graph leaks using Apple's leaks and…
Analyze Swift Package Manager dependencies, package plugins, module variants, and CI-oriented…
Use when writing, reviewing, or refactoring SwiftUI code for iOS or macOS, including state…