Browser automation with sandboxed scripts. Use when users ask to navigate websites, fill forms, take screenshots, extract web data, test web apps, or automate browser workflows.
A CLI for controlling browsers with sandboxed JavaScript scripts. Scripts run in QuickJS WASM (not Node.js) with a Playwright browser underneath.
Always use snapshotForAI() before interacting with unknown pages. Never hardcode CSS selectors.
dev-browser --headless <<'EOF'
const page = await browser.getPage("main");
await page.goto("URL_HERE");
const snap = await page.snapshotForAI();
console.log(snap.full);
EOF
Based on what snapshotForAI returns, use getByRole():
dev-browser --headless <<'EOF'
const page = await browser.getPage("main");
await page.getByRole('textbox', { name: 'Email' }).fill('value');
await page.getByRole('button', { name: 'Submit' }).click();
await page.getByRole('checkbox', { name: 'Terms' }).check();
await page.getByRole('radio', { name: 'Option A' }).click();
EOF
dev-browser --headless <<'EOF'
const page = await browser.getPage("main");
const data = await page.evaluate(() => {
return Array.from(document.querySelectorAll('h2')).map(h => h.textContent);
});
console.log(JSON.stringify(data));
EOF
browser.getPage("name") keeps state between script runsPromise.all(urls.map((u,i) => browser.getPage("t"+i))) then Promise.all the gotosconst buf = await page.screenshot(); await saveScreenshot(buf, "name.png");--headless. Run dev-browser stop first if switching from headless.dev-browser --headless --timeout 60 for multi-step flowspage.$$eval('select option', o => o.map(x => x.value))dev-browser stop when done to kill daemon--connect with real Chrome