This site is available as Markdown for AI agents. For the full index, see llms.txt.
AI-native · MCP-native · local-first

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

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.50.0

Released 14 October 2026.

Scenarios are JavaScript

Scenarios are read by a new JavaScript parser and run by a new interpreter: try / catch / finally, switch, Map and Set, the familiar string, array, Math and JSON methods. lint, run, e2e, the viewer and the editor typings all read the language the same way, and an extra argument to a DSL call is an error everywhere, not only in lint.

Failed or errored, said the same everywhere

A check that did not hold is failed ✗, a script that could not do what it was asked is errored ‼, decided by the error's class, not its wording. e2e, collection, box runs and the viewer count and paint it the same way, and a spent step or memory budget is errored, not failed.

A scenario cannot take the runner down

A huge string or array, an endless loop or a run that keeps too much memory now stops with the reason instead of exhausting the runner, and large variables no longer slow a run down. A scenario no longer reads the runner's own credentials, and page code built from scenario values is refused before it runs.

Pick your platform

Same idea, two surfaces — the web and iOS.