# Changelog
## 0.3.4 — 2026-05-15
### Changed
- Browser resolution no longer falls back to "most recently alive in the
registry" when no argument, `BROWSER_CONTROL` env, or persisted default
is supplied. That fallback depended on global state another process
could mutate, producing surprising behaviour on shared hosts. Callers
must now be explicit — pass an argument, set `BROWSER_CONTROL`, or run
`browser-control set default <value>`.
## 0.3.3 — 2026-05-15
### Changed
- `browser-control start` now waits for the browser's debugging endpoint
to be reachable before returning (up to `--wait-timeout` seconds,
default 30). This eliminates the most common command chain of
`start && wait --ready && ...` and prevents races where agents tried
to attach before the endpoint was serving requests. Pass `--no-wait`
to opt out and return as soon as the process is spawned.
## 0.3.2 — 2026-05-15
### Fixed
- `browser-control wait --ready` and `list-running --json` enrichment
used the raw `ws://host:port/devtools/browser/<id>` endpoint as the
HTTP probe base, so the `/json/version` request never succeeded.
`wait --ready` always timed out and `cdp_ws_url` / `bidi_ws_url` were
silently `null`. Endpoints are now normalised to `http(s)://host:port`
before probing.
## 0.3.1 — 2026-05-15
### Fixed
- Removed the `--profile` flag from `browser-control start`. Agents tended
to pass a fresh profile path on every invocation, defeating the persisted
default profile and forcing repeated re-authentication. The persisted
per-kind profile under the OS app-data dir is now the only option,
matching the documented intent of 0.3.0.
## 0.3.0 — 2026-05-15
### Added
- New session subcommands that attach to a running browser and operate on it
over CDP (Chromium-family) or BiDi (Firefox) with a single CLI surface:
- `browser-control targets` — list/filter open page targets
(`--url REGEX`, `--json`).
- `browser-control cookies` — export cookies with `--domain`/`--name`
regex filters; formats `json` (default), `netscape`, and `header`.
`-o FILE` writes the file `chmod 0600`; `--reveal` opts in to printing
full values to stdout. The `netscape` output is byte-compatible with
the Mozilla `cookies.txt` format used by `curl` and `yt-dlp`.
- `browser-control fetch` — run an HTTP request from inside the page
context (cookies, CORS, TLS apply). `-X`, `-H`, `-d`, `--target REGEX`,
`-i`, `-o FILE`.
- `browser-control storage get|set|list` — read/write `localStorage` or
`sessionStorage` (`--namespace session`).
- `browser-control eval` — run a JS expression in the active page,
optionally with a `--json` envelope and `--target REGEX`.
- `browser-control wait --ready` — block until the browser's CDP / BiDi
endpoint is reachable.
- `browser-control wait-for-cookie` — block until a cookie matching
`--domain REGEX --name REGEX` exists; optional `--validate-url URL`
requires a 2xx response before exiting.
- New MCP tools mirroring the above: `list_targets`, `cookies`,
`storage_get`, `storage_set`, `wait_for_cookie`.
- `browser-control list-running --json` is enriched with `cdp_port`,
`cdp_ws_url` (CDP), and `bidi_ws_url` (Firefox) for tooling integration.
Stale rows are re-probed before WS URLs are emitted; the fields are
omitted when the probe fails.
- New documentation under [docs/session-ops.md](docs/session-ops.md)
covering the engine-agnostic `PageSession` model, `TargetInfo` shape, the
exact `cookies --format netscape` byte format, and profile semantics.
### Changed
- `browser-control start` without `--profile` now uses a stable persisted
profile per browser kind under the OS app-data dir
(`profiles/<kind>/default/`) instead of a fresh ad-hoc temp directory on
every launch. Browser state (cookies, logins, extensions) is reused
across invocations and across MCP agents. `--profile <absolute-path>`
continues to override per-invocation. Named profiles are deferred.
## 0.2.2 - 2026-05-14
### Added
- `browser-control set default <value>` / `get default` / `unset default`:
persist a default browser used by `browser-control mcp` when no positional
argument and no `BROWSER_CONTROL` env var is present. Values accept the full
`BROWSER_CONTROL` grammar (URL, kind, friendly name, absolute path) and are
validated at set-time. Stored as TOML in the OS config dir
(`BROWSER_CONTROL_CONFIG_DIR` overrides the location).
### Changed
- `browser-control mcp`: the positional `BROWSER` argument now overrides the
`BROWSER_CONTROL` environment variable (previously env took precedence).
Clap merges them, and `--help` advertises the `BROWSER_CONTROL` env binding.
## 0.2.1 - 2026-05-13
### Fixed
- `browser-control start` now fully detaches the spawned browser from the
parent shell. Previously the child inherited piped stdout/stderr; once
the CLI exited, the read-ends closed and the next stderr write from the
browser produced `SIGPIPE` and killed it. Symptom: `start` printed the
PID, then `list-running` immediately showed nothing.
- Stdout/stderr are now redirected to `<profile>/browser.log` instead
of being piped to the parent.
- On Unix the child calls `setsid(2)` in a `pre_exec` hook so it
becomes its own session leader (PPID=1, own PGID). Terminal signals
sent to the parent's process group no longer reach the browser.
## 0.2.0 - 2026-05-13
First Rust release. Establishes the crate on crates.io and seeds the
in-repo Homebrew tap. CI handles all subsequent releases end-to-end.
### Breaking
- Project rewritten in Rust as a CLI. The previous TypeScript MCP server is
archived on the `legacy-ts` branch (tagged `v0-final-ts`). The npm package
`@anthropic-community/browser-coordinator-mcp` is deprecated.
### Added
- `browser-control list-installed`, `list-running`, `start`, `mcp` subcommands.
- Persistent SQLite registry of running browsers.
- Friendly per-instance names (e.g. `firefox-pikachu`).
- `BROWSER_CONTROL` environment variable for session-level browser selection.
- `mcp --playwright` stdio passthrough to `@playwright/mcp`.
### Removed
- `coordinator_launch_browser`, `coordinator_stop_browser`,
`coordinator_restart_browser` (browser lifecycle is now CLI-only).
- `coordinator_get_markdown` (no Turndown port in v1).
- CDP reverse proxy (replaced by direct connection or `mcp --playwright`).
- VS Code companion extension's Unix-socket IPC (replaced by env-var
injection).