Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
gbasin avatar

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-browser

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs2
Last updatedMarch 25, 2026
Repositorygbasin/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

SKILL.mdMarkdownGitHub ↗

Dev Browser

A CLI for controlling browsers with sandboxed JavaScript scripts.

Installation

npm install -g dev-browser
dev-browser install

Usage

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.js

Use .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 }).

Related skills

Automation & Workflowsfrontendtesting

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.