Describe a task. Jev picks every next move in a live cloud browser you watch in an iframe.
Two keys, both required:
TYPESAFE_API_KEY— from console.typesafe.aiKERNEL_API_KEY— from dashboard.onkernel.com
Without them the page says which one is missing and asks nothing, rather than
failing on the first click. /api/config reports the gap.
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.
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.
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.
Everything in this section is from Steve of Val Town, who got this up and running — thanks, Steve.
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.
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:
- 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. - A candidate's centre could sit below the fold. The measured page had one
at
y=519in 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. - Nothing below the fold was reachable at all. Every candidate is now
tagged with
data-jevin the live DOM, soact()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.
- 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_STEPSinindex.ts. Wikiracing often needs more.
See AGENTS.md for the file map.