
Dev Browser
- 2 installs
- Updated March 25, 2026
- gbasin/dev-browser
Controls a browser with persistent page state via sandboxed JavaScript scripts to navigate, fill forms, screenshot, scrape, or test web apps.
About
A CLI that runs sandboxed JavaScript against a pre-connected browser with persistent page state. A developer uses it to automate navigation, form-filling, screenshots, or scraping without full Node.js access.
- Scripts run in a QuickJS WASM sandbox with saveScreenshot/writeFile helpers
- Guidance to write scripts to .dev-browser/ and avoid heredocs/redirection permission prompts
Dev Browser by the numbers
- 2 all-time installs (skills.sh)
- Ranked #1,839 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
- Data as of Jul 24, 2026 (Skillselion catalog sync)
npx skills add https://github.com/gbasin/dev-browser --skill dev-browserAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 2 |
|---|---|
| Last updated | March 25, 2026 |
| Repository | gbasin/dev-browser ↗ |
What it does
Controls a browser with persistent page state via sandboxed JavaScript scripts to navigate, fill forms, screenshot, scrape, or test web apps.
Files
Dev Browser
A CLI for controlling browsers with sandboxed JavaScript scripts.
Installation
npm install -g dev-browser
dev-browser installUsage
Run dev-browser --help to learn more.
IMPORTANT: Avoid Permission Prompts
Never use heredocs (<<'EOF'), output redirection (2>/dev/null), or semicolons (;) in commands. These trigger "ambiguous syntax" permission prompts in Claude Code.
Instead, always write scripts to `.dev-browser/` in the project root (the current working directory, not the skill directory) and run them with dev-browser run:
// .dev-browser/navigate.js
const page = await browser.getPage("main");
await page.goto("https://example.com");
await page.waitForSelector("body");
console.log(JSON.stringify({ title: await page.title(), url: page.url() }));
const buf = await page.screenshot();
await saveScreenshot(buf, "main.png");dev-browser run .dev-browser/navigate.jsUse .js extension. Use short task-descriptive names (e.g., fill-login.js, scrape-prices.js). If a file exists that you didn't create, add a numeric suffix.
Sandbox Constraints
Scripts run in a QuickJS WASM sandbox, not Node.js:
- No `require()` / `import()` — no module loading
- No TypeScript — plain JavaScript only, everywhere (including
page.evaluate()) - No `fs`, `fetch`, `process` — use
saveScreenshot(),writeFile(),readFile()for I/O (sandboxed to~/.dev-browser/tmp/)
The browser global is pre-connected. Screenshots must use saveScreenshot(buf, name) — not page.screenshot({ path }).