npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

jev-browser-use

v0.4.0

Published

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.

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-hosts aborts the run the moment the page leaves the allowlist. --max-ticks caps 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_click instead. 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. --expect must 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:

  1. TYPESAFE_API_KEY in the environment
  2. TYPESAFE_API_KEY= in the nearest .env at or above the working directory (keep it gitignored)
  3. ~/.pi/agent/secrets/typesafe_api_key
  4. 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.