Changelog
Notable changes, additions, and fixes in each browserlane release.
Notable changes in each bl release. Versions follow the published
GitHub releases; check
your own build with bl --version.
v0.1.14 — 2026-08-05
The advertised surface is now curated — a central visibility policy
(one list in the binary) decides what every public surface shows: help,
shell completions, "did you mean" suggestions, the launch screen, and the
generated docs all derive from it. Commands that are plumbing rather than
automation — the background daemon, the library transports, OS-window
control, the three protocol diagnostics, and the page-HTML setter (whose
name read as a getter; the MCP browser_set_content tool is unchanged) —
stay fully invocable but no longer appear anywhere. The result: 159
advertised CLI commands, each one something a user is meant to reach for.
bl quit — the full-cleanup verb — open's missing counterpart.
Closes every session and stops the shared background browser process;
bl stop keeps its gentler session-scoped meaning and now points to
quit for the rest. Idempotent (quitting with nothing running reports
that and exits 0) and it never launches a browser just to close it. The
MCP twin browser_quit tears down every session on that server while the
server itself keeps running — the next tool call starts a fresh browser.
bl read is now bl md (alias: markdown) — the page-as-markdown
reader joins text and html as the third format-named getter, same
flags (--outline, --filter, --llms, --raw), same two paths
(browserless URL fetch, or the active tab's live DOM). The MCP tool
renames with it: browser_read → browser_markdown. A clean break, no
compatibility alias for the old name.
-h and --help now render one screen — identical compact layout for
both spellings, bl help <cmd> included, with the long-form prose kept
for the docs site. The help flag no longer advertises a second, roomier
screen that differed only in whitespace.
Chrome opens maximized — the visible-by-default window now starts maximized, so watching an automation run needs no window fiddling.
Surface: 159 advertised CLI commands (12 more stay invocable but unadvertised) / 127 MCP tools; parity stays 89 covered / 0 gaps.
v0.1.13 — 2026-08-04
Sessions can pre-arm native dialog handling — bl session new <name> --dialog accept|dismiss tells the browser to answer alert(), confirm(),
prompt(), and beforeunload dialogs itself, so a click that opens one
returns normally instead of blocking for the full command timeout and
failing. The policy is session-scoped because that is where WebDriver BiDi
allows it — unhandledPromptBehavior exists only at session/user-context
creation, so a mid-session re-arm is not expressible — and bl session reset
re-creates the session with the same policy instead of silently reverting.
The default is unchanged: without --dialog, dialogs stay open for the
interactive bl dialog accept|dismiss|info|wait commands, and
--dialog ignore states that explicitly. CLI-only for now —
browser_session_create keeps its existing schema.
bl is actionable now matches its siblings — it takes [selector] only
and checks the page the session is already on, like is visible,
is enabled, and is checked. It previously required a URL first and
navigated to it as a side effect; navigating is bl open's job, exactly as
with the other three. Its Stable: line is now measured — the element's box
is sampled across two animation frames — instead of being hard-coded to
true, so a mid-animation element correctly reports Stable: false.
Negative numbers parse as values — bl geolocation 37.7749 -122.4194,
bl scroll --amount -3, bl mouse move -10 20, and negative window
coordinates no longer fail with a usage error that read the negative number
as an unknown flag (the workaround -- separator form stays supported). For
mouse move, out-of-viewport coordinates now reach Chrome and return its
out-of-bounds error instead of a parser usage message.
bl media states its real contract — the command overrides what
matchMedia() reports to page JavaScript in the current document, and that
is all: Chrome's style engine does not re-evaluate @media rules (computed
styles are unchanged) and the override is lost on navigation. The help text
and the agent Skill now say exactly that instead of claiming to "override CSS
media features". No behavior changed — WebDriver BiDi has no media-emulation
command, and adding a CDP escape hatch is a deliberate decision the project
has not taken, so the surface now promises only what it delivers.
Surface counts are unchanged: 167 CLI commands / 126 MCP tools; parity stays
89 covered / 0 gaps. These fixes came out of driving bl against the new
reference storefront at demo.browserlane.com
(in-repo demo-site/), whose scenario smoke now exercises checkout, dialog,
clock, and rate-limit flows end to end.
v0.1.12 — 2026-07-26
Breaking keyboard consolidation — the duplicate focused-key command/tool is removed, and held-key controls now live in the existing keyboard family. There are no aliases or compatibility shims:
| Removed | Replacement |
|---|---|
bl keys <combo> | bl press <combo> |
bl keydown <key> | bl keyboard down <key> |
bl keyup <key> | bl keyboard up <key> |
browser_keys with { "keys": … } | browser_press with { "key": … } |
browser_keydown | browser_keyboard_down |
browser_keyup | browser_keyboard_up |
bl press <key> [selector] / browser_press is now the single key-combination
intention: omit the selector to act at the current focus, or provide one to
focus that element first. Focused text entry remains under keyboard type and
keyboard inserttext. This reduces the visible CLI surface from 168 to 167
command paths and the advertised MCP catalog from 127 to 126 tools without
changing the engine or WebDriver BiDi behavior.
Breaking rename — tab lifecycle commands and tools drop the "page" terminology. A tab is a top-level browsing context you can list, create, activate, or close; a page is the document loaded inside it. The old names are gone — there are no aliases or compatibility shims:
| Old | New |
|---|---|
bl pages / bl pages --tree | bl tabs / bl tabs --tree |
bl page new [url] | bl tab new [url] |
bl page switch <index|url> | bl tab switch <index|url> |
bl page close [index] | bl tab close [index] |
browser_list_pages | browser_tab_list |
browser_new_page | browser_tab_new |
browser_switch_page | browser_tab_switch |
browser_close_page | browser_tab_close |
browser_context_tree keeps its name (the WebDriver BiDi spec term), and
document-level commands (bl open, bl title, bl read, screenshots, PDF
page options, and friends) keep "page" — the rename is semantic, not
mechanical. The internal library transport's lifecycle methods
moved with it (browserlane:browser.tab/.tabs/.newTab,
browserlane:context.newTab, browserlane:tab.activate/.close; the tab
list's result key is now tabs), as did trace method labels for these
tools. Update any scripts, agent configurations, and saved prompts that
used the old names.
One command hierarchy — bl --help, the CLI and MCP references, the
CLI ↔ MCP mapping, and the agent Skill are now organized around a single
twelve-group hierarchy that follows how a browser actually nests:
Browser → Session → Tabs → Page → Frames → Elementsfollowed by the capabilities scoped to them — Dialogs, Capture, State, Emulation — with Utilities and Setup outside the automation hierarchy. A browser hosts sessions, a session holds tabs, a tab shows a page, a page contains frames and elements.
No command, tool, argument, output, or behavior changed: this is purely a
discoverability change, and MCP tools/list remains a flat catalog (the
grouping is documentation-only). Reference pages moved into the new group
folders, so links into the former category folders —
/cli-reference/interaction/…, /browser-state/…, /scripting/…,
/agent-mcp/…, /session-daemon/…, /advanced/… — need updating.
v0.1.11 — 2026-07-23
A correctness and contract-hardening release across the MCP protocol boundary, the shared engine, and browser process lifecycle — no new automation capability. The CLI surface stays at 168 commands and parity stays 89 covered / 0 gaps; the advertised MCP catalog slims from 130 to 127 tools (the three legacy cookie aliases are hidden but remain callable — see below).
Upgrade note — the MCP server now enforces the tool schemas it advertises.
tools/call arguments are validated against each tool's inputSchema before
dispatch: undeclared properties, missing required members, wrong types,
enum/range violations, and fractional values for integer members (for example
a page index of -0.5, which previously truncated to 0 and closed the
wrong page) answer JSON-RPC -32602 instead of being silently defaulted or
truncated. Timeouts, indexes, limits, and window geometry are declared as
integers with explicit bounds. Clients generating arguments from the schema
are unaffected.
Upgrade note — MCP protocol compliance is tightened. initialize (with a
protocolVersion) is required before any request other than ping; request
ids must be strings or integers (null, objects, arrays, and fractions are
rejected with -32600); structurally invalid frames answer -32600 instead
of -32700; and error responses carry an explicit "id": null when the id is
unknown. The server now answers ping, keeps serving tools/list and
notifications while a tool call runs, and honors notifications/cancelled.
Upgrade note — the legacy cookie tools browser_get_cookies,
browser_set_cookie, and browser_delete_cookies are no longer advertised
through tools/list. They remain callable as hidden compatibility aliases;
use the canonical browser_cookie_list / browser_cookie_get /
browser_cookie_set / browser_cookie_delete / browser_cookie_clear.
browser_findno longer fabricates a match — a CSS selector that matches nothing returns a clearelement not founderror (and leaves any previous@e1mapping intact) instead of a successful-looking@e1result bound to a missing element. An invalid CSS selector or XPath reports the parse error immediately. CSS lookups stay instant by default and poll only when atimeoutis explicitly passed; semantic lookups poll as before, but each underlying browser command is now bounded by the remaining deadline (a hung tab can no longer stretch a 5-second find toward a minute), and connection loss or a destroyed tab is reported as itself rather than as "element not found".bl fillandbrowser_fillagree on one argument — the canonical key istext(what the MCP schema always advertised); the CLI now sends it, and the oldvaluekey remains accepted for compatibility.- CLI
--jsonoutput has one envelope — every envelope command emits a single line{"ok": bool, "result": string|object|array}(or{"ok": false, "error": …}); commands whose result is a JSON document (pages --tree,read,console list,viewport,frames,frame,dialog info,screencast start/stop,storage show) now return it structurally instead of as an escaped JSON string, andinstall --jsonplussession new|list|close|reset --jsonnow use that envelope instead of bare JSON (session id --jsonnow wraps its identifier), and the background runtime's status reporting no longer prints prose before the JSON when the runtime is down.
Upgrade note — BROWSERLANE_CACHE_DIR must now be an absolute path.
Relative values are rejected instead of being resolved against each process's
working directory, which could split the CLI, daemon, Chrome profiles, session
storage, and traces across different roots. Update scripts and CI configuration
that set this variable to supply an absolute path.
Upgrade note — element-state commands now distinguish “not found” from
“could not check.” bl is checked, browser_is_checked, and negated checked
expectations error when the selector matches nothing; focus errors when the
target cannot actually receive focus; and browser_is_visible propagates
invalid-selector or lost-connection errors while still returning false for a
genuinely absent element. Viewport overrides are now limited to 16,384 pixels
per dimension and a device-pixel ratio of 10.
- Browser shutdown is now ownership-safe — each launch retains its Unix process group or Windows Job Object for the full lifetime of the browser. Owned-launch cleanup no longer rediscovers a process tree through a potentially recycled PID, launch owners terminate and reap Chrome during unwinding, bulk shutdown attempts every tracked browser and reports failures, and temporary signal handlers are restored after use.
- BiDi waits and shutdown honor their deadlines — every polling probe uses the caller’s remaining wait budget, connection loss is no longer reported as a successful hidden-element wait, socket writes and courtesy closes are bounded, and process reaping cannot wait behind a wedged WebSocket writer.
- Recordings have bounded memory growth — trace events, network rows, pending requests, screenshots, and embedded snapshot data share explicit per-chunk budgets; image resources and their referencing events are admitted atomically, chunks no longer re-ship earlier resources, and file-backed ZIP output streams directly to disk.
v0.1.10 — 2026-07-20
A reliability release hardening Chrome installation and browser lifecycle — no new automation surface (168 CLI commands / 130 MCP tools unchanged; parity stays 89 covered / 0 gaps).
Upgrade note — bl now enforces a minimum Chrome for Testing version of
150.0.7871.24, the version the BiDi surface is verified against. A cached
install older than that is no longer reported as installed by bl is-installed,
and launching refuses with installed Chrome for Testing <v> is older than the required version 150.0.7871.24; run "bl install" to update. Run bl install
once to update; it now upgrades an old install in place instead of
short-circuiting on "already installed".
- Chrome profile directories are owned and reclaimed — each session now
gets an explicit profile under
<cache>/profiles/instead of letting chromedriver pick an OS temp directory. A crash or kill previously stranded that profile in the OS temp dir forever; the background runtime (and the internal transports' shutdown) now sweeps orphanedbl-profile-*directories older than 10 minutes, skipping any still referenced by a live process. - Shutdown no longer kills unrelated browsers — orphan cleanup used to
match every
chromedriverandChrome for Testingprocess on the machine, so stoppingblcould kill a Selenium or Playwright run alongside it. It now matches only processes launched from browserlane's own cache path. bl installsurvives interruption and concurrent runs — extraction goes to a staging directory and is renamed into place only once both binaries are present, so an interrupted install can no longer leave a half-extracted version that later resolves as installed. A file lock keeps two concurrent installs from extracting over each other, downloads carry connect and stall timeouts (a slow-but-progressing download is no longer killed; a hung one aborts rather than hanging forever), archive extraction is size-capped, and archive entry paths are validated against traversal and escaping symlinks.- Chrome and chromedriver resolve as a pair — the two binaries are now
taken from the same version directory rather than resolved independently,
and version selection compares numerically instead of by filename sort (so
a cached
100.xreliably beats99.x).bl is-installedreports the mismatch explicitly and gains acompatiblefield in--json. - Windows process-tree cleanup — chromedriver and every descendant are
assigned to a kill-on-close job object at spawn, so the whole tree dies
with the handle even if
blitself crashes.taskkill /Tonly walked a live parent chain and missed renderers whose parent had already exited; it remains as a fallback. - Daemon resource leak fixed — a long-running daemon retained per-browser connection state and event-consumer tasks after a browser connection closed, growing memory over a long session.
v0.1.9 — 2026-07-17
A branding and curation release — no new automation surface (168 CLI commands / 130 MCP tools unchanged; parity stays 89 covered / 0 gaps).
- New tagline — browserlane is now the "Browser Automation Engine for
AI Agents" everywhere the product speaks:
bl --help, the launch dashboard, package metadata, the README, and both sites. - Internal module renames — the source tree now matches the
three-surface architecture (
cli/mcp/engine/chrome); no behavior change. - Docs & site curation — the public parity matrix slims to the columns a visitor acts on (the full record — id, kind, skill, engine test status, evidence — moves into each expanded row); docs header tabs reduce to Docs / CLI / MCP with the engine story and Agent Skill as Docs sections; the landing hero leads with the one-line installers behind an OS switcher and a live latest-release chip.
- Spec drift watch — a daily job diffs the latest published WebDriver BiDi draft against the pinned parity data and files any capability delta as a backlog issue, so a spec republish can't drift by unnoticed.
v0.1.8 — 2026-07-16
The parity milestone release: complete WebDriver BiDi specification coverage. All 89 capabilities — 65 commands and 24 events — of the pinned W3C Working Draft 2026-06-29 are now spec- and live-Chrome-verified, taking BiDi coverage from 70 covered / 19 gaps to 89 covered / 0 gaps. One new curated surface ships with it: session-scoped environment emulation.
- New — environment emulation (
bl emulate environment/bl emulate reset/ MCPbrowser_emulate_environment) — one grouped intention over the BiDiemulationmodule: locale, timezone, user agent, offline network, and disabled scripting. Overrides are scoped to the selected session's user context — they never leak into other sessions — and persist until explicitly reset (bl emulate reset environmentclears all five at once; each member also resets individually). - Complete
networkmodule verified (BIDI-053..070) — all thirteen commands (addIntercept/removeIntercept, request continuation/failure/fulfillment,continueWithAuth, data collectors andgetData/disownData,setCacheBehavior,setExtraHeaders) and all five events (beforeRequestSent,responseStarted,responseCompleted,authRequired,fetchError) on a typed protocol layer with strict decoding. Engine-internal under the existing network-inspection surfaces; two Chrome 150 deviations recorded in the matrix. - Complete
emulationmodule verified (BIDI-042..052) — all eleven set-override commands typed and live-verified with observable side effects (locale viaIntl, offlinenavigator.onLineflips, screen and orientation values, UA shadowing,noscriptsemantics, timezones, touch, geolocation). Two honest Chrome 150 limitations recorded:setForcedColorsModeThemeOverrideanswersunsupported operationandsetScrollbarTypeOverrideunknown command. webExtensionmodule verified (BIDI-088..089) —webExtension.install/uninstallon a typed layer carrying the full three-variant extension-data choice. Chrome 150 installs unpacked-directory extensions only, and under browserlane's standard launch arguments the install phantom-succeeds (an id is returned but the extension never functions), so the commands stay engine-internal — the honest record is in the matrix.browsingContext.setBypassCSPverified (BIDI-023) — the final gap. Typed layer with the spec's exacttrue / nullsemantics (falseis CDDL-invalid and inexpressible by construction). Chrome 150 predates the command entirely (unknown commandon every parameter form) — recorded as a Chrome limitation, not an engine gap.- Surface — 168 CLI commands / 130 MCP tools (was 165 / 129: the
emulatefamily is the only addition). BiDi capability coverage: 89 covered / 0 gaps against the pinned W3C Working Draft 2026-06-29, last verified 2026-07-16 — see the public parity matrix.
v0.1.7 — 2026-07-15
A parity-verification release: the complete script module — all six commands
and all three events — is now spec- and live-Chrome-verified, taking BiDi
coverage from 65 to 70 covered capabilities (19 gaps remain). No new CLI
commands or MCP tools; the engine gained typed protocol layers under the
JavaScript-execution primitives that bl eval already exposes.
- Complete
scriptcommands verified (BIDI-071..076) —script.evaluate,script.callFunction,script.addPreloadScript,script.disown,script.getRealms, andscript.removePreloadScriptare rebuilt on a typed protocol layer carrying the full parameter surface: context/realm/sandbox targets, result ownership, serialization options, user activation, and preload-script scoping, with strict decoding of the evaluate result union (typed exception details and stack traces), realm info (all eight variants), and empty results.bl eval/browser_evaluatekeep their exact behavior; a thrown-exception error now carries the browser's exception text instead of a null detail. - Complete
scriptevents verified (BIDI-077..079) —script.message,script.realmCreated, andscript.realmDestroyedare subscribed, routed, and payload-verified against Chrome, including the spec's replay of existing realms on subscription. They stay engine-internal (the WebSocket monitor already consumesscript.messageunder the hood); the realm and channel primitives are protocol plumbing, not a user-facing surface. - Surface — unchanged at 165 CLI commands / 129 MCP tools. BiDi capability coverage: 70 covered / 19 gaps against the pinned W3C Working Draft 2026-06-29, last verified 2026-07-14 — see the public parity matrix.
v0.1.6 — 2026-07-14
Console and download-wait surfaces over the engine's event machinery, typed
cookies, and a big parity sweep: the complete browsingContext event set and
the complete input module are now spec- and live-Chrome-verified, taking
BiDi coverage from 57 to 65 covered capabilities (24 gaps remain).
- New — console inspection (
bl console list|wait|clear/ MCPbrowser_console_list,browser_console_wait,browser_console_clear) — console messages and page errors are buffered from the BiDilog.entryAddedevent (verified as BIDI-083) on an always-on observability subscription, with level / text / type filters for both listing and blocking waits. No recording session required. - New — wait for a download (
bl download wait/ MCPbrowser_wait_download) — block until the next download completes and get its status, URL, and file path, driven by the engine'sbrowsingContext.downloadEndtracking. - Typed cookies (BIDI-080/081/082) —
storage.getCookies/setCookie/deleteCookiesrebuilt on a typed protocol layer (BytesValue, filters, partitions), andbl cookies setgained the full attribute set (domain, path, secure, httpOnly, sameSite, expiry). Fixes lenient lanes that could report a failed cookie operation as success. - Complete
browsingContextevent set verified (BIDI-028..041) — all fourteen lifecycle, navigation, download, and prompt events are subscribed, routed, and payload-verified against Chrome, with forensic traces normalizing the full registry. - Complete
inputmodule verified (BIDI-084..087) —input.performActionson a complete typed action model (key, pointer with pen/touch properties, wheel, and none sources),input.releaseActionsfor input-state cleanup,input.setFilesbehindbl upload/browser_upload(a silently-swallowedunable to set file inputerror now surfaces), and theinput.fileDialogOpenedevent decoded and routed engine-internally — Chrome auto-cancels a subscribed session's file pickers, so the event deliberately stays off product sessions and uploads remain dialog-free. - Surface — 129 MCP tools / 165 CLI commands (up from 125 / 160). BiDi capability coverage: 65 covered / 24 gaps against the pinned W3C Working Draft 2026-06-29, last verified 2026-07-14 — see the public parity matrix.
v0.1.5 — 2026-07-12
A protocol-correctness release. The session, browser, and
browsingContext WebDriver BiDi modules were rebuilt on typed protocol
layers and systematically verified against the spec and live Chrome, with
real fixes to error handling and connection recovery underneath. No new
commands or tools — the surface is unchanged; this release hardens the
engine that the existing surfaces already run on.
- Typed BiDi protocol layers — every command result and error in the
session,browser, andbrowsingContextmodules is now decoded through strict, spec-shaped types instead of loose JSON, so malformed protocol responses are caught at the boundary rather than surfacing as confusing downstream failures. - Fix — silent protocol errors now surface — several commands
(
browser.setDownloadBehavior,browsingContext.create/close) could have a BiDi error swallowed by the router and be reported as success; those errors now propagate correctly. - Ambiguous-outcome connection recovery — when a mutating command comes back malformed or times out, the connection is invalidated rather than continued in an unknown state; read-only failures keep the connection alive (a deliberate non-invalidation policy), so a bad screenshot or query no longer tears down your session.
- Native
browser.close— owned browser processes are now shut down gracefully over the BiDibrowser.closecommand first, withSIGKILLretained only as a backstop; remote sessions keep usingsession.end. - Live-Chrome parity verification — the full
session/browser/browsingContextcommand and event set (status, new/end, subscribe/unsubscribe, user contexts, client windows, download behavior, activate, captureScreenshot, create/close, getTree, handleUserPrompt, locateNodes, navigate/reload, print, setViewport, screencast, traverseHistory) is verified against the WebDriver BiDi spec and Chrome 150, with the evidence recorded in the public parity matrix (last verified 2026-07-12). - Surface unchanged — 125 MCP tools / 160 CLI commands, and BiDi
capability coverage is unchanged (57 covered / 32 gaps). Also establishes a
repo-wide
rustfmtbaseline.
v0.1.4 — 2026-07-09
New capture and inspection surfaces over WebDriver BiDi — native screencast recording, JS-dialog inspection, the nested frame hierarchy — plus BiDi print and reload options, and the repositioned websites with public WebDriver BiDi parity tracking.
bl screencast— native BiDi video recording overbrowsingContext.startScreencast/stopScreencast, with the matching MCPbrowser_screencast_start/browser_screencast_stoptools.bl dialog wait/bl dialog info— inspect a JavaScript dialog before deciding to accept or dismiss it; MCPbrowser_dialog_wait/browser_dialog_info.bl pages --tree— pages with their nested context/frame hierarchy; the MCPbrowser_context_treetool returns the same structure.bl viewport reset— clear viewport/DPR overrides, with strict option validation; MCPbrowser_reset_viewport.bl pdfprint options — the WebDriver BiDi print options (background, orientation, scale, shrink-to-fit, per-side margins, page size, page ranges) exposed and validated locally before any side effect; same schema on thebrowser_pdfMCP tool.bl reloadoptions —--ignore-cacheand--wait none|interactive|completeoverbrowsingContext.reload'signoreCacheand readiness params;browser_reload({ ignore_cache, wait })on MCP.- Public WebDriver BiDi parity tracking — the websites are repositioned
around the
blengine ("the local-first WebDriver BiDi engine for humans and AI agents"): a public parity matrix tracks every spec module, command, and event against the engine, its CLI/MCP exposure, Skill workflow, and Chrome verification, driven by canonical in-repo data. - 125 MCP tools / 160 CLI commands (up from 119/155).
v0.1.3 — 2026-07-08
BiDi-native window control that works over remote browsers, first-class
userContext visibility for named sessions, and a spec-compliant fix for
tearing down scoped event subscriptions.
- Window control over remote browsers — setting the browser window's
size/position/state now prefers the WebDriver-BiDi
browser.setClientWindowStatecommand, which works for both local and remote (CDP-attached) browsers. The old "not supported for remote browsers" rejection is gone; the chromedriver classic HTTP endpoints remain as a local-only fallback for drivers that predate the command. Same for thebrowser_set_windowMCP tool. userContextvisibility for sessions —bl session list(and the MCPSessionInfo) now surfaces the BiDiuserContextbacking each named session, so you can see the isolation boundary each session runs in. The background runtime reconciles sessions againstbrowser.getUserContextsper process (flagging leaked/missing drift rows, or an explicit row when the audit is unavailable) without auto-reaping anything. A session that has been reduced to zero tabs is revived — a fresh tab is recreated in its own user context — the next time a command needs a page, whilelist/close/switchstay free of surprise tab creation.- Fix — scoped subscription teardown — scoped (
context/userContext) event subscriptions now unsubscribe by subscription id rather than the attributes form, matching the current WebDriver-BiDi spec (which narrowed attributes-basedsession.unsubscribeto global subscriptions only). Global subscriptions and pre-id remote ends keep the backward-safe events form. Also fixes a latentfinish_launchrefcount bug where a failed process-critical subscribe could shadow a later recorder subscribe and silently dropuserPromptOpened/downloadWillBeginevents for that launch. - 119 MCP tools / 155 CLI commands, unchanged from v0.1.2 — this release deepens existing surfaces rather than adding new ones.
v0.1.2 — 2026-07-07
Structural and visual diffing, positional element selection, session-scoped
stop, and an opt-in forensic trace recorder.
bl difffamily —bl diff snapshotdiffs the page's accessibility snapshot against the previous one (or--baseline <file>);bl diff screenshot --baseline <file>pixel-compares screenshots (--threshold <0-1>,-owrites a red-highlight diff image); andbl diff url <a> <b>compares two pages directly (--screenshotfor pixel mode). Exposed asbrowser_diff_snapshot,browser_diff_screenshot, andbrowser_diff_url.--nth <n>/--last— pick a specific match when a selector hits multiple elements, on ten element commands (find,click,dblclick,fill,type,hover,focus,select,check,uncheck). The matching MCP tools takeindex/lastparameters.- Session-scoped
bl stop—bl stopnow closes only the current session; the shared background browser keeps running, and other sessions are untouched (an--isolatedsession still closes its dedicated browser).bl startre-creates a named session so the same name can be reused after a stop. - Forensic trace recorder (opt-in) — set
BL_TRACE=normal|debug|forensicto record each session run as a local, redacted, append-only trace (tool calls, errors, and — level-dependent — console, network metadata, and screenshots) under the cache directory'straces/folder. Off by default with zero overhead; redaction is always on at write time. This is the capture side of Browserlane Desktop, the optional UI over an installedbl, in development and not released. - Fix — the stray
about:blanklaunch tab is closed when the first action after a headed launch targets a named session. - 119 MCP tools total (up from 116), adding the three diff tools.
v0.1.1 — 2026-07-05
Agent-browser CORE parity: page reading, keyboard control, and a unified open command.
bl read/browser_read— read a page as agent-readable markdown: fetch a URL over HTTP without the browser (negotiating markdown/plain, retrying a.mdpath, discoveringllms.txt, extracting readable text from HTML), or omit the URL to render the active tab's live DOM — capturing client-rendered / authenticated state a plain fetch can't.- Keyboard control —
bl keyboard type/bl keyboard inserttexttype or insert text at the current focus (no selector); the originally shippedbl keydown/bl keyupare nowbl keyboard down/bl keyboard upfor held modifier sequences. Exposed today asbrowser_keyboard_type,browser_keyboard_inserttext,browser_keyboard_down, andbrowser_keyboard_up. - Unified
bl open— one navigation command withgo/goto/navigatealiases; a bare host likeexample.comgetshttps://prepended, and barebl openjust launches a local browser onabout:blank. - Breaking (MCP): the
browser_navigatetool is renamed tobrowser_open(itsurlis required — usebrowser_startto launch a browser without navigating,browser_stopto close it). - 116 MCP tools total (up from 111), now including the read and keyboard tools.
v0.1.0 — 2026-07-04
First public beta release.
- CLI — 71 commands for humans and scripts: navigate, interact, inspect the page, capture, assert, manage browser state and emulation, script with JavaScript, and manage sessions and the daemon.
- MCP server —
bl mcpexposes 111 tools to AI agents over stdio JSON-RPC;bl add-mcpregisters it with Claude Code, Claude Desktop, Cursor, VS Code, and the OpenAI Codex CLI in one command. - Named sessions —
--session <name>on every browser command, plusbl session new / list / close / reset / id. Each session has its own cookies, storage, and tabs, so parallel logins and scrapes never leak into each other;--isolatedgives a session a dedicated browser process for crash isolation. - Storage control — per-cookie and per-key
localStorage/sessionStorageCRUD, plus named storage snapshots (bl storage save/load/export/import) to restore a session later or move it between machines as canonical JSON. - Assertions —
bl expect(and thebrowser_expectMCP tool) asserts url / title / text / visibility / value / count / JS truthiness with real exit codes, so&&chains and CI scripts stop at the first failure. - WebDriver BiDi — drives Chrome for Testing exclusively over the
W3C-standard WebDriver BiDi protocol;
bl installfetches the browser into a local cache. - Persistent warm browser — an automatically managed background runtime keeps Chrome warm across CLI invocations for sub-second command startup, with per-session crash and idle recovery.
- Universal install scripts — a one-line installer for macOS, Linux, and
Windows with checksum verification, plus
bl update/bl uninstall. - Signed, notarized prebuilt binaries for macOS, Windows, and Linux.