agent-webbridge — drive your real Chrome, across many profiles, in parallel
Open-source (MIT), clean-room browser automation for AI agents. It drives your real Chrome — with your real login sessions — across multiple Chrome profiles at once, and runs multiple tabs per profile concurrently. No closed-source dependency, no account, no telemetry, no curl | bash installer.
agent-webbridge is a lightweight Node daemon (only runtime dependency: ws) plus a clean-room MV3 Chrome extension. An AI agent posts a command to a local router; the router fans it out to the right profile's daemon, which speaks to the extension, which attaches the Chrome DevTools Protocol per tab. Everything stays on 127.0.0.1 — no data ever leaves your machine.
Why
It's clean-room and standalone — its own lightweight Node daemon and its own MV3 Chrome extension, with no closed-source dependency, no account, no telemetry, and no bootstrap installer. Install it from npm, load the extension once, and drive your real Chrome over localhost.
The killer feature is true per-tab parallelism.
Most browser-automation bridges funnel every CDP call through one global "current tab" — so they drive exactly one tab per profile at a time. agent-webbridge attaches chrome.debugger per tab (a Map keyed by tab), so N tabs in one profile run concurrently.
This is proven live and it scales: 2, 5, and 10 tabs in a single profile each finish in ~2 seconds flat (measured 2007 / 2007 / 2010 ms, with every tab's interval overlapping every other). The same work run serially would take 4 s → 10 s → 20 s. Wall-clock stays flat as you add tabs — that's true N× per-profile parallelism.
Combine that with multiple profiles and you get two axes of concurrency at once: N profiles × N tabs per profile, all driven from a single endpoint.
Install
1. The daemon + CLI (via npm):
npm i -g agent-webbridge
This puts the awb command on your PATH and brings the Node daemon. The only runtime dependency is ws.
2. The Chrome extension — a clean-room MV3 extension (stable id ifodkkbkmngjlkhiphcjmbceeolhpfeo) installed via Chrome's built-in "Load unpacked". There is no Chrome Web Store listing — and you don't need one. Let the CLI walk you through it:
awb setup "Work" # or any profile name / email / "Profile 2"
awb setup prints the exact extension folder, opens chrome://extensions, then polls while you do the one manual step Chrome requires: toggle Developer mode on (top-right) and click Load unpacked → pick that folder. As soon as it detects the load, it wires the profile to its daemon and brings the fleet up. Because the extension ships its public key in manifest.json, Chrome always derives the same stable id — the folder you load is the published build. (Manual steps: Dev. Driving install from an agent: awb check --json.)
Requirements: macOS + Google Chrome, and Node.js ≥ 18.
60-second Quickstart
# 1. One-time install — walks you through "Load unpacked", then connects + brings the fleet up.
# Pass the profile(s) you want to drive (name / email / "Profile 2").
awb setup "Work" "Personal"
# 2. Already set up? Just bring the fleet up (setup already did this on first run).
awb up "Work" "Personal"
# 3. Drive any profile by name — same endpoint, one extra field
curl -s -X POST http://127.0.0.1:10086/command \
-H 'Content-Type: application/json' \
-d '{"action":"navigate","args":{"url":"https://search.google.com/search-console"},"session":"audit","profile":"Work"}'
# 4. When done
awb down
Every command is a POST /command on the router at 127.0.0.1:10086. A "session" groups a task's tabs into a Chrome tab group; a "profile" selects which Chrome profile to drive.
Tools
Full parity with the official bridge — 13 tools, all verified live in a real browser:
| Tool | What it does |
|---|
navigate | Open a URL in a (new or existing) tab |
find_tab | Locate an existing tab by URL / title |
evaluate | Run JavaScript in the page and return the result |
snapshot | Accessibility tree with stable @e refs for elements |
click | Click an element (by @e ref) |
fill | Set a value on native inputs and contenteditable fields |
network | Capture network requests |
upload | Upload a file to a file input |
screenshot | Capture a screenshot of the page |
save_as_pdf | Save the current page as a PDF |
list_tabs | List the tabs in the current session |
close_tab | Close a tab |
close_session | Close a session and its tab group |
Architecture