How we reviewed this: the browser half needs Codex with Computer Use attached to Chrome, which we cannot drive, so we say that plainly up front. What we did run is the real bridge.mjs — the whole decision loop — in node:24 with --network none, against a tab object of ours that serves accessibility snapshots and records clicks, and a decision endpoint of ours that answers and logs. Everything between the snapshot and the click is the project’s code. We made no Jev calls and did not exercise a browser.
What it is
A Skill, not an application: a SKILL.md telling Codex how to think about browser work, and a bridge.mjs it calls to get one decision at a time. The split is in the tagline — Jev clicks, Codex thinks and verifies. Navigation, clicks, toggles and scrolling go to the decision model; text entry and the final judgement stay with the coding agent.
The model picks from a list code wrote
The page snapshot is parsed, and candidates are built from it before the model sees anything. What that filter does, on a page with a Password field and two buttons both named Delete:
| what we asked for |
what the model was offered |
click Settings, one match on the page |
Click Settings |
click Delete, two controls share the name |
nothing |
click Password, a text field |
nothing |
a type action with text |
refused: Unsupported action |
auto-discovery with keys: ["Enter", "Ctrl+V"] |
Press Enter only |
Ambiguity produces no action rather than a guess. Text fields are never discovered — the comment above that function says so, and the behaviour matches: “Codex supplies and enters text”. Ctrl+V is not in the safe-key set, so it is dropped without comment.
DONE is not done
The four options are the available actions plus DONE, BLOCKED and WAIT. When the model answered DONE at 0.97 confidence, the loop returned:
status=needs_verification handoff=null tab=[click 2]
Not “success”. SKILL.md is blunt about it: “Jev returns needs_verification, never a verified pass. Codex must independently check the requested result using fresh browser state.” A model that answers DONE on the very first step, before anything has been clicked, gets the same treatment — we tried it, and the tab recorded no actions at all.
The stops, all of which fired
Every row is a run we drove:
| what we did |
what the loop did |
clicks |
| served a page on another origin |
threw Browser left authorized origins |
0 |
| changed the page between snapshot and decision |
discarded two decisions as stale_state, executed the third |
0 then 1 |
| returned a click with no visible effect |
no_progress after one attempt |
1 |
answered WAIT three times |
loading_timeout |
0 |
answered BLOCKED |
blocked, handoff model_blocked |
0 |
capped maxSteps at 3 |
step_limit |
3 |
| served a 24 KB snapshot |
threw Snapshot too large; narrow the task |
0 |
| answered at 0.54 confidence |
low_confidence, handed back |
0 |
The stale-state check is the one worth copying. The snapshot is re-read after the decision comes back and before the click lands; if the page moved, the decision is thrown away rather than applied to a page that no longer looks like the one it judged.
And the confidence floor is not a suggestion. Asking for minConfidence: 0.2 does not lower the bar — the run is refused outright with Invalid task contract, along with anything that raises maxSteps above 30 or maxMs above 45 seconds.
What it refuses to believe
The response schema is checked harder than anything else we have reviewed in this category:
| what the endpoint returned |
result |
| probabilities that do not sum to 1 |
Invalid typesafe decision schema |
| a winner that is not the argmax |
rejected |
| a probability key the criteria never offered |
rejected |
| a choice outside the offered set |
rejected |
| HTTP 500 |
decision_error, no retry on a non-transport failure |
In every one of those the tab recorded zero clicks. A malformed answer is not a reason to act.
Credentials
The key is read from a dotenv file named by absolute path in ~/.config/jev-browser-use/config.json, and never copied into the skill directory. Before any request, the assembled body is searched for the key itself: we put the key string into the goal text, and the run stopped with Credential detected in model input.
We ran the installer into a scratch home. It wrote the config 0600 inside a 0700 directory, with the credential nowhere in it or in the skill directory; a second install with different settings left the first config untouched; and it refused a non-Jev model, an unsupported provider, a relative dotenv path, a missing file and a directory. redirect: 'error' on the fetch means a redirected endpoint is a failure rather than a new destination for your Bearer token.
What is unverified, and what others are hitting
The README opens with “~5–10× faster browser operations in our EZCollegeApp workflows”. That is the author’s figure from the author’s workflows; we did not run a browser and are not in a position to check it.
Four issues are open two days after release, and the sharpest is #7: the decision call runs inside Codex’s cua_repl, and on the reporter’s macOS build DNS resolution inside that sandbox fails, so the fetch dies before any Jev call. Its reproduction is a four-line dns.lookup that never touches the credential. If you install this and get a transport failure, read that thread first.
There are no tests and no CI. bridge.mjs is 266 lines with a longest line of 721 characters — the validation in decide() is a single boolean expression spanning most of a screen. The logic is right, as far as we could drive it; nothing about the formatting invites the review it deserves.
Verdict
Read this one for the shape even if you do not use Codex. The candidate list, the stale-state re-read, the unlowerable confidence floor and a success answer that only means go and check are the four things browser agents get wrong, and this gets all four right.
Install it only if you are on Codex with Computer Use working, and check issue #7 against your own platform before concluding the skill is broken. For the browser side actually exercised end to end, see jev-ultrafast and typesafe-computer-use; for the same candidate-set discipline in an agent loop, JevLoop.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 22, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.