Native Rust daemon. Persistent profiles for auth. Headless by default.
Quick One-Shot Commands
agent-browser open https://example.com && agent-browser screenshot /tmp/shot.png
agent-browser open https://example.com && agent-browser screenshot --full /tmp/full.png
agent-browser open https://example.com && agent-browser pdf /tmp/page.pdf
Session-Based Interaction
# 1. OPEN
agent-browser open https://example.com
# 2. WORK
agent-browser snapshot # a11y tree with @eN refs (for AI)
agent-browser click @e12 # click by ref
agent-browser fill @e15 "hello" # fill input by ref
agent-browser screenshot /tmp/shot.png # screenshot
agent-browser eval "document.title" # run JS
# 3. CLOSE — when done
agent-browser close
Authenticated Browsing (Per-Site Profiles)
First-time setup (headed, one-time):
# Close any running daemon first
agent-browser close --all
# Launch headed with persistent profile — log in manually
agent-browser --headed --profile ~/.agent-browser/profiles/<site> open https://example.com
# After login completes, all future runs reuse the profile headlessly
Subsequent runs (headless, automatic):
agent-browser --profile ~/.agent-browser/profiles/<site> open https://example.com
# Auth is automatic — cookies, IndexedDB, cache all persist
To add a new site: Close daemon, run --headed --profile ~/.agent-browser/profiles/<name> once, log in, done.
Auth Vault (Alternative)
agent-browser auth save mysite --url https://example.com --username user --password-stdin
agent-browser auth login mysite # auto-fills login form
agent-browser auth list # show saved profiles
Batch Execution
# Send multiple commands in one shot (fewer tool calls = fewer tokens)
echo '[["open","https://example.com"],["snapshot"],["click","@e12"]]' | agent-browser batch
Advanced Features
# Connect to already-running Chrome
agent-browser --auto-connect snapshot
# Network interception
agent-browser route "**/*.{png,jpg}" abort # block images
agent-browser route "https://api.com/*" mock '{"data":"test"}'
# Device emulation
agent-browser --device "iPhone 15" open https://example.com
# Session persistence (cookies + localStorage by name)
agent-browser --session-name myapp open https://example.com
agent-browser Rules
- Daemon model — first command starts daemon, subsequent commands connect instantly.
- Refs use @eN syntax —
@e12 not e12.
- Profiles persist everything — cookies, IndexedDB, cache, localStorage.
- Close with
agent-browser close or close --all to kill daemon.
Delegating Browser Work to Agents
When you need parallel or background browser work (scraping multiple pages, monitoring), spawn general-purpose agents with browser instructions. No dedicated browser agent type needed — this skill IS the expertise.
Agent(subagent_type="general-purpose", prompt="
Use agent-browser CLI for all browser work.
Commands: open <url>, snapshot, click @eN, fill @eN 'text', screenshot /path.
For authenticated sites: --profile ~/.agent-browser/profiles/<site>
Refs use @eN syntax from snapshots.
[your specific task instructions here]
")
For parallel isolation, each agent uses --session <name>:
Agent 1: agent-browser --session scrape1 open https://site-a.com
Agent 2: agent-browser --session scrape2 open https://site-b.com
Fallback: If agent-browser fails or the site has bot detection, use the Interceptor skill instead.
Legacy built-in agents — DEPRECATED, do not invoke. BrowserAgent and UIReviewer are Claude Code built-ins whose internals cannot be modified; they run browser automation that PAI no longer uses. Route all browser work through the Interceptor skill (verification, authenticated flows) or agent-browser (headless scraping).