Your agent writes the E2E tests.
You review and commit.
unotest is AI-native end-to-end testing. Your AI agent drives your real app over MCP and writes clean, reviewable tests in your repo — for web and for iOS.
Works with Claude Code · Cursor · Codex
unotest web
E2E for web apps. Playwright-vocabulary DSL on a sandboxed engine, driven by your agent over MCP.
unotest mobile
E2E for iOS apps (React Native + native Swift). The agent drives the Simulator through the accessibility tree.
Full control
AI does the work. You keep control.
The whole point: speed from the agent, ownership stays with you.
Plain .js in your repo
Tests are ordinary JavaScript in unotest/e2e/*.js. Git, code review, CI — no proprietary format, no binary blob.
No silent fixes
agent_fix composes context and a suggestion — it never calls an LLM itself and never applies a patch on its own. You read the diff and commit.
Runs locally
Everything runs on your machine. Your app never leaves it. No cloud, no account to start.
Safe to run blindly
Scenarios execute in a sandboxed AST interpreter — no require, no fetch, no filesystem. AI-generated tests can run without surprises.
What's new
unotest 0.49.1
Released 11 October 2026.
Scenarios read like the JavaScript you write
let and const, lambdas in filter, map, find and some, arr[i] = v, sortBy and split work as you expect, and && and || short-circuit, so a null guard no longer fails. Assertions take a variable or arr[i] as the expected value, and skip(reason) works anywhere in a test's body.
@expect-fail in runs and collections
A test marked @expect-fail that fails is reported as failed on purpose in e2e and in a collection, and a collection whose only failures are on purpose exits 0. bundle push --follow reads the marker the same way. A marked test that passes, or one whose script breaks, turns the run red instead of hiding.
Box runs that explain themselves
A run of one test names it as file › test in box runs, box queue and notifications, and a test the file does not have is refused when the run is ordered. A collection whose prepare failed says so under --follow and in box run, and a run paused on a failure with nobody attached frees the queue after 30 minutes.