Baguette
Bon appétit.
Headless iOS Simulator manager + host-side input injection for iOS 26.
A single Swift CLI — baguette — plus a self-contained web UI that
gives you full headless control of an iOS simulator without opening
Xcode or Simulator.app. Boot devices, stream their screens at 60 fps,
dispatch taps, swipes, multi-finger and system gestures, keyboard and
hardware buttons, read the accessibility tree, tail the unified log,
take screenshots and recordings, and feed the simulator a camera,
a location, motion and a slower network — on iOS 26 and later, where
the 5-argument HID call idb and AXe rely on stopped working.
Demo
https://github.com/user-attachments/assets/e904413f-16bb-4b3d-86d5-162333403cee
https://github.com/user-attachments/assets/c49c9f4b-0e4b-47ea-9272-3223b1ac7739
https://github.com/user-attachments/assets/65dc62ee-f0c7-48fb-9c57-5bd267c8c02f
The raw clip lives at
assets/demo.mp4— drag it into a GitHub web edit of this README to upload as a CDN-hosted video and replace the line above with the auto-generated URL.
Install
brew install baguetteApple Silicon with Xcode 26 — baguette links the private SimulatorKit /
CoreSimulator frameworks that ship with Xcode. If Homebrew complains about
Rosetta, see Troubleshooting.
Quick start
baguette serve # web UI at http://127.0.0.1:8421/simulators
open http://localhost:8421/farm # every booted simulator side by side
baguette list
baguette boot --udid <UDID>
baguette tap --udid <UDID> --x 219 --y 478 --width 438 --height 954
baguette describe-ui --udid <UDID> # what's on screen, frames in device points
# an App Store-sized screenshot, and a 10-second clip at the same size
baguette screenshot --udid <UDID> --size appstore-6.9 --output hero.png
baguette record --udid <UDID> --size appstore-6.9 --duration 10 --output demo.mp4Coordinates are device points, and --width / --height are the screen
size in points (baguette chrome layout --udid <UDID> tells you). For a
long-lived session, pipe JSON gestures into baguette input — see the
wire protocol.
What it covers
| Area | What you can do |
|---|---|
| Touches & gestures | Tap, swipe, pinch, pan, streamed one- and two-finger touches, home-indicator and pull-down system gestures → touches, double-tap |
| Buttons & keyboard | Home, lock, volume, action, Watch crown; keystrokes, typed text, paste and clipboard sync → buttons, keyboard, paste |
| Screen capture | Screenshots, recordings, frame streams to stdout, one output-size vocabulary, 3D device renders → screenshot, stream, recording, capture-size, 3d-rendering |
| Accessibility | The on-screen AX tree as JSON, hit-testing, a hover inspector in the browser → accessibility, ax-inspector, ax-hit-test-sweep |
| Logs | Live unified log, filtered by level, predicate or bundle id → logs |
| Web UI | Focus-mode page with bezel, a multi-device farm, a JS SDK for your own page → device-farm, chrome-bezel, baguette-sdk, serve routes |
| Device lifecycle | Boot, shut down, repair input after Xcode 27's Device Hub → boot, device-hub |
| Device settings | Orientation, appearance, contrast, text size, status bar, shake → orientation, interface, status-bar, shake |
| Simulated world | Mac webcam or a file as the camera, GPS and routes, CoreMotion, network conditioning → camera, location, motion, network |
| Apps & files | Deep links and URL schemes, drag-and-drop app install and Photos → deep-links, file-upload |
| Other screens | CarPlay and paired Watch, iPhone Duo and its hinge, a physical iPhone (preview) → companion-screens, iphone-duo, hinge, device-twin |
| Plugins | Add panels and commands from a trusted bakery; they run as subprocesses → plugins |
More
Docs index · Commands · Wire protocol · Serve routes · Architecture · Contributing · Changelog
License
Apache License 2.0 — see LICENSE.