jev-browser-use
Fast browser QA for pi: TypeSafe Jev picks every click through Jev Ultrafast, you supply the text and the pass condition, the page is checked independently.
Package details
Install jev-browser-use from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:jev-browser-use- Package
jev-browser-use- Version
0.4.0- Published
- Sep 28, 2026
- Downloads
- 128/mo · 128/wk
- Author
- damian87
- License
- MIT
- Types
- skill
- Size
- 47.7 KB
- Dependencies
- 0 dependencies · 0 peers
Pi manifest JSON
{
"skills": [
"./skills"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
jev-browser-use
Fast browser QA from Claude Code or pi. You write the goal, the text to type and what counts as a pass. TypeSafe Jev picks every click through Jev Ultrafast. The runner checks the final page itself, because the agent saying DONE proves nothing.
python3 skills/jev-browser-use/scripts/jev_browser_agent.py \
--url https://en.wikipedia.org/wiki/Main_Page \
--goal "Use the search box to find and open the article about the Rosetta Stone." \
--allow-hosts wikipedia.org --expect 'Rosetta Stone' \
--text "Search Wikipedia=Rosetta Stone" --json
typesafe: present(len=107) model=jev-latest
text helper: (absent) model=google/gemini-2.5-flash base=https://openrouter.ai/api/v1
browser: our own Chrome (pid=906154, port=36173, throwaway profile) — closed on exit
tick 1 867 ms actions=0 status=ready last=-
tick 2 1303 ms actions=0 status=ready last=-
tick 3 1780 ms actions=1 status=ready last=fill
tick 4 2666 ms actions=2 status=ready last=click
tick 5 3433 ms actions=2 status=ready last=click
tick 6 3953 ms actions=2 status=done last=click
final_url: https://en.wikipedia.org/wiki/Rosetta_Stone
independent check for 'Rosetta Stone': PASS
That run is real (2026-09-23, jev-latest). The key came from .env, and no text model was involved.
What it gives you
- Jev picks, you type. Jev chooses which field to type into.
--text 'LABEL=VALUE'(repeatable) supplies the value: an exact label match first, otherwise the one label contained in the field's label, ignoring case. No text model is called, and the value never leaves your machine. - It stops instead of guessing. If Jev picks a field you didn't name, the run stops before typing and reports
"needs_text": "<field label>". Re-run with that label. - Its own browser. It launches a headless Chrome on a throwaway profile and closes it on exit. Your everyday browser is never attached to.
- Guard rails.
--allow-hostsaborts the run the moment the page leaves the allowlist.--max-tickscaps the number of Jev calls. - Risky clicks are refused. By default, clicks labelled send, submit, pay, buy, checkout, delete, publish and the like never reach the browser. The run stops and reports
blocked_clickinstead. Tested on a local form whose goal said to press Send: the guarded run made 0 requests, and the control run with--never-click ''submitted. - An independent pass.
--expectmust appear in the live title,<h1>or URL. For forms,--expect-field 'LABEL=VALUE'reads the live field values instead. Exit codes: 0 pass, 4 not verified, 5 left the allowlist, 2 refused to start. - Waits for real pages. It waits for the page to stop changing before the first decision, and for a scroll to actually land before Jev looks again. Without this, a GoDaddy-built site failed 5 of 5 runs; with it, 3 of 3 passed.
Install
Claude Code
/plugin marketplace add damian87x/jev-browser-use
/plugin install jev-browser-use@jev-browser-use
For a single session: claude --plugin-dir /path/to/jev-browser-use. The skill is /jev-browser-use:jev-browser-use.
pi
pi install npm:jev-browser-use # user-wide, from npm
pi install git:github.com/damian87x/jev-browser-use # or straight from GitHub
pi install -l git:github.com/damian87x/jev-browser-use # this project only
Headless pi -p with a project-local (-l) install needs -a to trust the project's files. Without it, pi waits silently on the trust prompt.
Once per machine, for both
git clone https://github.com/browser-use/jev-ultrafast ~/jev-ultrafast
(cd ~/jev-ultrafast && uv sync) # or set JEV_ULTRAFAST_REPO to another checkout
You also need Chrome or Chromium; set BH_CHROME_PATH if it isn't found on its own.
The Jev key (console), first match wins:
TYPESAFE_API_KEYin the environmentTYPESAFE_API_KEY=in the nearest.envat or above the working directory (keep it gitignored)~/.pi/agent/secrets/typesafe_api_key- macOS Keychain, service
Hermes TypeSafe API
A text-model key (TEXT_MODEL_API_KEY, or OPENROUTER_API_KEY) is optional. It's used only for fields you didn't name with --text.
Measured on a real site (2026-09-24)
This is the contact form on autonoxis.com, a GoDaddy-built site with a cookie banner that blocks scrolling. Jev accepted the banner, scrolled, filled Name, Email and Message, then chose DONE: 5 actions in 6–8 decision ticks (jev-1.13.0, ~220–660 ms per call), 3 of 3 runs, all confirmed by --expect-field. It never pressed Send. With one expected value deliberately wrong, the same run failed with exit 4. With an invalid key, TypeSafe returned 401 and zero actions ran.
Limits
These come from Jev Ultrafast's DOM reader: no shadow roots, iframes, canvas, file uploads or pop-up tabs. A canvas game won't work; use Playwright for that. Don't point it at pages that show passwords, payment details or customer records.
Benchmark
bench/head_to_head.py runs the same flows through /qa-browse twice: once on the Jev fast path, once on the plain playwright-cli loop. It records verdict, path, wall time, Claude cost and the agent's final text for each run. bench/summarize.py turns those rows into a table. Measured results and notes are in bench/RESULTS.md. The benchmark makes live, paid claude -p calls; the tests never do.
Development
python3 -m unittest discover -s tests # offline; no browser, no paid calls
Credits
Derived from the jev-browser-use skill in hermes-jev-skills by Steve Darlow (MIT). Jev Ultrafast is by Browser Use (MIT) and is not bundled. See NOTICE.