Skip to content

Releases: detrin/brow

v1.3.0

Choose a tag to compare

@detrin detrin released this 15 Aug 16:07

Added

  • run -s <id> <file.py> [--arg k=v] — execute a reusable Python file once against the live session (same vars as eval, plus args), instead of shell-looping eval/CLI calls over a list. ~20x faster than a shell loop for 30 items (7.75s → 0.38s; see benchmarks/microbench_run_vs_loop.sh)
  • replay playbooks gained wait (by selector/state, not just a fixed sleep), assert (fail a step when a condition doesn't hold), for_each (loop nested steps over a literal or captured list), and headers on fetch steps
  • stop_on_failure: true playbook option halts remaining steps after the first failed one, including out of a nested for_each
  • setup --upgrade bumps the patchright pip package and installs the Chromium build it now expects, and restarts a running daemon so it stops driving the old binary from memory. Previously there was no command for this — brow setup alone just re-fetched the build for whatever version was already pinned
  • Update-available check: most commands now print a one-line [brow] brow X.Y.Z is available ... notice to stderr when a newer brow-cli is on PyPI, cached once a day (hourly retry on failure) so it almost never touches the network. Fails silently on any error and never blocks a command. Disable with BROW_NO_UPDATE_CHECK=1

Changed

  • License reverted to Elastic License 2.0 (was MIT) — permits free use, modification, and distribution, but not offering brow as a hosted/managed service. Releases up to and including 1.2.0 remain MIT-licensed; this applies to releases after 1.2.0

Fixed

  • fetch steps' output: name now actually populates {name} (and {name[key]}) for later steps, as the playbook-writer docs always claimed — previously it was only recorded in the run's result log and never fed back into substitution
  • replay CLI now exits nonzero when any step failed — previously it always exited 0 regardless of step outcomes
  • fetch steps with an HTTP 4xx/5xx response are now marked as failed (expect_status opts out) — previously any response, including a 500, was reported ok: true
  • An unknown playbook step action now reports a clear error instead of failing silently with no explanation
  • stop_on_failure now actually halts a run when the failure is inside a for_each — previously it only stopped the current iteration's remaining steps, and later iterations and outer steps kept going
  • A playbook-level auth: none is now inherited by fetch steps that don't set their own auth — previously only a per-step auth was ever checked
  • state restore now restores localStorage in addition to cookies — previously it silently dropped the origins half of storage_state(), so a restored login failed for any site keeping its auth token in localStorage instead of a cookie
  • profile delete now refuses (409) while a live session holds that profile, instead of deleting the on-disk directory out from under it
  • Docs site: every internal cross-reference link used a relative .md path that Astro never resolves and rendered as a literal broken href in the built site (e.g. href="daemon.md") — converted site-wide to the resolved /brow/... paths the sidebar itself uses

v1.2.0

Choose a tag to compare

@detrin detrin released this 15 Aug 11:57

Added

  • brow setup command to install Chromium (no more manual patchright install)
  • session new --reclaim closes a stale session holding the profile and takes it over (#31)
  • navigate --wait domcontentloaded|load|networkidle settle strategy (#33)
  • eval namespace helpers text(sel) and texts(sel) for quick extraction (#32)
  • click-until repeats a click until a selector clears or work runs out, for draining paginated lists/batch actions without a shell loop around brow

Changed

  • License reverted to MIT (was Elastic License 2.0)
  • session new returns a clear "Chromium is not installed" message instead of a raw 500 when the browser binary is missing
  • click/fill/select accept a snapshot ref directly: click "[1]" resolves to --ref 1 (#30)
  • Profile-conflict error now suggests --reclaim and the exact session delete command (#31)
  • eval errors involving an un-awaited coroutine now hint to add await (#32)
  • page switch now actually retargets later commands to the chosen tab instead of only changing which tab is visually focused
  • page new no longer silently steals the active tab when one was deliberately chosen; page list marks the active tab with *
  • eval timeout errors name --timeout, suggest a value, and return stdout printed before the cutoff instead of discarding it
  • fetch prints the non-2xx status to stderr (stdout stays pipeable to jq), with a hint on 401/403

v1.1.0

Choose a tag to compare

@detrin detrin released this 04 Apr 16:30

What's new

New CLI commands

  • brow network — inspect HTTP traffic captured during the session; filter by URL/type, exclude static assets
  • brow fetch — make HTTP requests with or without browser cookies (cookie-sharing or clean httpx client)
  • brow actions — view the action log with sequence numbers for every click, fill, navigate, etc.
  • brow replay — execute YAML playbooks to replay recorded action sequences
  • brow websocket — inspect captured WebSocket frames

Session instrumentation

  • Sessions now track network_requests, websocket_messages, and actions state automatically
  • _log_action() instrumentation across click, fill, select, key, navigate, fetch, upload

Bug fixes

  • Hash-routing fix in click handler: wait_for_load_state with 300ms timeout fallback prevents hangs on SPA hash navigation

Docs

  • Migrated from MkDocs to Astro Starlight — faster, better search, nicer design

Benchmarks

  • Added 6 new benchmark tasks (3 fixture + 3 live) across all 5 backends (22 tasks total)
  • brow leads on success rate: 88% fixture, 82% overall

v1.0.3

Choose a tag to compare

@detrin detrin released this 29 Mar 13:34

Full Changelog: v1.0.2...v1.0.3

v1.0.2

Choose a tag to compare

@detrin detrin released this 28 Mar 17:47

What's Changed

Bug Fixes

  • Surface API errors in CLI -- clean error messages instead of raw Python tracebacks
  • Fix fill --ref argument parsing -- --ref no longer requires a positional SELECTOR argument
  • Fix select --ref same issue

Features

  • Add --wait flag to brow daemon start -- blocks until server is ready to accept connections

Details

  • New BrowAPIError exception class for structured error handling
  • Exit code 2 for API errors (vs 1 for user errors)
  • Example: brow session new --profile personal now prints Error (400): Profile 'personal' already in use by session 2 instead of a traceback

Full Changelog: v1.0.1...v1.0.2

v1.0.1

Choose a tag to compare

@detrin detrin released this 27 Mar 18:01

What's Changed

Bug Fixes

  • Handle SNAPSHOT_JS crashes on complex DOMs (e.g. GitHub pages) with three-layer error handling

Chores

  • Bump version to 1.0.1

Full Changelog: v1.0.0...v1.0.1

v1.0.0

Choose a tag to compare

@detrin detrin released this 27 Mar 15:18

brow v1.0.0

Standalone Playwright CLI for agent browser automation. Launches a real Chromium instance with an agent-friendly API — structured commands for common actions, eval escape hatch for full power.

Highlights

  • Ref-based element addressing — snapshot shows [N] refs for interactive elements, click/fill by ref
  • Auto-snapshot on mutations — click, fill, select return updated page state automatically
  • Smart snapshots — table-aware markdown, inline list compression, adaptive node caps
  • Persistent profiles — survive logins across sessions
  • State save/restore — snapshot and restore cookies, localStorage, sessionStorage
  • Parallel tool execution — concurrent tool calls in agent loops

Benchmarks (vs playwright-cli and MCP Playwright)

Metric brow playwright-cli MCP Playwright
Avg tokens/task 86K 113K 118K
Success rate 69%% 44%% 38%%
Avg wall-clock 33s 44s 50s

brow uses 24%% fewer tokens, succeeds on 25%% more tasks, and runs 25%% faster than the next-best backend.

Install

brew tap detrin/tap && brew install brow
# or
pip install brow-cli && playwright install chromium

v0.1.4

Choose a tag to compare

@detrin detrin released this 21 Mar 14:37

Changes

  • Fix Homebrew installation by packaging README directly in tarball (no more .. paths)

Install

# Homebrew
brew tap detrin/tap
brew install brow

# pip
pip install brow-cli==0.1.4
playwright install chromium

v0.1.3

Choose a tag to compare

@detrin detrin released this 21 Mar 14:08

What's Changed

  • Add screenshot resolution control (low/medium/high quality presets)
  • Add retry logic and auto-wait for click/fill commands
  • Add Pillow for image resizing to reduce token consumption
  • Improve error messages with selector info and attempt counts
  • Add agent skill installation instructions
  • Restructure skill directory to skills/brow/ for npx skills add CLI
  • Require Python 3.12+

Installation

Agent frameworks can now install the brow skill directly:

npx -y skills add detrin/brow

Full Changelog: https://github.com/detrin/brow/compare/v0.1.1...v0.1.3

v0.1.2

Choose a tag to compare

@detrin detrin released this 21 Mar 13:26

What's Changed

  • Added agent skill installation instructions
  • Restructured skill directory to skills/brow/ for compatibility with npx skills add CLI

Installation

Agent frameworks can now install the brow skill directly:

npx -y skills add detrin/brow

Full Changelog: v0.1.1...v0.1.2