Pure Jev that can "type" and drive towards task completion. No LLM anywhere: code builds every option from the page and the goal, Jev only picks — and that is enough to fill forms, type, and finish the task.
git clone https://github.com/buluoray/JevOnly.git && cd JevOnly && ./run.shNeeds Python 3.12+, Node.js 22+ and a TypeSafe API key (tsk_…). run.sh creates a venv, installs
Chromium, and opens the live viewer at http://127.0.0.1:7791: paste the key, a start URL and a goal, press
Run, and watch every observation, vote, action, verification, copy and undo as it happens.
Without the viewer:
export TYPESAFE_API_KEY=tsk_…
jevonly run --start https://en.wikipedia.org \
--goal "On Wikipedia, find the tallest building in Seattle and the tallest building in Portland, Oregon. Note the height in meters of each." \
--variant noaccept_kb --out events.jsonlThat goal ends in about 20 steps, 80 Jev calls and 30 seconds with the answer 286; 166.
The recordings above, in full quality (click to play):
jevonly-google-flights.mp4
jevonly-wikipedia.mp4
No planner model, no helper LLM, no free text. Every step is a closed question to Jev over options the code enumerated from the page, the goal and a register of copied values:
- Observe the page (accessibility snapshot of enabled controls and visible text).
- Vote: one request answers done?, off path? and which action next?
- Bind values: a field can only receive a fact, a span of the goal (a name, a date, or a stretch of the goal's own words Jev narrows down to), or a value copied from the page — never invented text.
- Act and verify: Chromium performs the action; Jev compares before and after. Failures are undone.
- Stop when Jev says so, when every value the goal asked for is in hand, or when a code-owned check passes.
Irreversible actions (a risk vote ≥ 0.5) go through a gate: refuse (CLI default), ask (viewer default),
or allow. Details: How it works · Architecture ·
Events · FAQ.
The rules in jevonly.core are environment-agnostic; the browser (jevonly.envs.browser) is the first
environment. See Writing an environment.
The same loop, pointed at a site you own, is a cheap regression tester: a suite of closed tasks, each run several times, one pass/fail row per case, every run's event log kept for replay.
jevonly qa suite.jsonl --repeat 3 --out qa-out/One case per line:
{"id": "cart-badge", "start": "https://staging.shop.example/", "facts": {"sku": "A-1"},
"goal": "Add the product with the given sku to the cart and stop when the cart badge shows 1",
"expect": {"text": "Cart (1)", "answer": ["1"]}}expect.text / expect.url_contains / expect.selected is a code-owned check on the page — the run passes
only when the page really shows it, whatever Jev says. expect.selected names a control (by accessible name)
whose ARIA state must read selected, pressed or checked, for end states that are a choice rather than text.
expect.answer lists substrings the reported answer must contain. The
command prints a table (pass count, median steps, seconds, Jev calls, tokens, estimated cost, why a run
failed), writes qa-report.json + qa-report.md, and exits non-zero when any run failed. A case costs
about a cent per run (measured: $0.014 for a 20-step task).
- The viewer binds to
127.0.0.1only; the key stays in the tab'ssessionStorageand the local process. - The goal, facts and page observations are sent to TypeSafe. Point it at pages you are willing to send there.
- Nothing irreversible runs by default (see the gate above). Screenshots and replays never leave the machine.
- English-centric goal splitting; sites that block automation are treated as walls, not bypassed.
- One run at a time per viewer; without a code-owned check, stopping is Jev's judgment.
make install && make test && make lintApache-2.0. Docs start at docs/README.md.

