| name | browser |
| description | Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. |
| allowed-tools | Bash(browser:*), Bash(agent-browser:*) |
Browser Automation with browser
The browser CLI uses Chrome/Chromium via CDP directly. It is powered by agent-browser.
Core Workflow
Every browser automation follows this pattern:
- Navigate:
browser open <url>
- Snapshot:
browser snapshot -i (get element refs like @e1, @e2)
- Interact: Use refs to click, fill, select
- Re-snapshot: After navigation or DOM changes, get fresh refs
browser open https://example.com/form
browser snapshot -i
browser fill @e1 "user@example.com"
browser fill @e2 "password123"
browser click @e3
browser wait --load networkidle
browser snapshot -i
Command Chaining
Commands can be chained with && in a single shell invocation. The browser persists between commands via a background daemon, so chaining is safe and more efficient than separate calls.
browser open https://example.com && browser wait --load networkidle && browser snapshot -i
browser fill @e1 "user@example.com" && browser fill @e2 "password123" && browser click @e3
browser open https://example.com && browser wait --load networkidle && browser screenshot page.png
When to chain: Use && when you don't need to read the output of an intermediate command before proceeding (e.g., open + wait + screenshot). Run commands separately when you need to parse output between steps (e.g., snapshot to discover refs, then interact using those refs).
Handling Authentication
When automating a site that requires login, choose the approach that fits:
Option 1: Import auth from the user's browser (fastest for one-off tasks)
browser --auto-connect state save ./auth.json
browser --state ./auth.json open https://app.example.com/dashboard
Option 2: Persistent profile (simplest for recurring tasks)
browser --profile ~/.myapp open https://app.example.com/login
browser --profile ~/.myapp open https://app.example.com/dashboard
Option 3: Session name (auto-save/restore cookies + localStorage)
browser --session-name myapp open https://app.example.com/login
browser close
browser --session-name myapp open https://app.example.com/dashboard
Option 4: Auth vault (credentials stored encrypted, login by name)
echo "$PASSWORD" | browser auth save myapp --url https://app.example.com/login --username user --password-stdin
browser auth login myapp
Option 5: State file (manual save/load)
browser state save ./auth.json
browser state load ./auth.json
browser open https://app.example.com/dashboard
See references/authentication.md for OAuth, 2FA, cookie-based auth, and token refresh patterns.
Credentials & Secrets Convention
Never read secret files directly into your context. Always pipe them via shell commands so credentials stay out of the conversation.
cat ~/secrets/github_pat | browser auth save github --url https://github.com/login --username max --password-stdin
curl -H "Authorization: Bearer $(cat ~/secrets/api_key)" https://api.example.com
For browser logins, prefer the auth vault. When saving credentials for a website:
- Store them directly in the auth vault (not in ~/secrets)
- Create a reference file in ~/secrets so it's discoverable:
echo "$PASSWORD" | browser auth save servicename --url https://app.example.com/login --username user --password-stdin
echo "Managed by browser auth vault. Use: browser auth login servicename" > ~/secrets/servicename-browser
This way ls ~/secrets/ shows all available credentials at a glance, but browser logins are managed securely by browser.
Essential Commands
browser open <url>
browser close
browser snapshot -i
browser snapshot -i -C
browser snapshot -s "#selector"
browser click @e1
browser click @e1 --new-tab
browser fill @e2 "text"
browser type @e2 "text"
browser select @e1 "option"
browser check @e1
browser press Enter
browser keyboard type "text"
browser keyboard inserttext "text"
browser scroll down 500
browser scroll down 500 --selector "div.content"
browser get text @e1
browser get url
browser get title
browser get cdp-url
browser wait @e1
browser wait --load networkidle
browser wait --url "**/page"
browser wait 2000
browser wait --text "Welcome"
browser wait --fn "!document.body.innerText.includes('Loading...')"
browser wait "#spinner" --state hidden
browser download @e1 ./file.pdf
browser wait --download ./output.zip
browser --download-path ./downloads open <url>
browser network requests
browser network route "**/api/*" --abort
browser network har start
browser network har stop ./capture.har
browser set viewport 1920 1080
browser set viewport 1920 1080 2
browser set device "iPhone 14"
browser screenshot
browser screenshot --full
browser screenshot --annotate
browser pdf output.pdf
browser clipboard read
browser clipboard write "text"
browser clipboard copy
browser clipboard paste
browser diff snapshot
browser diff snapshot --baseline before.txt
browser diff screenshot --baseline before.png
browser diff url <url1> <url2>
Batch Execution
Execute multiple commands in a single invocation:
echo '[
["open", "https://example.com"],
["snapshot", "-i"],
["click", "@e1"],
["screenshot", "result.png"]
]' | browser batch --json
browser batch --bail < commands.json
Common Patterns
Form Submission
browser open https://example.com/signup
browser snapshot -i
browser fill @e1 "Jane Doe"
browser fill @e2 "jane@example.com"
browser select @e3 "California"
browser check @e4
browser click @e5
browser wait --load networkidle
Data Extraction
browser open https://example.com/products
browser snapshot -i
browser get text @e5
browser get text body > page.txt
browser snapshot -i --json
Parallel Sessions
browser --session site1 open https://site-a.com
browser --session site2 open https://site-b.com
browser session list
Working with Iframes
Iframe content is automatically inlined in snapshots. Refs inside iframes carry frame context, so you can interact with them directly.
browser open https://example.com/checkout
browser snapshot -i
browser fill @e3 "4111111111111111"
Local Files (PDFs, HTML)
browser --allow-file-access open file:///path/to/document.pdf
browser screenshot output.png
Visual Browser (Debugging)
browser --headed open https://example.com
browser highlight @e1
browser inspect
browser record start demo.webm
Security
Content Boundaries (Recommended for AI Agents)
export AGENT_BROWSER_CONTENT_BOUNDARIES=1
browser snapshot
Domain Allowlist
export AGENT_BROWSER_ALLOWED_DOMAINS="example.com,*.example.com"
Output Limits
export AGENT_BROWSER_MAX_OUTPUT=50000
Ref Lifecycle (Important)
Refs (@e1, @e2, etc.) are invalidated when the page changes. Always re-snapshot after:
- Clicking links or buttons that navigate
- Form submissions
- Dynamic content loading (dropdowns, modals)
Annotated Screenshots (Vision Mode)
browser screenshot --annotate
browser click @e2
Use when: unlabeled icon buttons, visual layout verification, canvas/chart elements, spatial reasoning needed.
Semantic Locators (Alternative to Refs)
browser find text "Sign In" click
browser find label "Email" fill "user@test.com"
browser find role button click --name "Submit"
browser find placeholder "Search" type "query"
browser find testid "submit-btn" click
JavaScript Evaluation
browser eval 'document.title'
browser eval --stdin <<'EVALEOF'
JSON.stringify(
Array.from(document.querySelectorAll("img"))
.filter(i => !i.alt)
.map(i => ({ src: i.src.split("/").pop(), width: i.width }))
)
EVALEOF
browser eval -b "$(echo -n 'Array.from(document.querySelectorAll("a")).map(a => a.href)' | base64)"
Session Management and Cleanup
Always close your browser session when done:
browser close
browser --session agent1 close
Auto-shutdown after inactivity:
AGENT_BROWSER_IDLE_TIMEOUT_MS=60000 browser open example.com
Deep-Dive Documentation
Ready-to-Use Templates