Skip to content
MrJev

Jev Browser

Headless browser automation through an MCP server, CLI, or library. Jev picks one action per step.

View on GitHub →

Hands-on review

A well-documented headless browser agent with an auditable trace. Worked on simple pages, but typing presses Enter, which can submit forms you meant to fill.

Good for

  • Agents that need to reach a page and read it, through MCP, a CLI, or a library
  • Developers who want every step's choice, confidence, and stop signals in the result
  • Running headless and isolated, away from your everyday browser profile

Watch out for

  • Every typing step presses Enter, so filling a form field can submit the form
  • Fields labeled only with a <label> element aren't offered to Jev at all
  • `npx` installed no Chromium before 0.4.1, so the first run failed; fixed

Tested Sep 19, 2026 at 8d90c51 · in · v0.4.0 on Node 24 in Docker with real Jev calls, against a local test site; a stub typing model. Install re-checked on 0.4.1

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.

More in Browser & Computer Use

jev-ultrafast

★ 24k▲ 400

browser-use/jev-ultrafast

Fast browser agent from Browser Use. Jev decides each step and which element to act on; a small model is called only when text needs to be typed. The authors report a full Google Flights search in about 7.1 seconds.

PythonReviewed

agent-desktop

★ 8.5k▲ 6.6k

vercel-labs/agent-desktop

macOS desktop automation over accessibility trees. Since v0.9.2, its jev-desktop scripts let Jev choose which control to operate and which action to take.

RustReviewed

typesafe-computer-use

★ 1.3k▲ 16

awlevin/typesafe-computer-use

macOS computer use without sending screenshots to a large model. The screen is read deterministically and Jev picks the next action.

PythonReviewed

Get new Jev projects every week

New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.

Powered by Buttondown. See our privacy policy.