Claude Code can build your iOS app. It calls xcodebuild, passes the scheme, picks a simulator, compiles. On a good run, it works.
Then it doesn’t. xcodebuild dumps 2,000 lines into one stream. Claude Code burns context looking for the error on line 847, misreads a linker error as a warning, retries with the wrong flag, grabs a simctl UDID that doesn’t exist on this machine. Two bad iterations and you’re back in the terminal doing it yourself.
The raw tools work often enough to be promising. They fail often enough to be unusable for autonomous work.
Where it breaks down
Apple’s CLI surface is four tools with nothing in common.
xcodebuild mixes errors, warnings, and progress into unstructured text. The agent parses this with regex that breaks silently between Xcode versions. xcrun simctl needs UDIDs that change per machine. xcrun devicectl has a completely different syntax. log stream shows every process on the system.
Orchestrating all four is where it falls apart. Not on the first build. On the fifth, when the simulator didn’t boot, the UDID was stale, and the agent is three tool calls deep into a dead end.
And none of them give the agent eyes. Claude Code cannot see the simulator screen, tap a button, or verify that the login form appeared. It writes UI code blind and hopes you’ll check.
There are open source wrappers that try to solve this. They expose Apple’s tools as 60 to 76 individual MCP operations, run on Node.js with a background daemon, and route every call through the MCP protocol before it reaches xcodebuild. Some ship with telemetry enabled by default. The approach works for experimentation. For production development where you need reliability, privacy, and a tool you can leave running unattended, the overhead adds up.
What you need is a professional tool: one interface, structured output, no telemetry, no runtime dependencies, and the ability to see what’s on screen.
The setup
FlowDeck is a native Swift CLI built for exactly this. No Node.js. No MCP server. No daemon. No telemetry. Eight commands, structured JSON on everything, and built-in UI automation. Here’s how to wire it to Claude Code.
Install.
curl -sSL https://flowdeck.studio/install.sh | sh
flowdeck license activate
Activate with the license key from your purchase email.
Install the skill pack.
flowdeck -i
Press A, select Install Skills, choose Claude Code, then Global or Project. This drops a SKILL.md that Claude Code reads on startup. Every command, every workflow pattern, one rule: use FlowDeck, not xcodebuild. The skill gives Claude Code full project context. No additional configuration.
Two steps. Under two minutes.
What the agent loop looks like
Claude Code discovers the project, builds, launches, observes. The whole cycle.
flowdeck context --json
flowdeck build -w App.xcworkspace -s MyApp -S "iPhone 16"
flowdeck run -w App.xcworkspace -s MyApp -S "iPhone 16"
Build output is NDJSON. Errors are typed events with file paths and line numbers. Build fails, agent reads the error, fixes the code, rebuilds. No regex. No guessing. No 2,000 lines of noise.
Building and running is table stakes. The part that changes the workflow is visual verification.
flowdeck ui simulator screen --json
Screenshot and full accessibility tree, returned as JSON. Claude Code sees the UI. Finds elements by label. Decides what to do next.
flowdeck ui simulator tap "Log In"
flowdeck ui simulator type "user@test.com"
flowdeck ui simulator assert visible "Welcome"
Tap, type, assert, scroll, swipe. The agent drives the app the way a QA engineer would, then verifies the result before moving on.
flowdeck apps
flowdeck logs <app-id>
Runtime logs. print() and OSLog output streamed from the running app. The agent sees behavior, not just compiler output.
Build, launch, screenshot, verify. Under 60 seconds. No human. No Xcode.
What this is and isn’t
FlowDeck is the build and observation layer. Claude Code writes the code. FlowDeck handles everything between writing code and knowing whether it worked.
Code signing and provisioning still need Xcode’s one-time setup. After that, Xcode stays closed.
Native Swift. Runs locally. No data leaves your machine. No telemetry, no usage tracking, no background analytics. License validation is the only network call FlowDeck makes.
Works with Claude Code, Codex CLI, OpenCode, and Gemini CLI.
Try it
curl -sSL https://flowdeck.studio/install.sh | sh
flowdeck license activate
Activate with the license key from your purchase email.
Further reading
Ship iOS apps from the terminal.
FlowDeck closes the build-run-test loop for AI agents and humans. One CLI for builds, simulators, logs, UI automation, and more.
$59/yr ·flowdeck license activate · Zero telemetry