Releases: BetterWright/betterwright
Release list
v1.1.2: stop blocking secret-shaped URLs in NetworkPolicy
Network policy
NetworkPolicy no longer refuses URLs that look like they carry an API key or JWT (query/path heuristics for sk-…, ghp_…, JWTs, etc.). That check and the blockSecretBearingUrls option are gone.
Still blocked as before:
- Cloud instance-metadata endpoints (unliftable)
- Non-web schemes (only
http/https/ws/wss, plusabout:blank/data:/blob:) - Optional private/loopback hardening and
blockHosts/allowHosts
Docs, TypeScript types, unit tests, and policy conformance vectors match the new posture.
v1.1.1: persistent session daemon
Persistent browser sessions
A background session daemon (one per BETTERWRIGHT_HOME) now owns the browser, so tabs, page state, logins, and the repl state object survive between CLI invocations — the browser no longer closes when a command exits.
run/repl: every invocation attaches to the same live session; snippets see the tabs andstateearlier calls left behind.exec: the agent loop runs inside the daemon with live-streamed steps, and the LLM conversation resumes across calls (resumed session "default" (N prior messages));--freshstarts over. Transcripts persist to disk (elided + capped) and survive daemon restarts.- Sessions: implicit
default; isolate parallel work with--session <name>; inspect withbetterwright sessions; end withbetterwright close [name|--all]. Idle sessions auto-close after 15 minutes (BETTERWRIGHT_SESSION_TTL_SECONDS); the daemon exits once empty. - Escape hatches:
--no-daemon/BETTERWRIGHT_NO_DAEMONrestores one-shot behavior; changed policy/cloak flags replace an idle daemon or fall back to a private browser when the daemon is busy;interactive/viewreclaim the profile from an idle daemon.
The skill text now teaches agents the persistent-session model. No breaking API changes; closeSession() added to the client surface.
🤖 Generated with Claude Code
v1.1.0: model-first selection and OpenAI-compatible endpoints
- Resolve models by real id across Claude, Codex, Grok, OpenRouter, Ollama, vLLM, and custom OpenAI-compatible endpoints (
betterwright models,--base-url, qualified selectors) - Improve interactive console / live-view continuity with
/model,/endpoint,/models, steering drain, and durable viewer URLs across browser rotations - Ship the Odysseys benchmark harness and docs updates for long-horizon web-agent evaluation
- Publish BetterWright 1.1.0 through trusted npm publishing with provenance
v1.0.0: integrated agent browser foundation
- Preserve model-visible live-view chat and human handoff delivery across the standalone agent loop, MCP tools, and the documented skill + CLI path
- Modularize credential match validation and page inspection helpers without changing the public API contract
- Keep CDP-free research tooling and benchmark artifacts in the repository while excluding experimental runtime sources from the npm package
- Publish the canonical BetterWright 1.0.0 package through trusted npm publishing with provenance
Validated with 440 required-browser tests, 5 headed Cloak tests, 17 focused integrated chat/handoff tests, package-surface inspection, production dependency audit, and secret scanning.
v0.9.12: canonical BetterWright repository links
- Point npm repository, homepage, and issue links to
BetterWright/betterwright - Update README links and Chromium release downloads to the new organization
- No functional API changes
v0.9.11: betterwright update installs Chromium fork
Summary
betterwright updatedownloads, SHA-256 verifies, and installs the pinned Chromium fork into~/.betterwright/chromium/, switching the default backend off CloakBrowser on macOS arm64 and Linux x64- Default
betterwright setupinstalls the fork when a public artifact exists, plus Cloak as fallback (--cloak-onlyskips the fork) - Artifacts: chromium-150.0.7871.129
Upgrade
npm install -g betterwright@0.9.11
betterwright update # or: betterwright setup
betterwright doctor # browser: chromium-forkv0.9.10: native Chromium fork, cloaking v2, egress proxy
Summary
Native Chromium fork routing (zero-config discovery + Cloak fallback), Cloaking V2, upstream egress proxy / geoip, and Linux→macOS identity wiring. Cloak-only installs keep working; fork hosts must pin timezone/locale to egress (not hard-coded to any country).
Note: Published as 0.9.10 because a protected
v0.9.9tag was accidentally created on the prior 0.9.7 commit and could not be moved. Contents are the intended 0.9.9 release.
Added
- Native fork platform masking — Linux hosts present a consumer-Mac identity (
platformdefaults tomacos; opt out withlinux/windows). - Zero-config fork discovery —
~/.betterwright/chromium/<platform>/, orBETTERWRIGHT_CHROMIUM_PATH/_ROOT. Missing artifact → Cloak.=offforces Cloak. - Cloaking V2 — coherent locale/timezone/headed-invisible options; on by default.
- Upstream egress proxy + geoip — policy-checked tunnel; optional locale/tz from egress geography.
- Doctor — reports fork fonts warning when
fonts/ttfis missing beside the binary.
Upgrade notes
- Cloak-only: safe
npm update— no fork artifact means no behavior change on browser backend. - Fork adopters: deploy the Chromium 150 artifact separately (not in the npm tarball). Use a separate
BETTERWRIGHT_HOMEfrom Cloak (shared profiles are not downgrade-safe). Pintimezone/localeto the exit IP’s region, or usegeoip: truewithupstreamProxy. - Docs:
docs/getting-started.md,docs/chromium-fork.md.
Verify
npx betterwright@0.9.10 doctorChromium fork 150.0.7871.129
Pinned BetterWright Chromium fork artifacts for betterwright update / default setup.
- mac-arm64 and linux-x64 zips (SHA-256 in
SHA256SUMS.zipsand insrc/chromium-fork.mjs) - Public packages intentionally omit Apple-licensed fonts
- Not an npm package release — install via
npx betterwright update
v0.9.7: credential capture, uncapped agents, and Grok OAuth
Added
- Accepted login capture. Betterwright can save successful browser logins into the credential vault after trusted-input checks, with headed prompts and a persistent “Never for this site” option.
Changed
- Agent runs no longer have a fixed step cap. Runs continue until completion while bounded by wall-clock and transcript limits, with cancellation propagated through model and tool calls.
Fixed
- Grok OAuth login now uses xAI's registered loopback callback. Betterwright advertises
http://127.0.0.1:56121/callbackinstead of the rejectedlocalhostvariant. Authorization codes are captured automatically by the local callback server. - Grok OAuth sessions refresh automatically. Expired access tokens use the stored refresh token, rotated refresh tokens are persisted, and the existing token is retained if xAI does not return a replacement.
Full changelog: v0.9.6...v0.9.7
v0.9.6 — self-healing browser profile lock for Windows
Fixed
- Windows sessions no longer get permanently locked out of the saved browser profile. The persistent-profile lock now carries a heartbeat lease: the owning worker refreshes it every 15 s, and a lock whose lease has been stale for 60 s is reclaimed even when its recorded pid appears alive. Previously, a hard-killed worker (on Windows,
TerminateProcessskips shutdown) left a lock whose pid was quickly recycled by an unrelated live process, so every new session was forced into an ephemeral profile without saved logins with no way to recover. Locks written by ≤0.9.5 keep the old pid-only semantics, so a live old-version holder is never robbed. EPERMcreating the lock no longer aborts the launch. Sandboxes that block writes outside the workspace (reported on Windows) now degrade gracefully: BetterWright continues on the persistent profile without the advisory lock — Chromium's own profile singleton remains the final authority against true concurrent use.- Windows
EPERM/EBUSYduring stale-lock cleanup (open handles, antivirus) now falls back to an ephemeral profile with an actionable warning instead of crashing. - The occupied-profile warning now tells the agent which pid holds the profile, how to reclaim it, and that a crashed process's lock expires on its own within about a minute.
- Releasing the lock verifies ownership by token, so a worker never deletes a lock another process has since taken over.
Internals
- Lock logic extracted to
src/profile-lock.mjswith a dedicated unit suite (tests/node/profile-lock.test.mjs), including the pid-reuse reclaim case. - Deflaked the worker-exit credential recovery test that intermittently timed out or hung CI.