manzanas
About
Drive iOS simulators from Claude Code, Cursor or Codex by accessibility label instead of screenshot-and-tap-coordinates, with leases and a warm pool so multiple agents can share one Mac.
Details
- Author
- baribarigood
- Categories
- Developer Tools, Other, AI
Jump to
Setup
Install manzanas in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/baribarigood/manzanas
Follow the installation instructions in the repository README, then restart your MCP client.
A Mac daemon for multi-agent iOS simulator fleet orchestration: leases, actions, streaming, deterministic state, and an exportable run journal for AI agents (and humans) sharing simulators.
https://github.com/user-attachments/assets/deb577d0-1123-4a89-90d8-8d9c7684a3cf
The launch film — leases, actions, live streaming, warm pools, the broker, and the run journal in 52 seconds. Sound on.
manzanasdruns on each Mac host and owns everything stateful — the simulator registry, the lease table, the warm pool, action backends, streamers, golden images, and the run journal. Clients (manzanasCLI, MCP facade, SDKs) are thin and cross-platform, speaking a versioned JSON protocol over HTTP + WebSocket.manzanas-brokerfederates N daemons behind one endpoint — start with one Mac, and when you outgrow it the same clients lease across the whole fleet without changing a line.
https://github.com/user-attachments/assets/983b0548-df1a-41a3-812c-f0f39cfaa01c
1 orchestrator, 7 Codex agents, 7 simulators across 3 Macs — leases mean nobody trips over anybody. Real time, no edits.
Website:manzanas.dapsdev.dev(source insite/).
brew tap baribarigood/tap https://github.com/BariBariGood/homebrew-tap brew trust baribarigood/tap # Homebrew >= 6 requires trusting third-party taps brew install manzanasd # daemon (+ pulls in the manzanas CLI) brew services start manzanasd # launchd service on port 7433
Seedocs/install.mdfor launchd tarball installs and alternatives, anddocs/quickstart.mdfor a single-Mac walkthrough from install to first screenshot.
Agents driving simulators over raw SSH + CLI tools trip over each other and pay huge fixed costs. manzanasd removes both, with measured numbers (M3 Pro, macOS 26.5, Xcode 26.5; reproduce withmake bench):
- Leases, not locks: TTL-bounded exclusive claims with FIFO queues — no two agents ever drive the same sim.
- Park/thaw warm pool: idle sims are SIGSTOPped (a parked tree is unschedulable — ~0 idle host CPU no matter what the sim's daemons are doing) and thawed on lease grant:~0.28 s lease-to-live vs ~7 s for a cold boot(~29 s first boot). The thaw itself is a cached-PID SIGCONT and takes under a millisecond.
- Warm actions: a resident per-sim helper makes an end-to-end tap~36 ms vs ~950 mscold (per-action AXe spawn) — ~3 s cold on Intel.
- Deterministic state: snapshots, fixtures, per-lease auto-reset, and golden images that stamp out slimmed sims in seconds (~0.75 GB vs ~5 GB stock, viasimslim) — how one Mac runs a dozen sims.
- Evidence: every mutating op under a lease is journaled, with content-addressed artifacts and a PR-ready markdown export.
make build # builds bin/manzanasd, bin/manzanas, bin/manzanas-broker # on a Mac with Xcode: ./bin/manzanasd --addr :7433 # anywhere (Linux/dev/CI), with a mock fleet and a full mock action # backend — the whole lease→observe→tap→audit loop, no Mac (docs/mock.md): ./bin/manzanasd --addr :7433 --mock # list simulators curl -s localhost:7433/v0/targets | jq # lease one by label, boot it, release it curl -s -X POST localhost:7433/v0/leases \ -d '{"labels":["ios26"],"agent_id":"me","ttl_seconds":300}' | jq curl -s -X POST localhost:7433/v0/targets/<udid>/boot -d '{"lease_id":"<id>"}' | jq curl -s -X DELETE localhost:7433/v0/leases/<id> | jq
Or the thin client (--jsonfor machine output; seeclients/):
manzanas targets manzanas lease acquire --labels ios26 --agent me --wait manzanas tap 200 400 --lease lse_... manzanas mcp # lease-scoped MCP tools over stdio for agents
Production installs (launchd, releases):docs/install.md.
manzanas mcpserves the whole toolset over the Model Context Protocol (stdio), so any MCP-capable agent can lease and drive simulators — with per-session auto-release of leases and self-describing tool errors. Ready-to-paste client configs and troubleshooting:docs/mcp.md.
claude mcp add manzanas -e MANZANASD_ADDR=mac-host:7433 -- /path/to/manzanas mcp
┌ Linux / CI / anywhere ────────────┐ ┌ each Mac host ─────────────────────────────┐ │ manzanas (thin client, Go) │ WS │ manzanasd (Go daemon) :7433 │ │ - CLI: lease/tap/observe/... │◄──────►│ registry ── warm pool (park/thaw, gates) │ │ - MCP facade (stdio) │ HTTP │ leases (TTL, labels, FIFO, auto-reset) │ │ - eval harness (manzanas-eval) │ │ actions ── cold AXe / warm simbridge │ ├───────────────────────────────────┤ │ streams (MJPEG fan-out, browser view) │ │ manzanas-broker :7440 │ │ state (snapshots, fixtures, golden images)│ │ fleet-wide placement: leases are │───────►│ journal (evidence, artifacts, export.md) │ │ scheduled across N daemons, then │ probe/ └────────────────────────────────────────────┘ │ clients talk to the owning │ lease × one daemon per Mac in the fleet │ daemon directly (host_addr) │ └───────────────────────────────────┘
- [proto/PROTOCOL.md— the v0 wire protocol: targets, leases, actions (incl. compositetap_element/type_into_elementandactions:batch), streams, state, images, journal, WS surface.
…
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.





