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 verbopen'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_readbrowser_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 handlingbl 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 valuesbl 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:

RemovedReplacement
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_keydownbrowser_keyboard_down
browser_keyupbrowser_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:

OldNew
bl pages / bl pages --treebl 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_pagesbrowser_tab_list
browser_new_pagebrowser_tab_new
browser_switch_pagebrowser_tab_switch
browser_close_pagebrowser_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 hierarchybl --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 → Elements

followed 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_find no longer fabricates a match — a CSS selector that matches nothing returns a clear element not found error (and leaves any previous @e1 mapping intact) instead of a successful-looking @e1 result 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 a timeout is 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 fill and browser_fill agree on one argument — the canonical key is text (what the MCP schema always advertised); the CLI now sends it, and the old value key remains accepted for compatibility.
  • CLI --json output 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, and install --json plus session new|list|close|reset --json now use that envelope instead of bare JSON (session id --json now wraps its identifier), and the background runtime's status reporting no longer prints prose before the JSON when the runtime is down.

Upgrade noteBROWSERLANE_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 notebl 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 orphaned bl-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 chromedriver and Chrome for Testing process on the machine, so stopping bl could kill a Selenium or Playwright run alongside it. It now matches only processes launched from browserlane's own cache path.
  • bl install survives 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.x reliably beats 99.x). bl is-installed reports the mismatch explicitly and gains a compatible field 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 bl itself crashes. taskkill /T only 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 / MCP browser_emulate_environment) — one grouped intention over the BiDi emulation module: 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 environment clears all five at once; each member also resets individually).
  • Complete network module verified (BIDI-053..070) — all thirteen commands (addIntercept/removeIntercept, request continuation/failure/fulfillment, continueWithAuth, data collectors and getData/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 emulation module verified (BIDI-042..052) — all eleven set-override commands typed and live-verified with observable side effects (locale via Intl, offline navigator.onLine flips, screen and orientation values, UA shadowing, noscript semantics, timezones, touch, geolocation). Two honest Chrome 150 limitations recorded: setForcedColorsModeThemeOverride answers unsupported operation and setScrollbarTypeOverride unknown command.
  • webExtension module verified (BIDI-088..089) — webExtension.install/uninstall on 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.setBypassCSP verified (BIDI-023) — the final gap. Typed layer with the spec's exact true / null semantics (false is CDDL-invalid and inexpressible by construction). Chrome 150 predates the command entirely (unknown command on every parameter form) — recorded as a Chrome limitation, not an engine gap.
  • Surface168 CLI commands / 130 MCP tools (was 165 / 129: the emulate family 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 script commands verified (BIDI-071..076) — script.evaluate, script.callFunction, script.addPreloadScript, script.disown, script.getRealms, and script.removePreloadScript are 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_evaluate keep their exact behavior; a thrown-exception error now carries the browser's exception text instead of a null detail.
  • Complete script events verified (BIDI-077..079) — script.message, script.realmCreated, and script.realmDestroyed are 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 consumes script.message under 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 / MCP browser_console_list, browser_console_wait, browser_console_clear) — console messages and page errors are buffered from the BiDi log.entryAdded event (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 / MCP browser_wait_download) — block until the next download completes and get its status, URL, and file path, driven by the engine's browsingContext.downloadEnd tracking.
  • Typed cookies (BIDI-080/081/082) — storage.getCookies / setCookie / deleteCookies rebuilt on a typed protocol layer (BytesValue, filters, partitions), and bl cookies set gained the full attribute set (domain, path, secure, httpOnly, sameSite, expiry). Fixes lenient lanes that could report a failed cookie operation as success.
  • Complete browsingContext event 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 input module verified (BIDI-084..087) — input.performActions on a complete typed action model (key, pointer with pen/touch properties, wheel, and none sources), input.releaseActions for input-state cleanup, input.setFiles behind bl upload / browser_upload (a silently-swallowed unable to set file input error now surfaces), and the input.fileDialogOpened event 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.
  • Surface129 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, and browsingContext modules 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 BiDi browser.close command first, with SIGKILL retained only as a backstop; remote sessions keep using session.end.
  • Live-Chrome parity verification — the full session / browser / browsingContext command 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 unchanged125 MCP tools / 160 CLI commands, and BiDi capability coverage is unchanged (57 covered / 32 gaps). Also establishes a repo-wide rustfmt baseline.

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 over browsingContext.startScreencast / stopScreencast, with the matching MCP browser_screencast_start / browser_screencast_stop tools.
  • bl dialog wait / bl dialog info — inspect a JavaScript dialog before deciding to accept or dismiss it; MCP browser_dialog_wait / browser_dialog_info.
  • bl pages --tree — pages with their nested context/frame hierarchy; the MCP browser_context_tree tool returns the same structure.
  • bl viewport reset — clear viewport/DPR overrides, with strict option validation; MCP browser_reset_viewport.
  • bl pdf print 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 the browser_pdf MCP tool.
  • bl reload options--ignore-cache and --wait none|interactive|complete over browsingContext.reload's ignoreCache and readiness params; browser_reload({ ignore_cache, wait }) on MCP.
  • Public WebDriver BiDi parity tracking — the websites are repositioned around the bl engine ("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.setClientWindowState command, 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 the browser_set_window MCP tool.
  • userContext visibility for sessionsbl session list (and the MCP SessionInfo) now surfaces the BiDi userContext backing each named session, so you can see the isolation boundary each session runs in. The background runtime reconciles sessions against browser.getUserContexts per 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, while list / close / switch stay 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-based session.unsubscribe to global subscriptions only). Global subscriptions and pre-id remote ends keep the backward-safe events form. Also fixes a latent finish_launch refcount bug where a failed process-critical subscribe could shadow a later recorder subscribe and silently drop userPromptOpened / downloadWillBegin events 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 diff familybl diff snapshot diffs the page's accessibility snapshot against the previous one (or --baseline <file>); bl diff screenshot --baseline <file> pixel-compares screenshots (--threshold <0-1>, -o writes a red-highlight diff image); and bl diff url <a> <b> compares two pages directly (--screenshot for pixel mode). Exposed as browser_diff_snapshot, browser_diff_screenshot, and browser_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 take index / last parameters.
  • Session-scoped bl stopbl stop now closes only the current session; the shared background browser keeps running, and other sessions are untouched (an --isolated session still closes its dedicated browser). bl start re-creates a named session so the same name can be reused after a stop.
  • Forensic trace recorder (opt-in) — set BL_TRACE=normal|debug|forensic to 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's traces/ 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 installed bl, in development and not released.
  • Fix — the stray about:blank launch 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 .md path, discovering llms.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 controlbl keyboard type / bl keyboard inserttext type or insert text at the current focus (no selector); the originally shipped bl keydown / bl keyup are now bl keyboard down / bl keyboard up for held modifier sequences. Exposed today as browser_keyboard_type, browser_keyboard_inserttext, browser_keyboard_down, and browser_keyboard_up.
  • Unified bl open — one navigation command with go / goto / navigate aliases; a bare host like example.com gets https:// prepended, and bare bl open just launches a local browser on about:blank.
  • Breaking (MCP): the browser_navigate tool is renamed to browser_open (its url is required — use browser_start to launch a browser without navigating, browser_stop to 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 serverbl mcp exposes 111 tools to AI agents over stdio JSON-RPC; bl add-mcp registers 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, plus bl 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; --isolated gives a session a dedicated browser process for crash isolation.
  • Storage control — per-cookie and per-key localStorage / sessionStorage CRUD, plus named storage snapshots (bl storage save / load / export / import) to restore a session later or move it between machines as canonical JSON.
  • Assertionsbl expect (and the browser_expect MCP 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 install fetches 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.

On this page