v0.1 · MCP server + CLI · MIT
Claude Code, Codex or any MCP client sends a goal. TypeSafe Jev picks the next click or keystroke in about 300 ms. Your agent supplies the text to type, reads the page, and gets control back when jev-ra cannot continue.

jev-ra median of 5 runs vs browser-use 0.13 flash_mode with gemini-3-flash, same Chrome, same OpenRouter key, 2026-09-18. The headline stays at 3-5x because even our median against browser-use's fastest single run is 5.8x / 5.6x / 4.6x. Method and raw rows in BENCHMARKS.md.
Demo
The browser draws this from the log of one Google Flights run made on 2026-09-18. Each click, typed value and timing comes from that log. It is not a video.
Source: demo.js (a dependency-free SVG replayer) fed by demo-run-flights.json. Raw screen recordings of the benchmark tasks are in assets/demo/.
Loop
Each step is five operations. The only network call is one request to Jev with typed questions. jev-ra builds no prompt and generates no text, and model output is never used as a selector or as script.
Wall time divided by steps on the Wikipedia task (23.1 s / 4 vs 4.3 s / 6, 2026-09-18). A jev-ra step is one decision of about 300 ms plus the page's own load and settle time.
Request
Jev is a decision model. jev-ra sends the page as state with five typed questions and gets back a chosen option with probabilities and two yes/no answers with confidence. A step costs about $0.00025 and there is no prose to parse.
request · state + questionsPOST /decisions
answers · 312 mstypesafe/jev-1.13
Question ids and instruction texts are the ones in jev_ra/decide/questions.py; the answers shown are an example. Values your agent passes are chosen by name; jev-ra does not invent strings to type.
Architecture
Your agent talks to jev-ra over MCP (stdio). jev-ra drives Chrome over the DevTools Protocol and calls Jev over HTTPS once per step.
stale instead of a wrong click.Escalation
A run that cannot finish returns one of eight reasons, the top candidates and the page text, so the agent can act without observing again.
needs_valuea field needs a string you did not supply. Add it to values, call again.stuck_loopthree steps, no page change. Read the text, click one candidate, continue.unverified_doneJev says done, no visible proof. Check with browser_extract.stalethe page kept changing under it. browser_wait(), retry once.budgetsteps or time ran out. Narrow or split the goal.too_many_controlsover 250 controls in view. Scroll or open the section first.blockedlogin, captcha, empty results. Tell the user; do not retry blindly.invalid_decisionan answer not on the page, twice. Re-observe and drive one step yourself.Benchmarks
jev-ra bench --live reproduces every number below: browser-use and jev-ra in the same Chrome with the same key.
| Task | browser-use flash_mode | browser-use default | jev-ra | ratio |
|---|---|---|---|---|
| Wikipedia: open the Gödel incompleteness article | 23.1 s · 4 steps | 46.5 s · 5 steps | 2.7 s · 2 steps | 8.5x |
| Google Flights ZRH→LON one-way, 7 checks verified | 66.4 s · 11 steps | 63.6 s · 11 steps | 8.9 s · 11 steps | 7.5x |
| Olive Young category: sort by newest | 15.1 s · 3 steps | 17.5 s · 3 steps | 3.8 s · 2 steps | 4.0x |
jev-ra columns are medians of 5 runs (5/5 success each); browser-use columns are the single baseline runs, and its own 5-run medians are slower (24.6 s / 73.8 s / 27.6 s). BENCHMARKS.md carries p90, cost per task and the per-step time breakdown.
Install
An OpenRouter key is enough; no TypeSafe account is needed. jev-ra doctor checks the key, Chrome and one live decision.
export OPENROUTER_API_KEY=sk-or-... uvx jev-ra install claude uvx jev-ra doctor # then in Claude Code: "search the web for X and summarise"
export OPENROUTER_API_KEY=sk-or-... uvx jev-ra install codex uvx jev-ra doctor # Codex asks you to trust the new MCP server once
export OPENROUTER_API_KEY=sk-or-... npx -y jev-ra install claude # or: install codex
{
"mcpServers": {
"jev-ra": { "command": "uvx", "args": ["jev-ra", "mcp"], "env": { "OPENROUTER_API_KEY": "sk-or-..." } }
}
}uvx jev-ra run https://en.wikipedia.org/wiki/Main_Page \ "Find and open the article about Gödel's incompleteness theorems" --json uvx jev-ra search "python 3.12 release date" "the exact release date, with source" uvx jev-ra doctor
If an agent installs this for you, point it at AGENTS.md: install steps, the tool table, what to do on each escalation, and cost.
Limits
These return an escalation with a reason.