manzanas

Tends your orchardof Macs and simulators.

One daemon per Mac. Your AI agents share its simulators without stepping on each other.

manzanasd — :7433
$ ./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-1
lease lse_9f2 active on iPhone 17 Pro (ttl 300s)

$ ./bin/manzanas lease acquire --labels ios26 --agent codex-2
lease 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.

claude-1 · iPhone 17 Proactive · 214s
codex-2 · any ios26queued · #1
gemini-3 · iPad Proactive · 87s

Live streaming

Watch any simulator live in your browser while an agent drives it. MJPEG today; H.264 in v0.2.

LIVE · mjpeg · 3 viewers

Deterministic state

Snapshot a simulator, restore it later. Every retry starts clean.

snap_a1 · clean install
snap_b7 · logged-in
restore → snap_b7

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

CLI — lease / tap / type / observe
MCP server — manzanas mcp (stdio)
stream viewer — browser

EACH MAC HOST

manzanasd

Go daemon · owns everything stateful

registry — sims via simctl · boot / shutdown / health
lease — TTL · labels · FIFO queues
actions — HID + a11y observe (AXe) · screenshots
stream — MJPEG · N viewers per target
state — snapshot / restore · fixtures
journal — actions + tree hashes + artifacts

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.

mac-01.local:7433/v0/streams/str_4kd/mjpeg
LIVE · mjpeg · 30 fps

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.

build & run
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 --mock

02

Lease a simulator and act

Ask for a simulator. If it's busy, you queue. Then tap, type, and observe.

manzanas cli
./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 observe

03

Watch live, keep the evidence

Watch any simulator in your browser, follow the journal, or serve the fleet as MCP tools.

stream · journal · mcp
./bin/manzanas stream url --lease $MANZANAS_LEASE
./bin/manzanas journal tail $MANZANAS_LEASE

# serve MCP tools over stdio:
./bin/manzanas mcp

Open source.
Protocol-first. MIT.

The protocol is a published spec — anyone can build on it. Free, open, and yours to run.