Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Browser automation with persistent page state. Use when users ask to navigate websites, fill forms, take screenshots, extract web data, test web apps, or automate browser workflows. Trigger phrases include "go to [url]", "click on", "fill out the form", "take a screenshot", "scrape", "automate", "test the website", "log into", or any browser interaction request.
.claude/skills/sawyerhood-dev-browser/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -64% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -29% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -42% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -50% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -58% | 0% |
CLI for controlling a real Chrome with short Puppeteer scripts. One warm daemon; named pages persist between runs.
bashnpm install -g dev-browser # bun add -g dev-browser works too; the first run downloads the binary if the install script was blocked dev-browser install # only if the first run says "No Chrome found"
Run dev-browser --help (full guide; dev-browser help <topic> for one section) before non-trivial work. Quick start:
bashdev-browser <<'EOF' const page = await browser.getPage("main"); // named page persists across runs await page.goto("https://example.com"); // default waitUntil: domcontentloaded await page.snapshot({ interactive: true }) // ARIA tree with refs; last expression is printed EOF dev-browser -e 'const p = await browser.getPage("main"); await p.click("ref/e6"); await p.waitForLoad(); p.url()'
Gotchas: end lines with semicolons (a line starting with ( continues the previous one); return an object as ({ a, b }); page.click never waits (use waitForSelector first); page names are per browser (--headless and headed are separate Chromes and profiles); refs reset on navigation — re-snapshot; file paths resolve against your cwd (uploadFile, screenshot/pdf path); do not run parallel dev-browser calls against the same named page.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 18,136 | 11,469 | -37% | 1 | 1 | 0% | 3,958 | 1,444 | -64% | 0 | 0 | — |
case-02 | fail→pass | 13,898 | 8,821 | -37% | 1 | 1 | 0% | 1,540 | 1,101 | -29% | 0 | 0 | — |
case-03 | fail→pass | 17,715 | 30,085 | +70% | 1 | 1 | 0% | 2,294 | 1,329 | -42% | 0 | 0 | — |
case-04 | fail→pass | 12,514 | 7,371 | -41% | 1 | 1 | 0% | 1,167 | 582 | -50% | 0 | 0 | — |
case-05 | fail→pass | 12,716 | 6,674 | -48% | 1 | 1 | 0% | 1,180 | 498 | -58% | 0 | 0 | — |
case-06 | pass→pass | 15,061 | 17,993 | +19% | 1 | 1 | 0% | 1,485 | 1,070 | -28% | 0 | 0 | — |
case-07 | pass→pass | 12,076 | 8,198 | -32% | 1 | 1 | 0% | 1,317 | 880 | -33% | 0 | 0 | — |
case-08 | fail→pass | 14,641 | 12,794 | -13% | 1 | 1 | 0% | 1,495 | 747 | -50% | 0 | 0 | — |
case-09 | fail→pass | 17,591 | 7,659 | -56% | 1 | 1 | 0% | 1,923 | 748 | -61% | 0 | 0 | — |
case-19 | pass→pass | 15,128 | 7,574 | -50% | 1 | 1 | 0% | 1,528 | 748 | -51% | 0 | 0 | — |
case-10 | pass→pass | 15,296 | 8,349 | -45% | 1 | 1 | 0% | 1,507 | 913 | -39% | 0 | 0 | — |
case-11 | pass→pass | 17,252 | 9,314 | -46% | 1 | 1 | 0% | 1,785 | 1,008 | -44% | 0 | 0 | — |
case-12 | fail→pass | 10,017 | 6,640 | -34% | 1 | 1 | 0% | 722 | 560 | -22% | 0 | 0 | — |
case-13 | pass→pass | 12,679 | 6,670 | -47% | 1 | 1 | 0% | 1,354 | 605 | -55% | 0 | 0 | — |
case-20 | pass→pass | 12,083 | 9,630 | -20% | 1 | 1 | 0% | 1,232 | 1,146 | -7% | 0 | 0 | — |
case-14 | fail→pass | 13,156 | 8,076 | -39% | 1 | 1 | 0% | 1,310 | 798 | -39% | 0 | 0 | — |
case-15 | pass→pass | 15,277 | 8,019 | -48% | 1 | 1 | 0% | 1,735 | 790 | -54% | 0 | 0 | — |
case-16 | pass→pass | 10,597 | 7,934 | -25% | 1 | 1 | 0% | 864 | 812 | -6% | 0 | 0 | — |
case-17 | fail→pass | 13,730 | 7,203 | -48% | 1 | 1 | 0% | 1,514 | 721 | -52% | 0 | 0 | — |
case-18 | pass→pass | 17,182 | 9,534 | -45% | 1 | 1 | 0% | 1,964 | 1,026 | -48% | 0 | 0 | — |
case-21 | pass→pass | 14,078 | 9,945 | -29% | 1 | 1 | 0% | 1,355 | 1,185 | -13% | 0 | 0 | — |
case-22 | pass→pass | 13,025 | 11,714 | -10% | 1 | 1 | 0% | 1,461 | 1,580 | +8% | 0 | 0 | — |
case-23 | pass→pass | 9,643 | 7,563 | -22% | 1 | 1 | 0% | 843 | 741 | -12% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +43 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/7/2026 | +42% |
Other measured skills in the registry, with their headline benchmark lift.