Your app, imitated. Every stand‑in named.

See a React Native / Expo app’s UI without a simulator. Imitor builds it for the web, swaps native-only modules for stand-ins, and runs your flows in headless Chromium.

Open the live demo
$npm i -D github:joseamijares/imitor playwright
Free and open source, MIT. Early: v0, not on npm yet. Set-up takes four steps.
The fernwood demo app’s Today screen, cast above the app’s code as a dashed yellow copy. The watering ring, drawn with Skia, is marked as a stand-in.
  • The imitationheadless Chromium
  • Stand-in, namedreact-native-skia → skia
  • Your appnative builds untouched
  • Demo shot: fernwood, an invented app

Every result says what it is.

Each shot, preview and agent reply lists what came from your code, what was stood in, and what Imitor cannot show. Nothing is passed off as the real phone.

today/iphone-16/darklight/5d0b7f1 Demo data: fernwood is an invented app
The fernwood Today screen. The watering ring is a dashed stand-in box. The fernwood Today screen. The watering ring is a dashed stand-in box.
  1. 1

    Header, copy and colours

    Rendered from your own components and styles.

    Your code
  2. 2

    Watering ring

    @shopify/react-native-skia → skia. The canvas keeps its box and draws nothing.

    Stand-in
  3. 3

    Plant list data

    expo-sqlite → sqljs. Real SQLite, compiled to wasm, in memory.

    Stand-in
  4. 4

    Tab bar

    Your navigator, as the web build lays it out.

    Your code
  5. Native transitions, gestures and the keyboard

    Not shown. Check these on a real phone.

    Not shown
The same shot in manifest.json, abridgedwritten by every run
{
  "file": "screens/log-a-watering-01-today-iphone-16-darklight.png",
  "route": "/",
  "device": "iphone-16", "scheme": "darklight",
  "stubs": ["skia"]
}

From your code to a shot that says what it is.

No Mac, no emulator, no device. It runs on any Linux box, CI runner or cloud agent session. Stand-ins only apply to the web build Imitor makes; your iOS and Android builds are never touched.

  1. Build for the web

    imitor build

    Metro, wrapped with withImitor(), builds a static web version of the app.

  2. Swap in stand-ins

    expo-sqlite → sqljs

    Native-only modules get a web stand-in, and every result names which ones.

  3. Run your flows

    imitor shoot

    Taps, fills and shots in headless Chromium, once per device and colour scheme.

  4. Review

    imitor app

    Runs, captures and problems for people, or imitor export as a static site.

One flow, every shot, the stand-in marked.

The first-run flow of the demo app on an iPhone 16. The last shot holds the Skia watering ring, so it carries a dashed outline and the stand-in’s name.

WelcomeWelcome
01-welcome
Your spaceYour space
02-your-space
Add a plantAdd a plant
03-add-plant
Plant detailsPlant details
04-plant-details
ScheduleSchedule
05-schedule
RemindersReminders
06-reminders
All setAll set
07-all-set
Today, with the Skia ring stood inToday, with the Skia ring stood in
08-todayskia
Demo data: fernwood is an invented app.See its runs in the live demo →

Your agent drives it. You review it.

Seven MCP tools let a coding agent build the preview, run flows, take screenshots and record videos, then read which parts were stood in. Run these in the app’s folder.

Claude Code
$claude mcp add imitor -- npx imitor mcp
Cursor, or any MCP client
$npx imitor mcp
CCodex
$codex mcp add imitor -- npx imitor mcp
Every tool, and the same operations for CI
Agent activitydemo data
  1. Claude Codeimitor_initset up, 1 stand-in
  2. Claude Codeimitor_describe2 flows, built
  3. Claude Codeimitor_buildweb build ready
  4. Claude Codeimitor_run_flowlog-a-watering, 4 shots, skia stand-in
  5. Claude Codeimitor_screenshottoday, iphone-16, dark
  6. Claude Codeimitor_read_problemsno failed steps
  7. Claude Codeimitor_record_videofirst-run, .webm
  8. Claude Codeimitor_open_previewa URL a person can open

What it does not show.

Imitor shrinks what the final check on a real phone has to find. It does not replace that check.

  • Native navigation chrome, transitions and gestures
  • Keyboard behaviour
  • The phone’s exact font rendering
  • Entering and layout animations
  • Anything behind a stand-in
  • Platform-specific code paths: the build runs as web
  • Widgets, notifications, Live Activities, watch apps

Open source. Read it, run it, change it.

Imitor runs on your machines and in your agents’ environments. Nothing is sent anywhere unless you publish it yourself.

Available

MIT licence

  • The CLI and the MCP server
  • The review interface, imitor app
  • imitor export, to publish a run as a static site
  • The run format: plain JSON and PNG files
Read the code on GitHub
Planned, not built

Imitor Cloud

A place where your agents and CI upload runs, and you sign in to review them from any device. It would only store and show runs, never run your code. The plan is to open-source it so you can host your own, and to offer a hosted version as a paid service. No date and no price yet.

Want it? Follow the plan on GitHub

See a run before you install anything.