Skip to content
browserlane
v0.1.14 · latest release

Browser Automation Engine for AI Agents

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.

$ curl -fsSL https://browserlane.com/install.sh | sh
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

100%

89 covered · 0 gaps — the goal is complete specification parity

How it's covered

89 native

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

Verification baseline

82 integrated

82 verified on Chrome · 0 awaiting runtime verification · 0 not integrated · 7 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

browsingContext29/29 covered · 100%

29 native · 0 covered another way · 0 gaps

emulation11/11 covered · 100%

11 native · 0 covered another way · 0 gaps

network18/18 covered · 100%

18 native · 0 covered another way · 0 gaps

script9/9 covered · 100%

9 native · 0 covered another way · 0 gaps

storage3/3 covered · 100%

3 native · 0 covered another way · 0 gaps

log1/1 covered · 100%

1 native · 0 covered another way · 0 gaps

input4/4 covered · 100%

4 native · 0 covered another way · 0 gaps

webExtension2/2 covered · 100%

2 native · 0 covered another way · 0 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.

Browser, sessions, tabs, pages, elements — then 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 a visible Chrome over WebDriver BiDi. 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 · 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

03 · Tabs & contexts

Every tab is a handle.

Within a session, tabs 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 tab new https://app.example.com/admin
$ bl tabs
$ bl tab switch admin

04 · Page & frames

The page, made legible.

Each tab shows a page, and every page — frames included — is readable: query by CSS, role, label, text, or XPath, and read the accessibility tree the way assistive tech does.

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

05 · Elements & input

Input that behaves like a person.

Map every interactive element to a stable @ref an agent can act on, then drive it with real pointer and keyboard events — actionability checks built in: click, type, fill, drag, press. If a human can do it in the page, an agent can script it.

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

06 · State & auth

Sessions you can carry.

Snapshot cookies, localStorage, and sessionStorage as a named state; restore it in the next run. Log in once, then test authenticated flows on every run after — no scripted logins.

$ bl storage save auth
$ bl storage load auth

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