How we reviewed this: we ran v0.4.0 in Docker against a small local website with a home page, a pricing page, and a contact form, using a real Jev key. For typing we pointed it at a stub model that logged what it received. Testing on our own site let us see every request the browser made. We didn’t run it on third-party sites.
What it does
jev-browser takes a task and a starting URL and drives a headless Chromium browser until the task is done. Each step, it lists the page’s clickable, typeable, and selectable elements, plus scroll, back, and done. One Jev request asks three questions at once: which action to take, whether the goal is already met, and whether the run is stuck. Code enforces budgets and stops before acting when the goal or stuck signal passes 0.85. The result includes the final page as text, Markdown, HTML, or an accessibility tree, and a trace that records each step’s proposed and executed action and the goal and stuck probabilities.
Jev doesn’t write text. When a step types, a small model you choose (OpenAI, OpenRouter, Anthropic, Google, or any OpenAI-compatible endpoint) supplies the string. Jev calls can also go through OpenRouter, Vercel AI Gateway, or Cloudflare Workers AI instead of TypeSafe directly.
Setup
claude mcp add jev-browser -- npx -y @jkudish/jev-browser
# or: npx -y @jkudish/jev-browser run "<task>" <start-url>
It needs Node 20 or newer and a TYPESAFE_API_KEY. The README says Playwright’s Chromium downloads automatically on install. It didn’t in our tests: in a clean container on Node 22 and on Node 24, npx -y @jkudish/jev-browser installed the package without Chromium, and the first run failed with Playwright’s “Executable doesn’t exist” error. The cause was small: in package.json, postinstall sat outside the scripts block, so npm never ran it.
Fixed in 0.4.1, merged and published within hours of our fix. We checked the published package rather than the changelog: postinstall is inside scripts in the 0.4.1 tarball, a fresh npm i @jkudish/jev-browser@0.4.1 leaves chromium-1243 and the headless shell in the Playwright cache, and the first run against a local page now stops on the missing TYPESAFE_API_KEY rather than on a missing browser. On a bare image you still need the usual system libraries (npx playwright install-deps chromium).
Using it
- Navigation worked. Asked for the Pro plan’s price, it clicked Pricing and stopped, and the returned page text included the price. Our server saw just the two page loads.
- Fields labeled with
<label> are invisible. On a contact form whose fields were labeled with <label> elements, the agent could only scroll and was stopped by the stuck check. Field names come from aria-label, placeholder, title, or the element’s own text, not from <label>, and fields with an empty name are dropped. This is already reported upstream (#1), with a fix proposed (#3).
- Typing submitted a form it was told not to. On the same form with placeholder text, we asked it to fill in a name and an email “then stop. Do not submit the form.” It typed the name, and the form was submitted with only that field filled. The code presses Enter after every fill, which is handy in search boxes but submits most forms. Jev never chose to submit. The README’s own example of filling a contact form without submitting didn’t hold on this ordinary HTML form. We’ve reported it, and the maintainer has since split typing into three explicit actions —
type_eN, submit_eN and, on structurally search-like fields only, search_eN — in 800e80b with e2e tests alongside. That is on main; npm is still 0.4.1, which has the old behaviour, so until the next release the caution below stands.
- The trace is excellent. Each step records what was proposed and what actually ran, recoveries, errors, console messages, and failed requests, so it’s easy to audit what happened.
- Typing sends little. The typing model receives only the task, the field’s description, and the URL, not the page.
The README includes timing and cost figures from the author’s own runs. As with all our reviews, we don’t reproduce Jev performance numbers.
Permissions and data
- Page text goes to Jev each step. Requests include the task, the URL and title, a short excerpt of visible text, and every offered element’s label. Password and file inputs are never offered.
- Your typing key is picked automatically. Without configuration, it uses the first key it recognizes among
OPENAI_API_KEY, OPENROUTER_API_KEY, ANTHROPIC_API_KEY, and Google’s keys. If one of those is in the environment for another purpose, it will be used and billed. Set JEV_BROWSER_TYPE_PROVIDER to be explicit.
- It can reach your network. There’s no restriction on which URLs it visits, including
localhost and private addresses. Its security policy says this plainly and recommends running it in a container or a restricted network.
- It’s isolated from your own browser. It starts a fresh headless Chromium with no profile, so your logins and cookies aren’t involved.
Maintenance
Very active: 29 commits in its first three days, versioned npm releases with a changelog, CI, a security policy, and a contribution guide. It’s MIT licensed, and the maintainer merged an outside packaging fix and published 0.4.1 the same day it was sent.
Verdict
jev-browser is a thoughtful, well-documented browser agent. Its three-question step design and auditable trace are worth studying, and for “go to this page and read it” tasks it works well. Be careful with anything that types. Until the Enter-after-typing behavior changes, don’t point it at forms that send messages, place orders, or change settings, and keep allow_typing off when you only need to read. From 0.4.1 the install itself is one command again.
For a browser agent whose model output is never executed as code and that rechecks every action against the page, see jev-ultrafast. For phones, see Mobile Jev. Our best Jev tools roundup compares them.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 21, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.