Repository navigation
Releases: detrin/brow
Releases · detrin/brow
Release list
v1.3.0
Added
run -s <id> <file.py> [--arg k=v]— execute a reusable Python file once against the live session (same vars aseval, plusargs), instead of shell-loopingeval/CLI calls over a list. ~20x faster than a shell loop for 30 items (7.75s → 0.38s; seebenchmarks/microbench_run_vs_loop.sh)replayplaybooks gainedwait(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), andheadersonfetchstepsstop_on_failure: trueplaybook option halts remaining steps after the first failed one, including out of a nestedfor_eachsetup --upgradebumps thepatchrightpip 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 setupalone 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 newerbrow-cliis 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 withBROW_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
fetchsteps'output: namenow 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 substitutionreplayCLI now exits nonzero when any step failed — previously it always exited 0 regardless of step outcomesfetchsteps with an HTTP 4xx/5xx response are now marked as failed (expect_statusopts out) — previously any response, including a 500, was reportedok: true- An unknown playbook step
actionnow reports a clear error instead of failing silently with no explanation stop_on_failurenow actually halts a run when the failure is inside afor_each— previously it only stopped the current iteration's remaining steps, and later iterations and outer steps kept going- A playbook-level
auth: noneis now inherited byfetchsteps that don't set their ownauth— previously only a per-stepauthwas ever checked state restorenow restores localStorage in addition to cookies — previously it silently dropped theoriginshalf ofstorage_state(), so a restored login failed for any site keeping its auth token in localStorage instead of a cookieprofile deletenow 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
.mdpath 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
Added
brow setupcommand to install Chromium (no more manualpatchright install)session new --reclaimcloses a stale session holding the profile and takes it over (#31)navigate --wait domcontentloaded|load|networkidlesettle strategy (#33)evalnamespace helperstext(sel)andtexts(sel)for quick extraction (#32)click-untilrepeats a click until a selector clears or work runs out, for draining paginated lists/batch actions without a shell loop aroundbrow
Changed
- License reverted to MIT (was Elastic License 2.0)
session newreturns 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
--reclaimand the exactsession deletecommand (#31) evalerrors involving an un-awaited coroutine now hint to addawait(#32)page switchnow actually retargets later commands to the chosen tab instead of only changing which tab is visually focusedpage newno longer silently steals the active tab when one was deliberately chosen;page listmarks the active tab with*evaltimeout errors name--timeout, suggest a value, and return stdout printed before the cutoff instead of discarding itfetchprints the non-2xx status to stderr (stdout stays pipeable to jq), with a hint on 401/403
v1.1.0
What's new
New CLI commands
brow network— inspect HTTP traffic captured during the session; filter by URL/type, exclude static assetsbrow 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 sequencesbrow websocket— inspect captured WebSocket frames
Session instrumentation
- Sessions now track
network_requests,websocket_messages, andactionsstate automatically _log_action()instrumentation across click, fill, select, key, navigate, fetch, upload
Bug fixes
- Hash-routing fix in click handler:
wait_for_load_statewith 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
v1.0.2
What's Changed
Bug Fixes
- Surface API errors in CLI -- clean error messages instead of raw Python tracebacks
- Fix
fill --refargument parsing ----refno longer requires a positional SELECTOR argument - Fix
select --refsame issue
Features
- Add
--waitflag tobrow daemon start-- blocks until server is ready to accept connections
Details
- New
BrowAPIErrorexception class for structured error handling - Exit code 2 for API errors (vs 1 for user errors)
- Example:
brow session new --profile personalnow printsError (400): Profile 'personal' already in use by session 2instead of a traceback
Full Changelog: v1.0.1...v1.0.2
v1.0.1
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
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 chromiumv0.1.4
v0.1.3
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/fornpx skills addCLI - 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.3v0.1.2
What's Changed
- Added agent skill installation instructions
- Restructured skill directory to
skills/brow/for compatibility withnpx skills addCLI
Installation
Agent frameworks can now install the brow skill directly:
npx -y skills add detrin/browFull Changelog: v0.1.1...v0.1.2