14 KiB
pi-chrome vs. the rest of the browser-automation landscape
This is the honest "which tool when" page. The browser-automation space has three different layers and people often compare across them — let's not do that.
We benchmark in public — see ../test-suite/. Where exact scores matter (WebVoyager, WorkArena++, BrowseComp, Mind2Web 2), check the live leaderboards; they shift monthly.
TL;DR
| You are… | Use… |
|---|---|
| A Pi agent operator who wants the agent to use your real Chrome (logged-in tabs, cookies, extensions) | pi-chrome |
| Building a Pi/LLM agent and want low-level browser primitives | pi-chrome |
| Writing deterministic end-to-end tests in CI | Playwright / Cypress |
| Building a hosted scraping/agent fleet on isolated profiles | Playwright / Puppeteer + Browserbase / Steel |
| Want a turnkey "natural-language agent" with built-in loop | Browser Use / Stagehand / Skyvern |
| Want a hosted, vendor-managed agent | OpenAI Operator / Project Mariner / Surfer |
| Debugging your own app from your editor without leaving your real session | pi-chrome |
pi-chrome is primitives, not an opinionated agent loop. Think of it as "Playwright for the Chrome you're already signed into" — and pluggable under any agent framework above the line.
The three axes you should compare on
| Axis | Examples | What it gives you |
|---|---|---|
| 1. Driver / transport | Playwright, Puppeteer, Selenium, CDP raw, puppeteer-stealth, pi-chrome |
low-level tools (click, type, navigate) |
| 2. Agent framework | Browser Use, Stagehand, Skyvern, Magnitude, Alumnium, LangGraph-with-Playwright, Operator, Mariner, Surfer | LLM loop, planning, NL API |
| 3. Cloud browser provider | Browserbase, Steel.dev, Hyperbrowser, Anchor, Browserless | managed Chromes, sessions, quotas |
pi-chrome is axis 1. You can wrap it with any axis-2 agent framework, or run it directly from a Pi agent's chrome_* tool calls. It explicitly does NOT compete with axis 3 — it runs locally inside your Chrome.
Axis 1 — drivers (where pi-chrome lives)
| Tool | Transport | Profile | Browser input | Banner when controlling | Default detectable as bot |
|---|---|---|---|---|---|
| Playwright | CDP (own driver) | throwaway by default | always | always ("controlled by test software") | yes (webdriver flag, automation flags) |
| Puppeteer | CDP | throwaway by default | always | always | yes |
| Selenium | WebDriver / BiDi | throwaway | partial (BiDi improves) | always | most detectable |
| puppeteer-stealth / playwright-extra | CDP + patches | throwaway | always | always | medium (patches flags) |
| Raw CDP | direct devtools protocol | either (needs --remote-debugging-port) |
always | always | yes |
| pi-chrome | Chrome extension bridge → local loopback | your real Chrome profile, signed-in cookies, extensions, history | always for input tools | while Chrome input is attached | low (real profile + Chrome input)¹ |
¹ pi-chrome uses chrome.debugger for browser input and shows Chrome's banner like other CDP-based tools. The test-suite/ grades browser-control behavior against common detection signals.
What makes pi-chrome different on this axis
- Profile attach, not driver launch. Every other driver fights cookie persistence, login walls, MFA, and extension state. pi-chrome inherits all of it because it is your Chrome.
- Chrome input against your real profile. Interactive tools use CDP input for reliability while still controlling the Chrome profile you already use.
- Extension bridge transport. No
--remote-debugging-port, no throwaway Chromium. Survives Chrome auto-updates. Works alongside your normal Chrome usage. - Structured action results. Input tools return target coordinates/tags and can include a fresh snapshot (
includeSnapshot) so agents can verify state instead of blindly retrying. - Multi-session shared bridge. Planner + worker + audit Pi sessions all drive the same Chrome concurrently.
- Stable element uids.
chrome_snapshotreturns deterministic uids you can pass to subsequent actions — similar to BrowserGym'sbid, but built into the snapshot tool itself.
Axis 2 — agent frameworks (built on top of axis 1)
These wrap a driver with an LLM loop. They are higher-level than pi-chrome and complementary, not competitors.
| Framework | Driver underneath | Approach | Open source |
|---|---|---|---|
| Browser Use | Playwright | DOM + a11y tree → LLM → action JSON. Open-source leader; widely cited on WebVoyager. | MIT (Python) |
| Stagehand (Browserbase) | Playwright | Natural-language .act() / .observe() / .extract(); deterministic + AI mix. |
MIT (TypeScript) |
| Skyvern | Playwright + own DOM model | Vision-first + DOM; YAML workflows for form/workflow automation. | AGPL (Python) |
| Magnitude | Playwright | NL test authoring; QA-focused. | open |
| Alumnium | Selenium / Playwright | Test-author NL → agent. QA-focused. | open |
| LangGraph / AutoGen + Playwright | Playwright | Generic agent graph + browser tools. | open |
| OpenAI Operator | proprietary | OpenAI's own VLM + browser; ChatGPT-integrated. | closed, hosted |
| Project Mariner (Google) | proprietary Chrome integration | Google's own VLM Chrome experiment. | closed |
| Surfer 2 / Surfer-H (H Company) | proprietary | Hosted proprietary agent stack. | closed, hosted |
| Anthropic Computer Use | OS-level screenshots + mouse/keyboard | Broader than browser; OS-level events. | closed (API) |
Why pi-chrome is not on this list: it's intentionally not an agent. There's no LLM loop, no .act("click the blue button"). Pi handles the loop; pi-chrome provides the primitives. This means:
- You can use pi-chrome under Browser Use, Stagehand, LangGraph, or any other agent framework (see Interop).
- You don't pay for an opinion you don't want.
- Agent improvements compound across all your workflows because the primitives stay stable.
Axis 3 — cloud browser providers (orthogonal)
| Provider | What it sells |
|---|---|
| Browserbase | Managed browsers; pairs with Stagehand. |
| Steel.dev | Managed browsers + public agent leaderboards. |
| Hyperbrowser | Managed browsers, session APIs. |
| Anchor Browser | Managed browsers. |
| Browserless | Managed Chrome, scraping focus. |
pi-chrome doesn't compete here. It runs locally in your Chrome. The right framing if someone asks: "no cloud cost, no session-handoff, no rate limits — and the agent runs against your real logged-in state." If you need fleets of isolated Chromes in CI, you want one of these.
Interop
pi-chrome exposes tools that any Pi agent can call. If you want to use it from outside Pi:
- The local bridge speaks HTTP JSON over
127.0.0.1:17318(default). The API is internal; use the Pi tool surface unless you are building an adapter. - Tool surface mirrors Playwright closely (click/type/navigate/snapshot/screenshot/evaluate/wait_for) so adapter code is short.
includeSnapshoton input tools lets agent harnesses verify state after actions.
If you want a first-class pi-chrome adapter for Browser Use / Stagehand / LangGraph, file an issue with your use case.
"But Playwright has storageState / Puppeteer has user-data-dir"
Yes — you can export cookies and replay them, or point Playwright at your existing profile directory. In practice for agent workflows that breaks down fast:
- OAuth + SSO providers (Okta, Google, GitHub) often pin sessions to TLS fingerprints, device IDs, and browser-extension state that doesn't survive replay or a parallel Chrome instance.
- MFA tokens expire mid-run.
- Internal admin tools hard-pin to your real device.
- Pointing Playwright at your real
user-data-dirrequires closing your normal Chrome (Chrome won't share the profile lock). pi-chrome doesn't fight you for the profile because it lives inside it. - Watching the agent work in your real window is a different UX than a hidden parallel Chrome. Demos, pair-driving, and confidence-building all want axis-1-with-attach.
"Is this safer than CDP?"
Different security boundary, not strictly safer.
- CDP-based tools require
chrome --remote-debugging-port=.... That port is unauthenticated and exposes the whole browser to any local process. Easy to misconfigure. - pi-chrome runs through an extension you install yourself with broad permissions (tabs, scripting, debugger, webNavigation). The bridge listens on
127.0.0.1:17318loopback only, rejects browser-origin command requests, and keeps chrome_* tools locked until/chrome authorizeis run in the current Pi session. Only install the bundled extension if you trust the source you got the npm package from.
If your threat model excludes extensions with broad permissions, neither approach is a fit — you want a sandboxed CI runner.
Public benchmarks worth knowing (for axis 2 / axis 3 comparison)
Pi-chrome itself ships a benchmark suite (../test-suite/) of 42 primitive challenges plus 4 hermetic BrowserGym-style long-horizon tasks covering trusted input, pointer humanization, keyboard fidelity, drag/drop, Shadow DOM, iframes, file uploads, strict-CSP screenshot fallback and CDP eval/snapshot bypass, dynamic waits, tab lifecycle, network observability, fingerprint leaks, and agent-safety honeypots. Scoring tracks expected outcomes per challenge instead of raw PASS count, with core, conditional, and quality gate buckets. That's driver-level grading.
For agent-level comparison (axis 2), the public benchmarks worth citing:
| Benchmark | What it measures | Notes |
|---|---|---|
| WebArena (CMU) | Hermetic, programmatic graders | Gold standard for reproducibility. |
| WorkArena++ (ServiceNow) | Enterprise SaaS workflows | Hardest realistic benchmark; <5% frontier. |
| BrowseComp (OpenAI) | Hard info-retrieval | Not saturated. |
| Mind2Web 2 (NeurIPS '25) | Long-horizon, rubric-tree judge | New, well-designed. |
| WebChoreArena | Tedious cross-page workflows | Reflects real ops work. |
| WebVoyager | Live web tasks | Saturated — 90%+ scores common; cite only as smoke test. |
| VisualWebArena | Multimodal | |
| MiniWoB++ | Classic unit-task suite | |
| BrowserGym + AgentLab | Research harness covering the above | The de-facto research API; pi-chrome's snapshot uid is comparable to BrowserGym's bid. |
Cite live leaderboards rather than hard-coded numbers; agent scores shift monthly.
Reproducing pi-chrome's driver-level claims
Run ../test-suite/ against any browser-control tool. Each challenge exposes window.__verdict / window.__reason / window.__events, so any tool (Playwright, Puppeteer, Selenium, Stagehand, pi-chrome) can grade itself deterministically. Headline release scoring should use the core gate; conditional depends on declared environment capabilities, and quality tracks adversarial/humanization regressions.
cd test-suite && python3 -m http.server 8765
# open http://127.0.0.1:8765/ in the Chrome window the tool controls
If you build a competing tool, please open a PR with your scores.