Sep 28, 2026
Build, Run, and Probe iOS Apps From Claude Code With ios-simulator-skill
29 scripts that wrap xcodebuild and the iOS simulator with progressive disclosure and accessibility-based navigation, so an agent can build, tap, and verify your app without drowning in output.
An agent asked to "build the app and tap through the login screen" faces two walls: xcodebuild output that floods the context window, and simulator UI it cannot see. ios-simulator-skill is a production-ready skill — 29 scripts wrapping xcodebuild, xcrun simctl, and idb — that handles both: builds come back as one-line summaries, and UI navigation finds buttons by meaning instead of pixel coordinates.
Why This Skill Matters
The token math is the point. A screenshot costs 1,600–6,300 tokens; the accessibility tree this skill navigates by costs about 10 tokens for default output. Across all 29 scripts, the README reports 3–5 lines of default output — a 96% reduction versus raw tool output. Build results work the same way: one summary line plus an xcresult ID, with details disclosed only when you ask.
Navigation goes through iOS accessibility APIs: navigator.py --find-text "Login" --tap finds the button by label, which survives layout changes that would break a hardcoded idb ui tap 320 400. The script set covers the full loop — build and test, device state (dark mode, locale, GPS simulation), gestures and keyboard, accessibility audits, visual diffs, push-notification simulation, permission management, and simulator lifecycle.
Installation
In Claude Code, via the plugin marketplace:
/plugin marketplace add conorluddy/ios-simulator-skill
/plugin install ios-simulator-skill@conorluddy
Manual install from a release (simplest):
curl -L https://github.com/conorluddy/ios-simulator-skill/releases/latest/download/ios-simulator-skill.zip -o skill.zip
unzip skill.zip -d ~/.claude/skills/ios-simulator-skill
Do not clone the whole repo into your skills directory — this repository is a plugin, so the actual skill lives at ios-simulator-skill/skills/ios-simulator-skill/, and a raw clone leaves SKILL.md three levels too deep to load.
Prerequisites: macOS 15+, Xcode 26+ with Command Line Tools, Python 3.12+, and idb 1.5.1+ (needed by every interactive script; Pillow only for visual diffs). Install idb from Meta's tap:
brew tap facebook/fb
brew install facebook/fb/idb-companion facebook/fb/idb-cli
Then verify the environment in one shot:
bash scripts/sim_health_check.sh
Real Workflow: Fix a Login Bug the Agent Can See
- Build and test with progressive disclosure:
python scripts/build_and_test.py --project MyApp.xcodeproj --scheme MyApp
- The result is one line —
Build: SUCCESS (0 errors, 3 warnings) [xcresult-...]. Drill in on demand with--get-errors,--get-warnings, or--get-logplus that xcresult ID. - Boot a simulator, launch the app, and navigate semantically:
python scripts/navigator.py --find-text "Login" --tap
- Hand the agent the bug and let it drive the loop itself:
登录按钮点击后没有跳转。用 ios-simulator-skill 启动 app,走到登录页复现这个问题,
把截图和控件层级一起带回来。
- On Xcode 27, remember there is no
Simulator.app— it was replaced byDeviceHub.app; the scripts drive simulators headlessly viasimctlandidb, so this rarely matters, butopen -a Simulatorwill fail.
Tips
- Tune limits with
IOS_SIM_*environment variables. For a slow GitHub Actions macOS runner:IOS_SIM_BOOT_TIMEOUT=600 python scripts/simctl_boot.py --wait-ready. - There is a real tradeoff in those knobs: higher caps mean fewer false failures and fuller diagnostics but more tokens; lower caps mean faster feedback but risk silently dropped errors or premature timeouts on legitimately slow operations.
- If
idbcalls fail withConnection refusedafter a crash, a dead companion is still registered — clear it withidb disconnect <udid>; the health check detects this. brew install idb-companionno longer works: the package moved to Meta's ownfacebook/fbtap. On Xcode 27, an older companion silently drops every tap and keystroke — upgrade to 1.5.1+.- The README reports Claude Code evals at 100% pass with the skill (3/3) versus 46% without — worth re-running against your own app via
claude evals run evals/evals.json --skill ios-simulator-skill.
When Not to Use This
It needs a Mac, Xcode 26+, and a Python 3.12+ toolchain — CI-only Linux builds gain nothing. And if you only want Xcode build tooling without simulator interaction, the same author ships a plugin version, xclaude-plugin, without the simulator scripts.
See the leaderboard for more skills.