passe
[!CAUTION]
Passe gives your AI agent full control of a real Chrome browser via the Chrome DevTools Protocol — including navigating to any URL, clicking, typing, reading page content, and executing JavaScript. Only use this if you understand and accept that your agent will have the same browser access as you do. There is no sandbox.
Fast browser automation for AI agents. One WebSocket, one process, no daemon.
The browser was never slow — the agentic loop was. Every MCP tool call costs a model round-trip (1.5–6 seconds depending on the model). A 20-step workflow through an agentic loop means 20 round-trips: 60–120 seconds of waiting for the model, not the browser. Passe takes a different approach: your AI writes a complete script in a line-based DSL, then a single Bash call executes every step via raw Chrome DevTools Protocol at wire speed. Per-action latency is ~20ms.
The landscape
There are dozens of browser automation tools now. This 2×2 captures where they all sit:
The AI scripts it AI feels it out
┌──────────────────────┬───────────────────────────┐
Your │ │ Browser-Use (78K ★) │
Chrome │ ★ passe │ BrowserMCP extension │
(real │ │ Chrome DevTools MCP │
session) │ │ Claude in Chrome │
├──────────────────────┼───────────────────────────┤
Managed │ Playwright │ Stagehand / Browserbase │
browser │ Selenium │ CUA / Operator │
(clean) │ │ Computer Use / Mariner │
└──────────────────────┴───────────────────────────┘
Bottom-left is what we've always had — Playwright, Selenium. Scripted automation against clean browser instances. Test automation.
Bottom-right is the current gold rush — autonomous AI agents driving cloud or sandboxed browsers. Browserbase ($67.5M raised), Browser-Use (78K stars, $17M seed), OpenAI's CUA, Google's Mariner.
Top-right is the extension and open-source wave — autonomous agents riding your real browser session. Claude in Chrome proved the value: your SSO, your cookies, your logins, no credential management. But every action still costs a model round-trip.
Top-left is passe. Same authenticated session access as the top-right tools, but the AI thinks once and the script runs at wire speed. This quadrant is empty except for passe.
See docs/landscape.md for the full competitive analysis with hard numbers.
The numbers
Navigate + screenshot: 213ms (passe) vs ~12,600ms (MCP-based tools)
That's a ~60× speed gap — and it's not the browser. MCP tool schemas alone consume 10,000–15,000 tokens of context before any page content. Each round-trip adds 1.5–6 seconds of model inference. Multiply by 20 steps and you're waiting two minutes for work that takes a few seconds at the wire.
| Scenario | Agentic loop (20 steps) | Passe |
|---|
| Fast model (GPT-4o, ~1.5s/step) | ~30s model time | ~1–5s execution + one model call |
| Mid model (Claude Sonnet, ~3s/step) | ~60s model time | Same |
| Reasoning model (o3, ~6s/step) | ~120s model time | Same |
The model call to write the script is the same cost regardless. The difference is paying it once vs. twenty times.
Install
uv tool install passe
Requires Python 3.11+ and Chrome/Chromium with --remote-debugging-port=9222. Passe auto-starts a debug Chrome instance if none is running.
Quick start
# Screenshot a page
passe run -c 'goto https://example.com; screenshot /tmp/page.png'
# Extract page content as markdown
passe run -c 'fetch https://example.com /tmp/article.md'
# Multi-step scripts use heredoc
passe run - <<'EOF'
goto https://example.com
click-text "Accept Cookies"
wait 500
type "#search" "query"
press Enter
wait-for .results
screenshot /tmp/results.png
EOF
Output is structured JSON — NDJSON per step on stderr, summary on stdout:
{"ok": true, "steps": 2, "total_ms": 213.4, "files": ["/tmp/page.png"], "final_url": "https://example.com/"}
The DSL
One verb per line. Short scripts inline with -c (; as separator), longer scripts as heredoc or .passe files.
| |
|---|
| Navigate | goto back forward scroll |
| Interact | click click-text click-if type fill select press hover |
| Observe | screenshot snapshot read fetch eval eval-to eval-file eval-file-to |
| Control | wait wait-for wait-navigation viewport assert log |
Scout-then-act
When you don't know the page's selectors, scout first:
# Pass 1: discover interactive elements
passe run -c 'goto https://unknown-site.com; snapshot /tmp/elements.txt'
snapshot returns something like: