Skip to content
Internals — research note: investigation or findings, not a description of shipped behaviour.
May be out of date: Code changed since verification (at b64377d40).

Agent browser driver research (2026)

Question: How does Vox add Stagehand-class semantic browser driving (chat-driven, viewable, cookie-aware) without bloating a Rust + Tauri product?

Answer: Do not add Playwright, Stagehand, or a second Chromium. Close three gaps on the stack that already ships: accessibility-ref snapshots, named persistent profiles with explicit cookie consent, and an optional attach-to-user-Chrome path. Tauri’s WebView is the operator shell, not the driven browser.

Research date: 2026-09-07. Sources are official docs and product pages unless marked analysis.

Vox is not starting from a blank browser. The June 2026 scoping doc and the GUI browser SSOT already chose chromiumoxide CDP as the agent engine and Playwright as CI/validation only. That decision is still correct.

LayerWhereShipped today
CDP enginecrates/vox-plugin-browserchromiumoxide 0.9.1: open/goto/click/fill/scroll/keys, screenshots, screencast, visible_text_summary, GetFullAxTree
Plugin ABIvox-plugin-api BrowserAutomationSabi trait, revision 4; loaded via vox-plugin-host
MCPvox-orchestrator-mcp browser_tools.rs26 vox_browser_* tools + browser_act / browser_extract / browser_extract_json
Vox builtinsvox-actor-runtime Browser.*9 verbs; no snapshot/ref builtins
GUIvox-gui Browser surfacePreview iframe (localhost) + agent CDP live view (vox://browser-frame) + human/agent control lock
Chat wiringLoquela → chat_turn → vox-orchestrator-dChat can already invoke vox_browser_*
Static scrapeScrape.*, vox-searchreqwest + scraper; no JS
VisusCLI + MCPScreenshot + raw AX tree for visual audit
Playwrightvox-gui/ui/e2e, integration testsValidation / golden-route only

Confirmed absences at research time (2026-09-07 audit). Snapshot/refs, named profiles, and Connect Chrome attach shipped in the same-day implementation — see §7 Implementation links. Remaining true:

  • browser_act was a text-summary → LLM JSON → CSS/XPath loop at audit time (the plan upgrades it to snapshot + click_ref).
  • No Chrome extension / native-messaging host (Connect Chrome is CDP connect to a user-started Chrome, not an extension).
  • No OS-level computer-use. Warp research mapped it; nothing shipped.

Tauri is not a second browser. The GUI host is wry / WebView2 / WebKitGTK with a tight CSP. The Preview tab iframes localhost. The Agent tab mirrors CDP PNG frames and maps clicks to vox_browser_click_xy. That is already the Claude Desktop “in-app pane” pattern, implemented without embedding a second Chromium into the WebView.

The market split in 2026 is identity, not horsepower. Everyone can click. The product question is: whose cookies, whose Chrome, how many tokens per step?

2.1 Claude Code Desktop — three browsers, one identity axis

Section titled “2.1 Claude Code Desktop — three browsers, one identity axis”

Official docs (code.claude.com/docs/en/desktop, code.claude.com/docs/en/chrome, Claude Help Center, 2026-08):

SurfaceSessionWho drivesAvailable from
Claude in Chrome extensionUser’s Chrome, user’s loginsMCP tools mcp__claude-in-chrome__*CLI (--chrome), VS Code, Desktop connectors
Desktop Browser paneClean Chromium profile inside ElectronApp-native toolsDesktop only (Cmd+Shift+B)
chrome-devtools-mcpClean Chrome launched by the MCPPuppeteer + DevToolsAny MCP client
Computer useThe real desktopScreen + accessibilityDesktop, Pro/Max, off by default

The pane is not the user’s Chrome. Persist-sessions is an opt-in so localhost cookies survive restarts. Site allowlists are shared with the extension. Claude pauses on login/CAPTCHA and will not purchase, create accounts, or bypass CAPTCHAs without the user.

Computer use is last resort: connectors, then Bash, then Chrome, then iOS Simulator, then screen control. Browsers are capped at view-only under computer-use so Claude is steered back to the dedicated browser tool.

Lesson for Vox: ship two identities, not one mega-browser. Clean profile for “build and test.” Attach-to-user-Chrome for “act as me.” Do not start with OS computer-use.

2.2 ChatGPT Atlas — standalone browser died

Section titled “2.2 ChatGPT Atlas — standalone browser died”

OpenAI launched Atlas (Chromium + ChatGPT, macOS-first) on 2025-10-21. Official help (2026-07): deprecated, scheduled to stop working 2026-08-09. Features moved to:

  1. ChatGPT desktop built-in browser (tabs, downloads, logins).
  2. ChatGPT Chrome extension / sidebar.
  3. A cloud browser for unattended agents.

TechCrunch (2026-07-09): OpenAI treated the browser as a feature of ChatGPT, not a destination. HUMAN Security (May 2026) had Comet at ~47% of measured agentic traffic vs Atlas ~20%. Atlas never shipped Windows.

Lesson for Vox: do not fork Chromium or ship a competing default browser. Embed a pane + optional real-Chrome attach. Atlas is the expensive counter-example.

2.3 Stagehand (Browserbase) — the “Songshand” reference

Section titled “2.3 Stagehand (Browserbase) — the “Songshand” reference”

Official: docs.stagehand.dev, github.com/browserbase/stagehand (~23k stars, MIT). Latest browse package release 0.8.3 (2026-06-05).

Stagehand is an SDK for browser agents, not a desktop product:

  • AI primitives: act(), observe(), extract() (schema-typed), plus agent() for multi-step.
  • Deterministic page APIs (Playwright-shaped goto / locator / screenshot).
  • v3+ drives Chromium over CDP. Docs now say there is no Playwright or Puppeteer dependency for the core engine; Playwright can still attach via connectOverCDP.
  • Self-healing + observe-then-act caching. Server-side cache is Browserbase-only.
  • SDKs: TypeScript, Python, Go. No Rust SDK.
  • Models are pluggable; BYO client callback exists.

What Stagehand is not: a GUI, a cookie-consent product, or a Tauri-shaped embed. Hosted gravity pulls toward Browserbase hours and their Model Gateway.

Vox already has a weaker browser_act / browser_extract / browser_extract_json. The missing Stagehand pieces are observe (candidate actions + cache) and typed extract against a snapshot, not a new engine.

2.4 Playwright MCP — the semantic-loop standard

Section titled “2.4 Playwright MCP — the semantic-loop standard”

Official: playwright.dev/mcp, github.com/microsoft/playwright-mcp.

The loop every serious agent now copies:

  1. browser_snapshot → compact AX tree with refs (e5).
  2. Model picks a ref.
  3. browser_click / type / fill_form on that ref.
  4. Snapshot again.

Claims: ~200–400 tokens per snapshot vs thousands for DOM/screenshots; no vision model required; cookies + storage_state persist by default. 40+ tools including cookie/localStorage, network mock, tracing.

Microsoft itself now says coding agents should prefer Playwright CLI + skills for token cost, and keep MCP for long-running stateful loops. That matches Vox: MCP tools already live on the orchestrator; the missing tool is snapshot/ref, not a Node sidecar.

2.5 Vercel agent-browser — closest Rust cousin

Section titled “2.5 Vercel agent-browser — closest Rust cousin”

Official: github.com/vercel-labs/agent-browser, agent-browser.dev. Native Rust CLI + CDP daemon. Snapshot + @eN refs. Profiles, cookies, storage, proxy. No Playwright/Puppeteer in the native path.

This is the pattern to copy (compact AX text + ref map + click @e2), not a dependency to vendor. Vox already owns a chromiumoxide host, MCP dispatch, and a GUI frame mirror. Adding another daemon would duplicate vox-plugin-browser.

Caveat from Tavily/GitHub: persistent-profile cookie bugs exist (--profile / headless Windows). If Vox adds profiles, test headed + headless cookie round-trips; do not assume user_data_dir is enough.

2.6 chrome-devtools-mcp — debugger, not driver

Section titled “2.6 chrome-devtools-mcp — debugger, not driver”

github.com/ChromeDevTools/chrome-devtools-mcp (~50k stars). Puppeteer + DevTools: traces, Lighthouse, heap snapshots, take_snapshot with uids, --autoConnect to a running Chrome 144+. Officially Chrome / Chrome for Testing only.

Use later as an optional debug skill for “why is LCP bad,” not as the product driver. Node + Puppeteer is the bloat we already refused.

2.7 browser-use — heavy agent, not a library fit

Section titled “2.7 browser-use — heavy agent, not a library fit”

github.com/browser-use/browser-use. Python agent loop (vision + numbered elements), 2026 beta Rust core, cloud browsers, profile sync script. Fine as a hosted competitor; a Python/cloud agent inside Vox violates VoxScript-first, LLM-facade, and lean-plugin rules.

ProductFormAgent modelEmbed in Vox?
Perplexity CometStandalone ChromiumAssistant + rate-limited multi-step; free (2026-03)No public driver API
Gemini in ChromeSide panel + auto browseActs in the user’s ChromeChrome-only, not a library
Edge CopilotIn-browserEnterprise-gated; EEA exclusions reportedNo
Dia (The Browser Company)StandaloneConsumerNo

These validate demand. None are crates we can take.

Reconfirming the 2026-06-03 scoping table against 2026-09 sources:

LibraryProtocolExtra artifactFit
chromiumoxide 0.9.1CDP / tokioSystem or fetched ChromiumAlready in-tree. Keep.
ferrous-browserCDP / tokioChromiumPlaywright-ish locators; young; switching engines is churn, not capability
dravr-browserwraps chromiumoxideChromiumPersistent profile + stealth + cookie snapshot — steal ideas, not the crate
stealth-oxideCDP patches on chromiumoxide—Optional fingerprint coherence; only if bot-walls become a product requirement
headless_chromesync CDPChromiumFights Tokio. Skip.
thirtyfour / fantocciniWebDriverchromedriverExtra process. Skip.
playwright-rustNode Playwright driverNode + browsersThe deploy bloat we deferred. Still defer.
reqwest + scraperHTTPnoneKeep as Tier 1 (no JS)
wry / WebView2 cookie APIsOS WebView—GUI host only. Do not drive arbitrary sites here.

Load-bearing fact: language does not beat anti-bot. CDP looks like CDP. Stealth, proxies, and a real user profile matter more than Rust vs Node. Do not promise Cloudflare-bypass as a Vox feature.

CapabilityStagehandClaude Desktop paneClaude in ChromePlaywright MCPagent-browserVox today
Native CDP, no NodeYes (v3+)Electron ChromiumExtension + native messagingNo (Node)Yes (Rust)Yes
Chat → drive pageact / agentApp toolsMCPMCPCLI/MCPYes (vox_browser_*, browser_act)
In-app live viewSession inspector (hosted)PaneReal Chrome windowHeaded PlaywrightOptionalYes (frame mirror)
Human take-over lock—YesPause on CAPTCHA——Yes (set_control_lock)
AX snapshot + refsobserve actions——YesYesPartial (raw AX in plugin/visus)
Typed extractYes——via snapshotvia snapshotPartial (extract_json)
Observe + cacheYes (BB cache)————No
Persistent cookiesSession / BB profileOpt-in persistUser ChromeDefault persistProfiles (bugs)No
Attach to user ChromeNoNoYesExtension mode--cdpNo
Cookie consent UX—Clean vs persistSite allowlist——No
Site allow/block—Shared with extYes—PoliciesNo
Console / networkvia Playwright attachLimitedYesYesYesWeak
Lighthouse / tracesNoNoNoLimitedSomevisus only
OS computer-useNoSeparate previewNoNoElectron via CDPNo (correct)

5. Approaches (do not implement all three)

Section titled “5. Approaches (do not implement all three)”
Section titled “A — Finish the in-tree driver (recommended)”

Keep vox-plugin-browser + MCP + Browser surface. Add only:

  1. Semantic loop. Compact AX snapshot with stable refs; click_ref / fill_ref; optional numbered-bbox overlay on the existing screenshot path (already deferred in vox-gui-browser-support-2026.md).
  2. Named profiles + consent. Launch Chromium with user_data_dir under a vox_config::paths profile root (user data under $VOX_DATA_DIR/browser-profiles, not Tier D cache). First-class UI: ephemeral (default) vs save this session vs use profile X. Cookie + localStorage export/import via CDP Storage APIs as a portable sidecar, not Turso rows.
  3. Optional attach. CDP connect to a user-started Chrome (remote-debugging-port or Chrome 144+ remote debugging), later a thin native-messaging extension if product wants Claude-in-Chrome identity. Same MCP tools; different launch mode.
  4. Upgrade browser_act. Observe-then-act against the snapshot (Stagehand pattern) instead of CSS-from-visible-text. Keep the LLM on vox_actor_runtime::llm.
  5. Safety. Reuse control lock; add site allowlist; pause on password fields / payments / CAPTCHA (Claude’s rule). Prompt-injection wrapping on snapshot text (agent-browser nonce markers).

Bloat: ~plugin + MCP + GUI, no new crate, no Node in the product path. Playwright stays CI.

B — Sidecar Playwright MCP or chrome-devtools-mcp

Section titled “B — Sidecar Playwright MCP or chrome-devtools-mcp”

npx @playwright/mcp or npx chrome-devtools-mcp next to the daemon.

Gain: snapshot/ref and DevTools overnight. Cost: Node + browser download in the desktop app; two engines; MCP schema duplication; Windows/macOS install friction; violates “Playwright is validation only.” Use only as a contributor debug skill, not the shipped driver.

Stagehand: no Rust, Browserbase gravity, extra LLM hop. agent-browser: excellent CLI, but a second CDP daemon beside vox-plugin-browser.

Use as a reference implementation (read their snapshot serializer). Do not add the binary as a runtime dependency.

Section titled “6. Cookie / identity design (the actual product work)”

Claude’s docs settle this: the axis is identity, not power.

ModeProfileWhenDefault
WorkspaceEphemeral temp dirPreview, scrape, untrusted sitesYes
Nameduser_data_dir the user opted to keepStaging logins, recurring test accountsExplicit save
AttachedUser’s real ChromeGmail / Docs / “as me”Off; extra consent

Do not silently persist cookies. Treat exported cookie files as secrets-adjacent (OpenAI’s Atlas shutdown note: do not share session files). Resolve profile paths through vox_config::paths, not hardcoded .vox/ strings. Do not put cookie blobs in Tier A Turso.

Tauri/WebView2 has cookie manager bindings in the Windows patch tree. Those cookies belong to the operator shell, not the agent browser. Mixing them would leak GUI session into driven sites. Keep them separate.

Ship Approach A. The 2026-06-03 scoping doc said the majority of benefit is assembly, not a new engine. Nine months later the competitive bar moved to snapshot+ref + dual identity. Vox already has the engine, the chat hook, the live view, and a stub act/extract. The bloat risk is adding Playwright, Stagehand, Electron, or a Chromium fork — exactly what Atlas proved not to do.

Implementation (shipped 2026-09-07, Approach A): spec docs/superpowers/specs/2026-09-07-agent-browser-driver-design.md, plan docs/superpowers/plans/2026-09-07-agent-browser-driver.md, operator SSOT vox-gui-browser-support-2026.md, crate map where-things-live.md. Snapshot/refs, named profiles, Connect Chrome attach, cookie export/import (count + path only), host allowlist, and the GUI overlay are in-tree. The §1 “Confirmed absences” and §4 “Vox today” columns are the pre-implementation audit; do not read them as current product gaps for snapshot, profiles, or attach.

Chat/harness loop (2026-09-08): MCP image parts + Axis content_parts + browser-research skill. Spec docs/superpowers/specs/2026-09-08-chat-harness-research-loop-design.md. Still later: computer-use, chrome-devtools-mcp as optional skills, iframe merge, SPA observer, NeedsYou rows, Vox Browser.* ref builtins.

Do not: add playwright-rust, embed Stagehand, drive sites inside the Tauri WebView, or start a Vox-branded Chromium.