manzanas
Tends your orchardof Macs and simulators.
One daemon per Mac. Your AI agents share its simulators without stepping on each other.
$ ./bin/manzanasd --addr :7433 time=02:17:09 level=INFO msg="manzanasd listening" addr=:7433 protocol=v0 $ ./bin/manzanas lease acquire --labels ios26 --agent claude-1lease lse_9f2 active on iPhone 17 Pro (ttl 300s)$ ./bin/manzanas lease acquire --labels ios26 --agent codex-2lease lse_a41 queued at position 1$
N agents. One Mac.
Chaos, until now.
Run two agents on the same Mac and they boot each other's simulators and type into the wrong window. manzanasd is the referee: one agent per simulator, everyone else queues.
N agents
share one Mac's simulators.
0 collisions
the daemon decides who owns what, and everyone else waits in line.
1 protocol
the CLI, MCP tools, and browser viewer all speak the same API.
Everything stateful
lives in the daemon.
Leases
Ask for a simulator; get it — or a place in line. When a lease expires, the next agent takes over.
Live streaming
Watch any simulator live in your browser while an agent drives it. MJPEG today; H.264 in v0.2.
Deterministic state
Snapshot a simulator, restore it later. Every retry starts clean.
Evidence journal
Every action is recorded with proof — what changed, screenshots included.
#41 action.tap 187,412 · tree 4c91→a2ff
#42 action.type "hello" · tree a2ff→09be
#43 screenshot · artifacts/43.png
MCP-native
One command — manzanas mcp — turns the fleet into MCP tools for any agent.
→ tools/call lease_acquire
{"labels":["ios26"],"ttl_seconds":300}
← lse_9f2 · iPhone 17 Pro
Sims first. Devices next.
Simulators today. Physical devices in v0.2 — same API.
Thin clients.
One stateful daemon per Mac.
Agents and humans talk to the daemon over one simple JSON API — HTTP for requests, WebSocket for streams.
LINUX · CI · ANYWHERE
manzanas
thin client · Go · single binary
EACH MAC HOST
manzanasd
Go daemon · owns everything stateful
SIMULATORS
iOS simulators
leased · queued · idle — devices in v0.2
Watch your agents work.
Live, in any browser.
Open a stream on any leased simulator and watch it live — while the agent keeps working.
lease
lse_9f2
target
iPhone 17 Pro
viewers
3
→ actions.dispatch tap 187,412
→ actions.dispatch type "hello manzanas"
← observe · tree hash a2ff…09be
Up and running
in three steps.
01
Build and run the daemon
One command builds everything. Run it on a Mac — or anywhere with a mock fleet.
make build # builds bin/manzanasd and bin/manzanas
# on a Mac with Xcode:
./bin/manzanasd --addr :7433
# anywhere (Linux/dev/CI), with a mock fleet:
./bin/manzanasd --addr :7433 --mock02
Lease a simulator and act
Ask for a simulator. If it's busy, you queue. Then tap, type, and observe.
./bin/manzanas lease acquire \
--labels ios26 --agent claude-1
export MANZANAS_LEASE=lse_9f2
./bin/manzanas tap 187 412
./bin/manzanas type "hello manzanas"
./bin/manzanas observe03
Watch live, keep the evidence
Watch any simulator in your browser, follow the journal, or serve the fleet as MCP tools.
./bin/manzanas stream url --lease $MANZANAS_LEASE
./bin/manzanas journal tail $MANZANAS_LEASE
# serve MCP tools over stdio:
./bin/manzanas mcpOpen source.
Protocol-first. MIT.
The protocol is a published spec — anyone can build on it. Free, open, and yours to run.