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

Released 15 November 2026.

One suite, every browser

browsers: ["chromium", "webkit"] in the config plays the suite in each engine, one run per engine, and the exit code is red when any of them is. assertScreenshot keeps a baseline per engine, so a WebKit picture is no longer compared with Chromium's.

One test, many cases

// @each SLOTS above a test runs it once per row of a table or a JSONL file, each case with its own verdict and its own name, test_question[slot=2]. --test 'question[slot=2]' runs just that one, instead of a loop where one failure hides the rest.

A phone, touched like a phone

tap, longPress and swipe drive a touch screen on an iPhone profile, and assertNoFocusZoom catches the iOS zoom into a text field under 16px. assertInViewport tells an element in view from one scrolled away, where assertVisible passes on both.

Pick your platform

Same idea, two surfaces — the web and iOS.