Baguette turns iOS simulators into a real headless device farm

updates

Most simulator tooling still assumes one developer sitting in front of one Mac window. Baguette is interesting because it treats Apple simulators more like controllable infrastructure: headless, scriptable, streamable, and ready for multi-device workflows.

README capture of the Baguette GitHub repository

Most iOS simulator tooling still assumes one developer sitting in front of one Mac with Simulator.app open. That works fine until you want something more operational: a device farm for QA, a browser surface for remote control, or a scriptable way to drive multiple simulators without babysitting windows. That is why Baguette stood out to me. It does not just expose Apple simulators. It reorganizes them into something that feels much closer to infrastructure.

Baguette is an open-source Swift CLI for Apple Silicon Macs that boots iOS simulators headlessly, streams their screens at up to 60 fps, and injects taps, swipes, scrolls, and multi-finger gestures through SimulatorKit's newer host-HID path. The repo also ships a built-in local web UI, so the same tool can act like a command-line utility, a stream server, and a small control plane for simulators on one machine. That combination is the core product idea here. It makes simulator access feel less like a private desktop trick and more like a reusable system boundary.

The strongest feature is not any single command. It is the way the pieces fit together. Baguette can list devices, boot them headlessly, expose a live browser view, and open a multi-device farm page where every booted simulator appears in a wall, grid, or list. Click one tile and it becomes the focused device with higher-quality streaming and full gesture input, while the other devices stay visible as cheaper thumbnails. That is a thoughtful design decision. It acknowledges that multi-device workflows are real, but it also avoids paying the full performance cost for every screen all the time.

I also like how grounded the implementation is in the ugly realities of the platform. The README is unusually explicit about why this works on iOS 26.4 when older tools break: Apple changed the SimulatorHID wire format, and Baguette uses the 9-argument signature from Xcode 26's preview-kit path instead of older input routes that no longer behave correctly. That is not glamorous marketing copy. It is the kind of low-level specificity that makes a repo much more credible, especially when it is claiming to solve something fragile.

Another reason this feels product-minded is the web surface. /simulators gives a per-device dashboard and /farm turns the machine into a small local device lab. The project does not stop at video streaming either. It pairs the stream with input handling, screenshot capture, device chrome data, and a browser-side control loop over WebSockets. That matters because a lot of simulator demos only prove that you can watch a screen remotely. Baguette is more ambitious: it wants the remote surface to stay genuinely interactive.

The constraints are real, and they are worth stating plainly. This is Apple Silicon only, tied to Xcode 26, and built around private Apple frameworks like SimulatorKit and CoreSimulator. That means the project is powerful partly because it is narrow. It is not trying to be a universal device-cloud platform. It is exploiting one very specific platform seam extremely well. For builders, that is actually a useful lesson. Narrow platform bets can create much sharper tools than broad abstractions that never go deep enough.

There is also a nice architectural signal in the repo itself. The README describes a layered split between domain, infrastructure, app, and web resources, with more than 110 tests and a design that avoids requiring a booted simulator just to run the test suite. For infrastructure-flavored developer tools, that kind of internal discipline matters. If a project wants you to trust it as part of a workflow, the repo has to look maintainable too. Baguette clears that bar better than most early device-control projects.

My takeaway is that Baguette is interesting not because it adds one more way to click around an emulator, but because it treats simulators like programmable assets. That is a stronger frame for modern mobile tooling. As more QA flows, agent workflows, and remote collaboration loops move into the browser, tools that turn local platform surfaces into controllable infrastructure will keep getting more valuable. Baguette feels like an early but convincing version of that idea.

GitHub: https://github.com/tddworks/baguette