Public
Remixed
Describe a task; Jev decides each step in a live cloud browser
ai-agentdemotypesafekernel
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.

Jev Browser Use

Describe a task. Jev picks every next move in a live cloud browser you watch in an iframe.

Setup

Two keys, both required:

Without them the page says which one is missing and asks nothing, rather than failing on the first click. /api/config reports the gap.

How the demo works

The live view is read-only. ?readOnly=true, so a viewer can't fight the agent for the mouse. It's a demo, not a shared remote desktop.

The loop

Rendering mermaid diagram...

The browser drives the loop by calling /api/step repeatedly. That keeps each request short and lets the UI render every step as it lands, which is the whole point of the demo.

What the stages are for

Stage 1 is a filter, not a ranking you should trust. On a fixture where the goal link sits beside a plausible neighbour, stage 1 ranks the neighbour first:

0.708  goal 0.21  closer 0.63  Gustave Eiffel
0.626  goal 0.22  closer 0.52  Search Wikipedia
0.622  goal 0.38  closer 0.39  Eiffel Tower      ← the goal

That's fine. Stage 1 only has to keep the goal in the finalist set, and stage 2 — which sees all 24 finalists side by side — picks the Eiffel Tower. Two atomic questions beat one compound one: the first version asked a single "does this move us closer?", which conflates the goal with a step toward it, and it clicked the biographer. Same cost either way, since questions in a request are evaluated in parallel.

Run it yourself: tests/decide.ts needs no browser.

Background

Everything in this section is from Steve of Val Town, who got this up and running — thanks, Steve.

The thing I went looking for and didn't find

TypeSafe's docs have no computer-use guide. docs.typesafe.ai/demos.md lists exactly one demo (Smart Home Assistant). The wikiracing demo that looks like computer use only exists as a launch-blog demo — no docs page, no code, no walkthrough.

What the blog does say, in its "Nuance" sections, is the whole spec:

Jev supports a cardinality up to 255. For the higher cardinality choices, we do a 2 stage-system of scoring independently then making an explicit choice, hence the occasional slowdown.

The demo is on structured state as a data structure with text, not on images (yet…)

So Jev never sees the screen, and it never emits an action. It has no string output at all — only choice, score, noul. "Browser use with Jev" therefore can't be a model emitting tool calls. It's:

code builds a closed set out of the page → Jev ranks and chooses within it → code does the clicking.

That constraint is the design, not a workaround. Every action is a value Jev was handed, so it cannot invent a selector, hallucinate a URL, or make a type error.

Three bugs a real page found

The perceive() snippet was measured against a live Wikipedia article, not reasoned about — see @stevekrouse/browser-tester's tests/jev-perceive.ts, which runs the exact snippet. All three were real:

  1. Text came from document.body, which on Wikipedia is mostly furniture — "Jump to content Main menu Search Appearance Donate Create account". Jev was being asked to navigate a page whose text was the chrome. Now it reads the content root (article, #mw-content-text, …) and only falls back to the body.
  2. A candidate's centre could sit below the fold. The measured page had one at y=519 in a 513px viewport — an element whose top is on screen can have its centre off it, and the centre is what gets clicked. Centres are now required to be inside the viewport.
  3. Nothing below the fold was reachable at all. Every candidate is now tagged with data-jev in the live DOM, so act() can scroll it into view and re-read where it actually is before clicking. That took the candidate count on the same page from 10 to 195.

Limits, honestly

  • Typing is the weak spot. Jev can't write text, so harvestTexts() pulls quoted phrases out of your task and Jev chooses which to type. A task with no quoted phrase can't type anything. This is the one place the no-strings constraint genuinely costs capability rather than buying safety.
  • No backtracking. There's no history-aware "that didn't work, go back". The recent-actions list is in the state, so Jev can avoid repeating itself, but there's no undo.
  • 12 steps. MAX_STEPS in index.ts. Wikiracing often needs more.

Files

See AGENTS.md for the file map.