Sign inRequest access

Your agent tested it. Where’s the proof?

Simbase runs the build on a warm simulator and turns the result into a page you can send someone: named screenshots, the exact steps taken, a verdict, and a link for the PR.

We’ll email a link to confirm. What we keep.

Have an invite? Sign up

Passed · 16/16 steps · 14.3s on device

E2E iOS: sign in and enable beta (REST) · iPhone 17 Pro · iOS 26.3 · DemoApp.app.zip · 23 Sep 2026 · 02:33 UTC

  1. video.mp4 · 12.1sthe whole run, at 1×
  2. iOS screenshot, login-filled: The DemoApp sign-in screen with demo@example.com and a masked password entered.
    type "hunter2"login-filled
  3. iOS screenshot, counter: The Counter screen reading 2, above an Increment button.
    tap #increment_buttoncounter
  4. iOS screenshot, beta-enabled: Settings, with the Beta Features toggle on and the line "Beta features are ON".
    tap #beta_togglebeta-enabled
  1. 0.0slaunched
  2. 4.9s+6 steps
  3. 8.2s+4 steps
  4. 11.1s+3 steps
  1. 1launch1.8s
  2. 2wait_for #email_field267ms
  3. 3tap #email_field774ms
  4. 4type "[email protected]"558ms
  5. 5tap #password_field998ms
  6. 6type "hunter2"475ms
  7. 7screenshot "login-filled"
  8. 8tap #sign_in_button1.1s
  9. 9wait_for #count_label315ms
  10. 10tap #increment_button1.0s
  11. 11tap #increment_button948ms
  12. 12screenshot "counter"
  13. 13tap "Settings"944ms
  14. 14wait_for #beta_toggle428ms
  15. 15tap #beta_toggle1.5s
  16. 16screenshot "beta-enabled"

A real run from our end-to-end suite, shown as its evidence page shows it. DemoApp is our test fixture; the recording, screenshots and timings are the run’s own.

Same sixteen steps. Both platforms.

One run request, pointed at an iPhone and then a Pixel. You ask for beta-enabled, you get beta-enabled, on each. The timings are each device’s own.

iPhone 17 Pro · iOS 26.3

run_4v67jqncv63ctshr · over REST

  1. iOS screenshot, login-filled: The DemoApp sign-in screen with demo@example.com and a masked password entered.
    type "hunter2"login-filled
  2. iOS screenshot, counter: The Counter screen reading 2, above an Increment button.
    tap #increment_buttoncounter
  3. iOS screenshot, beta-enabled: Settings, with the Beta Features toggle on and the line "Beta features are ON".
    tap #beta_togglebeta-enabled
  1. 4.9s+6 steps
  2. 8.2s+4 steps
  3. 11.1s+3 steps

Passed · 16/16 steps · 14.3s on device

Pixel 7 · Android 15 (API 35)

run_y9qsa3k0rrrxmsrw · over MCP

  1. Android screenshot, login-filled: The DemoApp sign-in screen with demo@example.com and a masked password entered.
    type "hunter2"login-filled
  2. Android screenshot, counter: The Counter screen reading 2, above an Increment button.
    tap #increment_buttoncounter
  3. Android screenshot, beta-enabled: Settings, with the Beta Features toggle on and the line "Beta features are ON".
    tap #beta_togglebeta-enabled
  1. 11.1s+6 steps
  2. 21.4s+4 steps
  3. 29.0s+3 steps

Passed · 16/16 steps · 31.0s on device

The output is the point.

Every run ends in one link, private by default. Your reviewers get in with GitHub if they can read the repo. Make a run public when you want to show someone else.

Passed · 16/16 steps · 14.3s on device

Every step ran and every screenshot was taken.

Failed

Something your steps expected didn’t hold. A verdict on your app.

Error

The build, the install or the harness broke. Not a verdict on your app, not billed.

Where the time went

14.4s end to end, 14.3s of it on the device. Device time is the bill; the 38ms in the queue is not.

  • queue38ms
  • prepare22ms
  • install1.2s
  • launch1.8s
  • steps9.3s

The exact steps, to run again

Every action taken, in order, with timings. Keep them in the repo and every run after this one is the same run. Paths on our machines are printed as <artifact>, never in full.

replay.json
// Replay these steps: POST /v1/runs, or the run_device_test tool
{
  "app": { "artifactId": "art_rkxfx31yvrgtsq50" },
  "steps": [
    { "action": "launch" },
    { "action": "wait_for", "id": "email_field", "timeoutMs": 15000 },
    { "action": "tap", "id": "email_field" },
    { "action": "type", "text": "[email protected]" },
    
    { "action": "tap", "id": "beta_toggle" },
    { "action": "screenshot", "name": "beta-enabled" }
  ]
}

Read where the review happens.

The GitHub App keeps one comment on the pull request and updates it with every run: the verdict, the device, the time and the commit, each with a link to its evidence.

Reviewers who can read the repo open the evidence with GitHub. No Simbase account.

simbasebotcommented 2 minutes agoedited

Simbase device tests

2 passed

ResultTestDeviceTimeCommitEvidence
PassedE2E iOS: sign in and enable beta (REST)iPhone 17 Pro, iOS 26.314s-Evidence
PassedE2E Android: sign in and enable beta (MCP)Pixel 7, Android 15 (API 35)32s-Evidence

This comment updates with each run on the PR. Evidence opens for anyone who can read this repo: sign in with GitHub.

Don’t take your agent’s word for it.

Your agent changed a screen. It can’t see the screen, so it tells you the change works. For backend code you’d run the tests. For a screen, somebody has to look.

That somebody is you, dozens of times a day.

“I am tired of taking screenshots and explaining them to Claude Code while working.”

Title of a DEV Community post

The loop you run by hand, per UI change

  1. Build it
  2. Boot a simulator
  3. Install
  4. Tap through to the screen
  5. Look
  6. Explain it back to the agent
  7. Do it again

Instead: open the link your agent pasted.

Agent in, evidence out.

Your agent drives all four. You read the last one.

  1. Connect

    One MCP server, added once. Claude Code, Cursor, Codex, or plain HTTP from CI.

    claude mcp add simbase …

  2. Upload

    A simulator .app, zipped, or an .apk. From your machine, your CI, or a URL.

    POST /v1/artifacts

  3. Run

    A booted device is leased, your build installed, the steps driven. It takes the screenshots you named.

    run_device_test

  4. Review

    Screenshots, steps, logs and a verdict on one page. Your agent pastes the link into the PR.

    evidenceUrl

What your agent actually sends

A build reference, the steps, the screenshots you want back, and the device. Nothing else. The full shape is in the REST reference.

POST /v1/runs
{
  "app": { "artifactId": "art_rkxfx31yvrgtsq50" },
  "device": { "name": "iPhone 17 Pro" },
  "screenshots": ["beta-enabled"],
  "steps": [
    { "action": "tap", "label": "Settings" },
    { "action": "tap", "id": "beta_toggle" },
    { "action": "screenshot", "name": "beta-enabled" }
  ]
}

No cold boots.

Devices sit booted and idle, waiting. A run leases one, installs your build and starts driving. It doesn’t wait minutes for a simulator to come up.

Between runs the device is reset, and the screen is cleaned of whatever permission dialog the last test left behind. When a device changes hands between organisations, it’s erased.

DeviceModelRuntimeState
simcheck-01iPhone 17 ProiOS 26.3
ready
simcheck-02Pixel 7Android 15 (API 35)
ready
The beta pool as sim_pool_status reported it on 23 September 2026, 08:44 UTC: two devices, both booted and ready, nothing queued. A leased device reads busy until its run ends and it has been reset.

Your agent brings the intelligence. We bring the machine.

There’s no model in the hosted path. Your agent already knows the app. It just changed it, so it writes the steps. Simbase executes them exactly, and nothing else.

That makes a run deterministic: same build, same steps, same screens. It also means there’s no second token bill, and nobody to blame when “the AI tapped the wrong button”.

Taps, typing, swipes, pinches, waits, deep links, dark mode, permission grants. The full list is short.

The last line of every evidence page: Evidence recorded by Simbase on a real simulator. No model judged this run.

A parallel slot costs $249 a month at BrowserStack. Here it’s $12.

We run the hardware ourselves, so there’s no cloud margin to pay for. Start free, no card. The hard cap is on by default.

Free

$0

Runs when the fleet is quiet.

concurrent
1
device-min/mo
200

Indiemost people

$12/mo

One engineer and their agent.

concurrent
2
device-min/mo
2,000

Studio

$49/mo

A small team, every PR checked.

concurrent
4
device-min/mo
8,000

Scale

$149/mo

The front of the queue.

concurrent
10
device-min/mo
30,000

Overage is $0.012 a device-minute, off unless you turn it on. Every plan, in full

Small, and honest about it.

The beta runs on one Mac mini we own, in the UK. That’s the whole fleet, for now. You upload builds to it, so here’s exactly what happens to them.

Read the threat model
  • Your source stays on your machine.

    You upload a compiled build. It’s installed into a simulator and deleted on schedule. The hosted service can’t build from source and can’t name a path on any machine.

  • Nothing listens at our end, either.

    The Macs dial out to the control plane over HTTPS. There are no open ports at the building they sit in.

  • Evidence is private, and it expires.

    Only your organisation can open a run, unless you let in people who can read the repo. Public links are opt-in. Evidence lasts 7 days on Free and up to 180 on paid plans.

  • We never bill our own failures.

    If the harness, the fleet or the network breaks a run, it’s marked error and it’s free.

Objections, answered.

Can’t I just run this on my Mac?

Yes, and for plenty of work you should. Simbase is for when the laptop is closed, the RAM is gone to the agent’s own builds, CI needs it, or you’re reviewing a PR from your phone.

Where does my code go?

Nowhere. You upload a compiled build, it’s installed into a simulator, and it’s deleted on schedule. Source never leaves your machine. How that works →

Is this an AI testing tool?

No. Your agent is the intelligence. Simbase is the device, the executor and the evidence. It runs the steps it’s given and reports what happened.

How is this different from agent-device?

Callstack’s agent-device is a good, MIT-licensed driver for a device you already have. Simbase gives you the device, runs the build on it, and turns the result into something you can send someone.

What does it run on?

iOS Simulator and Android Emulator. No physical devices. iOS builds must be simulator builds — a zipped .app. An .ipa is signed for hardware and won’t install on a simulator.

What if the machine goes down?

Runs wait in the queue, then fail with a clear error if it doesn’t come back. Runs that fail on our side are never billed. We’ll tell you what happened — there’s one of us, and he reads the email.

Will it still be here in a year?

It’s cheap to run: owned hardware and one small server. It doesn’t need funding to survive. Published prices are held for existing subscribers for 12 months, with 60 days’ notice of any change.

Find out before you read the diff.

The beta is invite-only, and small on purpose. Leave your email and we’ll send an invite as the fleet grows.

We’ll email a link to confirm. What we keep.

Have an invite? Sign up

Once you have a key

$ claude mcp add --transport http simbase https://api.simbase.dev/mcp --header "Authorization: Bearer sb_…"

Cursor, Codex and plain HTTP are in the quickstart.