Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build, install, launch, and screenshot an iOS app in the Simulator to verify a change visually. Use when the user wants to run the app, see a change live, screenshot the running app, or confirm a UI fix actually works (not just that it compiles).
.claude/skills/rshankras-run-simulator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-17 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-10 | ✓→✓ | = Same ✓ | 27% | 0% |
Launches the actual app in the iOS Simulator and drives it far enough to see what a user would see. Building proves the code compiles; this skill proves it runs. The payoff is a screenshot of the live app that you read back to confirm the change — a blank or crashed frame is a failure, not a pass.
This skill is generic. Nothing about a specific app is hardcoded — the scheme, simulator, product path, and bundle id are all discovered at runtime.
Use this skill when the user:
Do not use it for unit/UI test runs (xcodebuild test) — that's a different goal. This is about meeting the app as a user would.
Run the steps in order. Each step's output feeds the next, so don't hardcode values a previous step can discover.
Prefer a workspace over a bare project when both exist (CocoaPods/SPM setups often require the workspace):
bash# Find the container ls *.xcworkspace 2>/dev/null || ls *.xcodeproj 2>/dev/null # List schemes (use -workspace X.xcworkspace OR -project X.xcodeproj) xcodebuild -list -project <App>.xcodeproj 2>/dev/null
Pick the app scheme (usually matches the app name). If several schemes look plausible and none clearly matches, ask the user which to run rather than guessing.
Never hardcode a device name — the named device may not exist on this Mac (e.g. assuming "iPhone 16" when only "iPhone 17 Pro" is installed fails with "Unable to find a device matching the provided destination specifier"). List what's actually available and prefer one already booted:
bash# Already-booted sim, if any (fastest — skip the boot wait) xcrun simctl list devices booted # Otherwise, available iPhones to choose from xcrun simctl list devices available | grep -i iphone
Choose a booted device if present; otherwise pick a recent iPhone from the available list and remember its name for the destination string.
bashxcodebuild build \ -project <App>.xcodeproj \ -scheme <Scheme> \ -destination 'platform=iOS Simulator,name=<SimName>' \ 2>&1 | tail -5
** BUILD SUCCEEDED **. Note that -quiet suppressesthat success line, so either drop -quiet for the confirming run or grep for error: explicitly.
error: lines — don't proceed to install a stale ornonexistent build.
.app and its bundle idDon't guess the DerivedData path — ask the build system for it:
bash# Product directory + name from the resolved build settings eval $(xcodebuild -project <App>.xcodeproj -scheme <Scheme> \ -destination 'platform=iOS Simulator,name=<SimName>' \ -showBuildSettings 2>/dev/null \ | awk -F' = ' '/ TARGET_BUILD_DIR =/{print "DIR=\""$2"\""} / FULL_PRODUCT_NAME =/{print "NAME=\""$2"\""}') APP="$DIR/$NAME" echo "APP: $APP" # Bundle id straight from the built Info.plist BID=$(/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "$APP/Info.plist") echo "Bundle id: $BID"
bashSIM="<SimName>" xcrun simctl boot "$SIM" 2>/dev/null # no-op if already booted open -a Simulator # bring the window forward xcrun simctl bootstatus "$SIM" -b # block until fully booted xcrun simctl install "$SIM" "$APP" xcrun simctl launch "$SIM" "$BID"
simctl launch prints <bundleid>: <pid> on success. A non-zero exit or an error string here means the app failed to start — investigate before screenshotting.
bashxcrun simctl io "$SIM" screenshot /tmp/sim-shot.png
Then Read /tmp/sim-shot.png and actually look at it:
If the change lives behind navigation, drive there before judging. Tap by point or describe to the user what to navigate to:
bash# Tap a point (x y in points) — useful for hitting a known tab/button xcrun simctl io "$SIM" tap <x> <y> # (where supported) # Re-screenshot after each interaction xcrun simctl io "$SIM" screenshot /tmp/sim-shot-2.png
For deep links, xcrun simctl openurl "$SIM" "<scheme>://<path>". If precise tapping isn't available, take the screenshot at the landing screen and tell the user the exact taps to reach the target view.
Report, concisely:
the change. Embed/Read the screenshot so the user sees it too.
Always list available sims (step 2) instead of assuming a model number.
"$SIM" "$BID" then reinstall; or xcrun simctl shutdown "$SIM" && xcrun simctl erase "$SIM" for a clean slate (destroys sim data — confirm first).
re-run with -workspace <App>.xcworkspace instead of -project.
simctl bootstatus -b blocks correctly; a fixedsleep does not and races the install.
re-screenshot after a short wait before declaring failure.
xcrun simctl help — full simulator control surface (boot, install, launch,io, openurl, spawn).
man xcodebuild — build, -list, -showBuildSettings, -destination.https://developer.apple.com/documentation/xcode/running-your-app-in-the-simulator-or-on-a-device
Other measured skills in the registry, with their headline benchmark lift.