{"slug": "show-hn-manzanas-a-dozen-ios-simulators-on-one-mac-leased-to-coding-agents", "title": "Show HN: Manzanas - a dozen iOS simulators on one Mac, leased to coding agents", "summary": "Manzanas, a new open-source Mac daemon from developer BariBariGood, lets coding agents lease and orchestrate fleets of iOS simulators across multiple Macs, with measured performance gains on an M3 Pro running macOS 26.5 and Xcode 26.5. The tool provides a YAML-based run specification, a lease system to prevent conflicts, and an exportable evidence journal, aiming to reduce overhead for AI agents that need to test iOS apps.", "body_md": "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.\n\n**The 90% story: lease a simulator, run a YAML spec, get evidence.**\nEverything else, fleets, physical phones, mirroring, is an opt-in\nchapter you can ignore until you need it.\n\n## promo.mp4\n\n*1 orchestrator, 7 Codex agents, 7 simulators across 3 Macs, leases mean\nnobody trips over anybody. Real time, no edits.*\n\n`manzanasd`\n\nruns on each Mac host and owns everything stateful, the\nsimulator registry, the lease table, the warm pool, action backends,\nstreamers, golden images, and the run journal. Clients (`manzanas`\n\nCLI, MCP\nfacade, SDKs) are thin and cross-platform, speaking a versioned JSON\nprotocol over HTTP + WebSocket.\n\n**Website: manzanas.dapsdev.dev** (source in\n\n[).](/BariBariGood/manzanas/blob/main/site)\n\n`site/`\n\nNo flags to read, no config to write. Four layers, start at whichever matches your machine:\n\n```\nnpx manzanasd-client@latest doctor   # downloads the release binary and runs the setup diagnosis\n```\n\nThe npm wrapper fetches the right `manzanasd`\n\n/`manzanas`\n\nbinary for your\nplatform on install, then proxies every command to it. Use it as the CLI,\nor point your agent's MCP config at `manzanas mcp`\n\n.\n\n```\nmake build                      # writes bin/manzanasd, bin/manzanas, bin/manzanas-broker\n./bin/manzanasd --mock          # full daemon + fake fleet + mock action backend\n```\n\nIn another terminal, run the whole lease → boot → act → evidence loop as one declarative YAML run:\n\n```\n# hello.yaml, drives the mock login screen (docs/mock.md)\nname: hello\ntarget:\n  labels: [ios26]\nsteps:\n  - action: type_into_element\n    with: {id: username, text: agent}\n  - action: type_into_element\n    with: {id: password, text: pw}\n  - action: tap_element\n    with: {label: \"Sign In\"}\n  - action: wait_for_element\n    with: {label: \"Welcome, agent!\", timeout_ms: 5000}\n./bin/manzanas run hello.yaml -o evidence.md\ncat evidence.md                 # PR-ready markdown evidence of every step\n```\n\nThat's the product: one spec, one command, a journaled evidence trail. The same spec runs unchanged against real simulators, and against physical phones, because every target speaks the same actions API.\n\n```\nbrew tap baribarigood/tap https://github.com/BariBariGood/homebrew-tap\nbrew trust baribarigood/tap      # Homebrew >= 6 requires trusting third-party taps\nbrew install manzanasd            # daemon (+ pulls in the manzanas CLI)\nbrew services start manzanasd     # launchd service on port 7433\nmanzanas doctor                   # one-shot setup diagnosis; every failure names its fix\n```\n\n`manzanasd`\n\nneeds **zero flags** for a working single-Mac daemon:\nsensible defaults for the journal, template library, and element map,\nsimulators enumerated from `simctl`\n\n, physical devices and the mirror off\nuntil you opt in. The same `manzanas run spec.yaml`\n\nnow drives real\nsimulators. Step-by-step walkthrough (lease, tap, screenshot, release by\nhand): [docs/quickstart.md](/BariBariGood/manzanas/blob/main/docs/quickstart.md).\n\n```\nmanzanas targets                                        # list simulators\nmanzanas lease acquire --labels ios26 --agent me --wait # claim one\nmanzanas tap 200 400 --lease lse_...                    # drive it\nmanzanas mcp                                            # or hand the tools to an agent\n```\n\n**Physical iPhones**(WebDriverAgent):[docs/devices.md](/BariBariGood/manzanas/blob/main/docs/devices.md)** XCTest-hostile apps**via iPhone Mirroring:[docs/mirror-onboarding.md](/BariBariGood/manzanas/blob/main/docs/mirror-onboarding.md)** Multiple Macs behind one endpoint**:[docs/broker.md](/BariBariGood/manzanas/blob/main/docs/broker.md)\n\nAgents driving simulators over raw SSH + CLI tools trip over each other\nand pay huge fixed costs. manzanasd removes both, with measured numbers\n(M3 Pro, macOS 26.5, Xcode 26.5; reproduce with `make bench`\n\n):\n\n**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 ms** cold (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**, via[simslim](https://github.com/MobAI-App/simslim)), 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.\n\n| Leases | TTL-bounded exclusive claims, labels, FIFO queues, auto-reset, pause/resume for human handoff |\n| Warm pool | park/thaw (SIGSTOP) pool sims: ~0.28 s lease-to-live, ~0 idle CPU |\n| Actions | cold (AXe) + warm (resident helper) taps/swipes/typing, composite `tap_element` with a structured predicate DSL, list-scrolling composites (`scroll_until` /`scroll_collect` ), pixel templates (`save_template` /`tap_template` ), batches |\n| Verification | `assert_text` /`assert_template` postconditions, opt-in pixel-verified taps, `wait_for_stable` pixel settle, run verdicts + replay drift detection |\n| Runs | one-call YAML runs: lease → boot → app → steps → evidence → release (\n|\n\n[, WS frames](/BariBariGood/manzanas/blob/main/docs/assets/live-view.png)`/view`\n\npage`simctl`\n\nrecordings that land in the journal`export.md`\n\n, replayable spec export[web dashboard](/BariBariGood/manzanas/blob/main/docs/assets/dashboard.png)at`/dash`\n\n: fleet, leases, multiview, journal browser`manzanas doctor`\n\n: one-shot host diagnosis, every failing check carries its fix`manzanas-broker`\n\nfederates N Macs behind one endpoint`manzanas`\n\nCLI, MCP tools over stdio, npm wrapper, GitHub Actionthe browser `/view` MJPEG live page |\nthe built-in `/dash` fleet dashboard |\n\n`manzanas mcp`\n\nserves the whole toolset over the Model Context Protocol\n(stdio), so any MCP-capable agent can lease and drive simulators, with\nper-session auto-release of leases and self-describing tool errors.\nReady-to-paste client configs and troubleshooting:\n[docs/mcp.md](/BariBariGood/manzanas/blob/main/docs/mcp.md).\n\n```\nclaude mcp add manzanas -e MANZANASD_ADDR=mac-host:7433 -- /path/to/manzanas mcp\n┌ Linux / CI / anywhere ────────────┐        ┌ each Mac host ─────────────────────────────┐\n│ manzanas (thin client, Go)         │   WS   │ manzanasd (Go daemon)  :7433                │\n│  - CLI: lease/tap/observe/...     │◄──────►│  registry ── warm pool (park/thaw, gates)  │\n│  - MCP facade (stdio)             │  HTTP  │  leases (TTL, labels, FIFO, auto-reset)    │\n│  - eval harness (manzanas-eval)    │        │  actions ── cold AXe / warm simbridge      │\n├───────────────────────────────────┤        │  streams (MJPEG fan-out, browser view)     │\n│ manzanas-broker  :7440             │        │  state (snapshots, fixtures, golden images)│\n│  fleet-wide placement: leases are │───────►│  journal (evidence, artifacts, export.md)  │\n│  scheduled across N daemons, then │ probe/ └────────────────────────────────────────────┘\n│  clients talk to the owning       │ lease         × one daemon per Mac in the fleet\n│  daemon directly (host_addr)      │\n└───────────────────────────────────┘\n```\n\nOne orchestration core, transports as thin backends: the same YAML spec,\nleases, journal, and evidence pipeline run against simulators\n(AXe/simctl), physical iPhones (WebDriverAgent), and XCTest-hostile apps\n(iPhone Mirroring). What manzanas is *not*, a generic OCR automation\nframework, an app-botting tool, is written down in\n[docs/non-goals.md](/BariBariGood/manzanas/blob/main/docs/non-goals.md), along with why the repo stays\none repo.\n\n**Start here** (the 90% path):\n\n[docs/quickstart.md](/BariBariGood/manzanas/blob/main/docs/quickstart.md), zero to a passing run on one Mac: install → doctor → lease → tap → screenshot → YAML run.[docs/runs.md](/BariBariGood/manzanas/blob/main/docs/runs.md), the one-call YAML run: schema, verdicts, drift detection, record → replay.[docs/mock.md](/BariBariGood/manzanas/blob/main/docs/mock.md), the full daemon anywhere (Linux/CI), no Mac needed.[docs/journal.md](/BariBariGood/manzanas/blob/main/docs/journal.md), the evidence trail: run journal format, artifacts, markdown export, replayable spec export.[docs/mcp.md](/BariBariGood/manzanas/blob/main/docs/mcp.md), handing the tools to an agent (Claude Code, Cursor, Codex).[docs/troubleshooting.md](/BariBariGood/manzanas/blob/main/docs/troubleshooting.md),`manzanas doctor`\n\nfirst, then symptoms → causes → fixes.\n\n**Going deeper** (read when you hit the subsystem):\n\n[proto/PROTOCOL.md](/BariBariGood/manzanas/blob/main/proto/PROTOCOL.md), the v0 wire protocol: targets, leases, actions, streams, state, journal, runs, WS surface. The tables in §5 are the authoritative list of action kinds and payloads.[docs/architecture.md](/BariBariGood/manzanas/blob/main/docs/architecture.md), components, interface contracts, and the product boundary.[docs/agent-qa.md](/BariBariGood/manzanas/blob/main/docs/agent-qa.md), a worked end-to-end agent QA session, plus driving animated (React Native) apps.[docs/resolver-ladder.md](/BariBariGood/manzanas/blob/main/docs/resolver-ladder.md), how element resolution works: map/ax/ocr/template rungs, provenance, escalation.[docs/elementmap.md](/BariBariGood/manzanas/blob/main/docs/elementmap.md), the learned element map (fast-path resolution across runs).[docs/templates.md](/BariBariGood/manzanas/blob/main/docs/templates.md), the pixel-template library (`save_template`\n\n/`tap_template`\n\n/`assert_template`\n\n).[docs/warm-pool.md](/BariBariGood/manzanas/blob/main/docs/warm-pool.md), park/thaw warm pool, footprint watchdog, host safety gates.[docs/actions-warm.md](/BariBariGood/manzanas/blob/main/docs/actions-warm.md), warm vs cold action paths; the resident`simbridge`\n\nhelper.[docs/state.md](/BariBariGood/manzanas/blob/main/docs/state.md), snapshots, fixtures, per-lease auto-reset, quarantine.[docs/images.md](/BariBariGood/manzanas/blob/main/docs/images.md), golden images: slim once, stamp N sims in seconds.[docs/streaming.md](/BariBariGood/manzanas/blob/main/docs/streaming.md), MJPEG streaming and the browser view page.[docs/dashboard.md](/BariBariGood/manzanas/blob/main/docs/dashboard.md), the built-in read-only web dashboard at`/dash`\n\n.[docs/recording.md](/BariBariGood/manzanas/blob/main/docs/recording.md), per-lease video capture into the journal.[docs/eval.md](/BariBariGood/manzanas/blob/main/docs/eval.md), the scenario-driven determinism benchmark harness.[clients/README.md](/BariBariGood/manzanas/blob/main/clients/README.md),`manzanas`\n\nCLI + MCP quickstarts;[clients/npm/](/BariBariGood/manzanas/blob/main/clients/npm/README.md); GitHub Action in[action/](/BariBariGood/manzanas/blob/main/action/README.md).\n\n**You probably don't need these yet** (opt-in surfaces; each page opens\nwith who it's for):\n\n[docs/non-goals.md](/BariBariGood/manzanas/blob/main/docs/non-goals.md), the product boundary: what manzanas is, what it deliberately is not, and the one future split candidate.[docs/devices.md](/BariBariGood/manzanas/blob/main/docs/devices.md), physical iPhones as leasable targets (devicectl + WebDriverAgent), and the mirror backend reference.[docs/mirror-onboarding.md](/BariBariGood/manzanas/blob/main/docs/mirror-onboarding.md), the guided setup path for driving XCTest-hostile apps through iPhone Mirroring.[docs/broker.md](/BariBariGood/manzanas/blob/main/docs/broker.md), multi-Mac federation.[docs/fleet.md](/BariBariGood/manzanas/blob/main/docs/fleet.md), running a multi-Mac fleet (topology, Tailscale, day-2 ops).[docs/install.md](/BariBariGood/manzanas/blob/main/docs/install.md), launchd install, releases, Homebrew formula.\n\nThe physical fleet this runs on (machines, locks, build caching) is\nsite-specific; [docs/fleet.md](/BariBariGood/manzanas/blob/main/docs/fleet.md) covers the daemon's part.\n\nEverything above is implemented and running on the fleet, leases +\nqueues (incl. pause/resume), warm pool with safety gates, cold (AXe) +\nwarm (simbridge) action backends, composite/batch/assert actions, the\nresolver ladder with element map and pixel templates, one-call YAML runs\nwith verdicts and drift detection, MJPEG streaming, video capture,\nsnapshots/fixtures/auto-reset, golden images, journal, dashboard, doctor,\nphysical-device support (WDA + mirror), broker, eval harness, CLI + MCP.\nVerify with `go build ./... && go vet ./... && go test ./...`\n\n(Linux-safe; simctl paths are mocked).\n\nApache-2.0, see [LICENSE](/BariBariGood/manzanas/blob/main/LICENSE). Releases up to and including v0.6.0\n(and their existing tags) were published under MIT and remain MIT; later\nreleases are Apache-2.0.", "url": "https://wpnews.pro/news/show-hn-manzanas-a-dozen-ios-simulators-on-one-mac-leased-to-coding-agents", "canonical_source": "https://github.com/BariBariGood/manzanas", "published_at": "2026-09-01 13:01:39+00:00", "updated_at": "2026-09-01 13:23:45.023923+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents", "ai-infrastructure"], "entities": ["Manzanas", "BariBariGood", "Codex", "M3 Pro", "macOS 26.5", "Xcode 26.5", "WebDriverAgent", "Homebrew"], "alternates": {"html": "https://wpnews.pro/news/show-hn-manzanas-a-dozen-ios-simulators-on-one-mac-leased-to-coding-agents", "markdown": "https://wpnews.pro/news/show-hn-manzanas-a-dozen-ios-simulators-on-one-mac-leased-to-coding-agents.md", "text": "https://wpnews.pro/news/show-hn-manzanas-a-dozen-ios-simulators-on-one-mac-leased-to-coding-agents.txt", "jsonld": "https://wpnews.pro/news/show-hn-manzanas-a-dozen-ios-simulators-on-one-mac-leased-to-coding-agents.jsonld"}}