Ying-Kai-Liao/jev-browser on GitHub
- Stars
- 82
- Forks
- 13
- Language
- JavaScript
- License
- MIT
- Last push
- 22 Sep 2026
Read from GitHub on . Counts change daily.
Reported by the author
- Task accuracy
- 40/42
40/42 correct in the latest run, 0 false "done" claims
github.com - Checkout time
- ~14s
a 5-step checkout takes ~14 s end to end
github.com - Token reduction
- ~5x less
median 5× per task
github.com
jev-browser splits browser automation into two roles: an LLM (Claude, over MCP) plans and says what outcome it wants one step at a time, and Jev decides the tactical details. Each round, code turns the current page into a text description, and a single roughly 300 ms Jev call answers several questions at once: which element, which action, which value, and whether the step is done, blocked, showing an error, or about to do something irreversible. Playwright then performs the chosen action, and the calling LLM never has to read a page snapshot unless it explicitly takes over.
Because Jev only returns probability distributions, yes/no, a choice among options, or a rating, it never writes free text itself; any free-form value like form text comes from the calling LLM as a candidate, and code turns low confidence or disagreement into a status the LLM can act on.
Measured against 42 tasks across 16 categories on live sites, the author reports 40 of 42 correct in the latest run with zero false “done” claims, up from 38 of 41 across two earlier runs before recent fixes. Most steps take 2 to 4 Jev calls at roughly 300 ms each, so a 5-step checkout runs in about 14 seconds end to end. Across roughly 200 rounds, the pause before irreversible actions flagged only one button: saucedemo’s “Finish” (place order). The author’s own estimate against a Playwright-MCP-style loop on the same tasks shows a median 5 times less page content reaching the LLM.
How it uses Jev
import { fileURLToPath } from "node:url";
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
export const API_URL = process.env.JEV_API_URL || "https://api.typesafe.ai/v1/systemone";
export const MODEL = process.env.JEV_MODEL || "jev-latest";
const sleep = ms => new Promise(r => setTimeout(r, ms));
const KEY_NAMES = ["TYPESAFE_API_KEY"];
let cachedKey;


