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.44.0
Released 30 September 2026.
Compare the page with a picture
assertScreenshot checks the page, or one element, against a PNG baseline kept in the repo: a Figma export or a snapshot you accepted. A failed check keeps the expected, actual and diff images, and the viewer shows them side by side on the failed step. e2e --update-screenshots writes new baselines when you decide the page is right.
Any window, any clock
Set the window size, the scale or a Playwright device preset in the config, per MCP call, or mid-scenario with setViewport. clockFreeze, clockTick and clockRun stop and move page time, so a countdown looks the same on every run. The config also takes a time zone and a locale.
Two users in one test, and the stand given back
newContext opens a second browser with its own cookies, so one test can play two clients of the same app. teardown blocks put back whatever the test changed, whether it passed, failed or was stopped. Scenarios also get string members, object literals and indexes anywhere in a chain.
The time budget is a deadline
maxDurationMs now stops a run the moment it runs out, even inside a long action. A run that used to finish green past its budget is now red and names the action that spent it. If a suite turns red after the update, raise the budget or split the scenario.