Point sootsim at any Metro or Vite dev server and your unmodified bundle boots in a browser tab — same hot reload, same gestures, no Xcode in the loop.
Instantly record flows into shareable preview links. Both a real bundle and video recording are instantly shareable at a /preview/<id> link.
A GitHub App runs sootbot in your CI, drives the PR build with a recorded flow, and posts a sticky comment with a video and /preview/<id> link.
Detox files run unchanged through a Jest preset; bun sootsim maestro plays .maestro/*.yaml against headless Chromium on Linux CI — no Mac runner, no second test stack.
A Vite plugin and a Metro plugin attach sootsim without forking your bundler config, or run sootsim open <port> against a live one.
38 top-level verbs talk to the running tab over a WebSocket on port 7668, with per-tab claim leases gating writes.
A worker-hosted overlay mirrors the render tree into real <button>, <input>, <textarea>, <a>, and <h2> elements with full ARIA.
record, screenshot, and screenshots --plan all capture from the same canvas that runs the live app, inside the tab.
react-reconciler builds the tree, Yoga 3 lays it out, and CanvasKit (Skia compiled to WASM) paints it onto one canvas per surface.
220+ native modules are stubbed against browser APIs; 350+ pure-JS packages compose sootsim's primitives without a shim.
Status bar, Dynamic Island, keyboard, alerts, action sheets, image picker, notifications, control center, app switcher, home grid, and lock screen all live in the shell worker.
Each shared case runs on a real iOS simulator and on sootsim; assertions read layout, focus, scroll state, and event order from both.













