Skip to content
browserlane

Local-first · WebDriver BiDi · Chrome

The browser engine humans and AI agents can share.

browserlane packages WebDriver BiDi into one local Rust binary. Humans use the CLI; agents use MCP or learn the CLI through a Skill. Every specification capability is tracked in public.

one binary · Chrome · macOS / Linux / Windows · CLI / MCP / Skill

zsh — bl
$ bl open https://app.example.com
200 · Acme — Dashboard
$ bl map
@e1 link "Projects" @e2 button "New project"
$ bl click @e2
clicked · url /projects/new
mcp · tools/callagent
{
  "name": "browser_click",
  "arguments": { "selector": "@e2" }
}
→ clicked · 96 ms

WebDriver BiDi-native

Built on the W3C-standard bidirectional protocol. Every specification capability — module, command, event — belongs in the engine parity model.

One local binary

A single Rust binary for macOS, Linux, and Windows. Browser, sessions, data, and artifacts stay on your machine — no cloud.

Three intentional surfaces

CLI for humans and scripts. MCP for agents. A Skill that teaches agents the CLI, token-efficiently. One engine underneath.

Public parity

Modules, commands, events, implementation status, and Chrome verification — tracked openly, gaps included.

Architecture

Every route ends at the same engine.

Humans and scripts take the CLI. Agents connect over MCP, or learn the CLI through a Skill. All three routes end at the bl engine, which speaks WebDriver BiDi to Chrome.

one engine · three routes

Not three engines

CLI, MCP, and Skill are curated doors into the same bl engine — the same sessions and the same capabilities underneath, whichever way you come in.

MCP is intentions, not primitives

MCP exposes structured tools for useful user intentions. It deliberately does not mirror every BiDi primitive 1:1 — that would bloat an agent’s tool catalog without adding capability.

Skill teaches the CLI

The Skill is one file that teaches an agent token-efficient CLI workflows. It reuses the composable CLI surface and implements no separate browser capability.

Internal still counts

Protocol internals can stay internal — implemented and tested in the engine — without earning a dedicated command or tool. Engine parity and surface exposure are tracked separately.

Every WebDriver BiDi capability must be reachable through the engine. Only capabilities representing a useful user intention should receive dedicated CLI commands or MCP tools.

the browserlane parity principle

WebDriver BiDi parity

Every capability accounted for.

We track every WebDriver BiDi module, command, and event against the bl engine, its user intention, CLI exposure, MCP exposure, Skill workflow, and Chrome support — in public, gaps included.

Spec capabilities

89

65 commands · 24 events, from the W3C Working Draft

Engine coverage

70%

63 covered · 26 gaps — the goal is complete specification parity

How it's covered

54 native

9 covered another way — shimmed, consumed events, or lifecycle alternatives

Verification baseline

59 integrated

39 verified on Chrome · 20 awaiting runtime verification · 26 not integrated · 4 other

Coverage by module

nativecovered another waygap

session5/5 covered · 100%

5 native · 0 covered another way · 0 gaps

browser7/7 covered · 100%

7 native · 0 covered another way · 0 gaps

browsingContext28/29 covered · 96%

28 native · 0 covered another way · 1 gap

emulation4/11 covered · 36%

1 native · 3 covered another way · 7 gaps

network9/18 covered · 50%

5 native · 4 covered another way · 9 gaps

script4/9 covered · 44%

3 native · 1 covered another way · 5 gaps

storage3/3 covered · 100%

3 native · 0 covered another way · 0 gaps

log1/1 covered · 100%

0 native · 1 covered another way · 0 gaps

input2/4 covered · 50%

2 native · 0 covered another way · 2 gaps

webExtension0/2 covered · 0%

0 native · 0 covered another way · 2 gaps

Engine parity is measured at the protocol, not at the command line. Capabilities can be covered by the engine while staying internal, and one CLI command or MCP tool can serve several capabilities — so a missing dedicated command is not an engine gap, and surface counts are not a parity score.

Three surfaces

One engine. Three ways in.

The same engine answers to a human at a shell, to an agent over MCP, and to an agent that has been taught the CLI through a Skill. Each surface is intentionally curated for its user; all three route into the same engine and session model.

CLI · humans & scripts

Drive the browser from your shell.

Composable commands with structured JSON where it helps and real exit codes everywhere — for interactive use, scripts, and CI.

zsh — bl
$ bl open app.example.com
200 · Acme — Dashboard
$ bl map
@e2 button "New project"
$ bl click @e2
clicked
$ bl expect url contains "/new"
pass · exit 0

MCP · AI agents

Give your agent structured hands.

Tools that represent useful intentions — not one tool per BiDi primitive — over stdio JSON-RPC. Same engine, same sessions as the CLI.

mcp · stdio json-rpc
→ browser_open {"url":"…"}
→ browser_map {}
← @e2 button "New project"
→ browser_click {"selector":"@e2"}
← clicked · 96 ms
→ browser_expect {"kind":"url"}
← pass
$ bl add-mcp claudeMCP reference

Skill · token-efficient agents

Teach the agent the CLI.

One skill file teaches an agent token-efficient CLI workflows — no large tool catalog in context, and no separate browser capability to maintain.

SKILL.md — browserlane
# the agent reads this, then runs bl
## Drive a real browser with bl
bl open <url> · bl map · bl click @ref
bl expect … exits non-zero on failure
$ bl open app.example.com
agent drives the same engine, via the CLI
$ bl add-skillSkill reference

The Skill is not another protocol implementation — it teaches an agent the CLI, so agents with shell access get the whole engine at a fraction of the context cost. Every route ends at the same bl engine.

The browser stack

A browser isn’t one surface. It’s a stack.

Shell, tabs, DOM, input, state, signals, environment, evidence. browserlane gives agents and developers a handle at every layer — not just a screenshot of the top one.

01 · Browser shell

Start with a real browser.

One command launches Chrome over WebDriver BiDi — visible while you build, headless in CI. Navigate, wait, reload, capture. Every run is a real render of your real app, not a DOM emulation.

$ bl open https://app.example.com
$ bl screenshot -o home.png

02 · Tabs & contexts

Every tab is a handle.

Pages are enumerable and addressable — open, list, and switch by index or URL. A warm daemon keeps the session alive between commands, so multi-tab flows stay scriptable.

$ bl page new https://app.example.com/admin
$ bl pages
$ bl page switch admin

03 · Parallel sessions

Run many, in parallel.

Give each workflow its own named session — separate cookies, storage, and tabs — and drive them in parallel from one warm daemon. Log in as several users at once with no state crossing between them. Add --isolated and a session gets its own browser process, so a crash stays contained.

$ bl session new checkout
$ bl open https://app.example.com --session checkout
$ bl session new payments --isolated

04 · Page & DOM

The page, made legible.

Query by CSS, role, label, text, or XPath. Map every interactive element to a stable @ref an agent can act on, and read the accessibility tree the way assistive tech does.

$ bl map
$ bl find role button
$ bl a11y-tree

05 · Human inputs

Input that behaves like a person.

Real pointer and keyboard events with actionability checks built in: click, type, fill, drag, press. If a human can do it in the page, an agent can script it — and the app can’t tell the difference.

$ bl fill "#email" "sam@acme.dev"
$ bl click "button[type=submit]"
$ bl drag "#task-3" "#done"

06 · State & auth

Sessions you can carry.

Export cookies, localStorage, and sessionStorage as JSON; restore them in the next run. Log in once, then test authenticated flows on every run after — no scripted logins.

$ bl storage -o state.json
$ bl storage restore state.json

07 · Console & network

See what the app was doing.

Recordings capture console output and network activity alongside snapshots — the failed POST and the stack trace behind it travel with the run, not just the final pixels.

$ bl record start --snapshots
$ bl record stop -o run.zip

08 · Emulation

Test the environment too.

Resize to any device, override geolocation, and force CSS media features like dark mode or reduced motion — per session, without touching app code.

$ bl viewport 390 844 --dpr 3
$ bl geolocation 12.9716 77.5946
$ bl media --color-scheme dark

09 · Observability & reporting

Every run leaves evidence.

Assertions with real exit codes, structured diffs between steps, annotated screenshots, replayable recordings — all captured locally. When a run fails, you open the evidence — you don’t reproduce the failure.

$ bl expect url contains "/done"
$ bl diff map
$ bl record stop -o evidence.zip

Observability & reporting

Agents shouldn’t test blind.

Most browser tools tell an agent what the page looks like. browserlane also tells it what happened — assertions with exit codes, structured diffs, and recordings that carry console and network context. A failing run becomes evidence to read, not behavior to guess at. It all stays on your machine.

Assertions · real exit codes

$ bl expect text equals "$42.00" --selector "#total"
Error: expect text equals "$42.00" in "#total" failed: actual "NaN"
exit 1 — CI stops here, with a reason

State diffs · between steps

$ bl diff map
+ @e9 button "Retry payment"
− @e5 spinner "Processing…"
2 changes since last map

Recordings · replayable runs

$ bl record stop -o run.zip
✓ saved · 9 steps · screenshots + snapshots
with console output & network activity

Screenshots · annotated evidence

$ bl screenshot --full-page --annotate
✓ screenshot.png · interactive elements numbered
what the agent saw, exactly when it saw it

Quickstart

Running in under a minute.

One line to install, one command to fetch Chrome for Testing, and you’re driving a real browser — from your shell or your agent.

1 · Install — macOS / Linux

$ curl -fsSL https://browserlane.com/install.sh | sh

Windows (PowerShell)

$ irm https://browserlane.com/install.ps1 | iex

2 · Fetch Chrome for Testing

$ bl install

3 · First commands

$ bl open https://example.com
$ bl screenshot -o page.png

For agents · MCP server or CLI skill

$ bl add-mcp claude
$ bl add-skill
Read the docsStar on GitHub

checksummed installer · signed & notarized binaries