SootSim installs in a minute, runs in your browser (or desktop with Electron), loads any Metro bundle with no setup at all, and supports hot reloads.
SootSim runs directly from the Metro bundle, get a reviewable branch in under a minute instead of the 15-45 minutes TestFlight or an IPA-upload tool takes.
SootSim is the first iOS development surface designed for coding agents as first-class users. Agents can crawl an app, generate flows, snapshot+diff the tree, tune a spring, and audit accessibility — without a mac, a simulator, or computer vision.
Most professional developers run Windows and Linux. Bootcamp students, international teams, and enterprise shops are currently locked out of iOS development entirely. Break out of the Apple lock-in.
Replace the most expensive axis of mobile CI with commodity Linux minutes. Real device testing still matters for final sign-off, hardware sensors, and App Store validation — but 90% of coverage runs headlessly in the browser now.
This page is the reference implementation — what you see behind this dialog is a SootSim iframe running the Test Drive demo. Any company can drop the same embed on their site.
SootSim is a full React Native runtime inside the browser. A real react-reconciler builds a node tree, Yoga computes the same flexbox RN ships on device, and CanvasKit (Skia WASM) paints every pixel onto a single <canvas>. No DOM, no WebView, no fake web translation.
Not a layout loop. A scheduler.
The same arbitration UIKit uses to decide between a scroll and a button drag — reimplemented, not faked.
Momentum, deceleration, bounce-back, paging, and zoom physics live in the engine — not borrowed from the browser DOM.
CanvasKit paragraph layout handles multi-line wrap, three-mode ellipsis (head / middle / tail), full decoration set, and text shadow. A focused TextInput gets a 2.5 px blinking #007AFF cursor at real character offsets, selection highlight rects, drag handles with circles, and a 1.5× magnifier loupe when you drag a handle — because that's what iOS does.
Full CSS filter pipeline — blur, drop-shadow, brightness, contrast, saturate, hue-rotate, grayscale, sepia, invert — backed by CanvasKit image filters and 4×5 color matrices. Linear and radial gradients, RN 0.76 box-shadow with inset, Android elevation, dashed and dotted outlines, a DstIn masked-view path, backdrop blur, and a liquid glass SkSL shader that matches the iOS 26 aesthetic.
Third-party libraries that rely on deep Reanimated behavior work unmodified.
Any pure-JS library just works — 171 native-module stubs cover the packages that can't, and ~300 common pure-JS packages are validated on top. Most apps' package.json boots with zero overrides.
The browser defaults to sRGB. SootSim targets the same color space your app runs in on a real iPhone.
Not a frame around a viewport. A rendered phone.
Dynamic Island, status bar, keyboard, notifications, lock screen, and wallpaper — not one DOM node of chrome. The wallpaper is an SkSL mesh-gradient shader with 3-octave domain-warped fractal noise and film grain; Safari gets a full Canvas 2D reimplementation. Corners are drawn with an iOS continuous-corner squircle (Bézier, k=0.4465) applied to backgrounds, borders, shadows, clips, and images simultaneously.
After the app draw pass and before portals, the engine samples pixels behind the clock and battery icons via readPixels, computes luminance in the correct color space, and flips status-bar icons between light and dark — at most once per second. Exactly what iOS does, implemented in Skia.
The multitasking gestures, not a card carousel.
Four presentation states (collapsed, hint, mode, inspect) with bezier-timed morph, blur-slide label entrance, ring-mode shake, and a three-step tap bounce. A ring/silent button lives on the bezel — tap to hint, hold to switch. The bell appears next to the clock when the ringer is on.
Photos with date-grouped grid, hero thumbnail→fullscreen transition using non-uniform scale with an overflow clip (the Apple technique), pinch and double-tap zoom, center-crop dismiss. Control Center with 2×2 connectivity card, vertical brightness/volume sliders, and glass quick actions. Live Clock with world cities, Alarm, Stopwatch, Timer. Settings, Camera, Native UI catalog, Sheets, Tabs, Keyboard — and ConnectRN, the Expo Go-style dev server picker.
Your app thread and the browser's main thread are different threads.
Point SootSim at Expo, vxrn, One, or Metro — dev server discovery probes localhost ports, reads manifests, and resolves the right bundle URL without configuration. Two integration paths: the vite sootsim() plugin wires the whole stack in one call, or withSootsim() metro middleware serves a pre-built shell at /__soot/ with zero vite runtime required.
A non-configurable setter trap on globalThis.__d and __r intercepts Metro's CJS registry before any factory runs, so native-module stubs are injected transparently. 171 native-module stubs cover React Native internals, most of the Expo SDK, and common third-party native SDKs. Pure-JS libraries — @gorhom/bottom-sheet, gifted-chat, awesome-gallery — run unmodified through the real RN primitives.
Built so multiple coding agents can drive different sessions in parallel without stepping on each other.
A DOM overlay mirrors every node with real semantic elements — <button>, <a>, <input>, <h2>, <nav> — with full ARIA. Screen readers, Chrome DevTools, and AI browser tools read the canvas directly. Agent mode upgrades ScrollView to <div>, TextInput to <input>, Pressable to <button>, forwarding events back to the engine.
Inspection tools that talk to the engine, not to a pixel buffer.
Frameless transparent window with custom 60fps resize and drag, four scale modes (Physical / Point Accurate / Pixel Accurate / Fit), a macOS tray that scans for running dev servers every 5 seconds, OTA updates that install silently on quit, a sootsim:// deep-link protocol, and a shared native menu that renders identically in the browser shell.