Skip to content

Releases: BetterWright/betterwright

v1.1.2: stop blocking secret-shaped URLs in NetworkPolicy

Choose a tag to compare

@CuriosityOS CuriosityOS released this 24 Jul 06:35
15ccfa2

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, plus about: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

Choose a tag to compare

@CuriosityOS CuriosityOS released this 23 Jul 20:47
6c3e790

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 and state earlier 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)); --fresh starts over. Transcripts persist to disk (elided + capped) and survive daemon restarts.
  • Sessions: implicit default; isolate parallel work with --session <name>; inspect with betterwright sessions; end with betterwright 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_DAEMON restores one-shot behavior; changed policy/cloak flags replace an idle daemon or fall back to a private browser when the daemon is busy; interactive / view reclaim 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

Choose a tag to compare

@CuriosityOS CuriosityOS released this 23 Jul 19:49
63636af
  • 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

Choose a tag to compare

@CuriosityOS CuriosityOS released this 23 Jul 10:07
f62dee7
  • 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

Choose a tag to compare

@CuriosityOS CuriosityOS released this 23 Jul 09:03
98c4578
  • 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

Choose a tag to compare

@CuriosityOS CuriosityOS released this 22 Jul 15:28
d48aec8

Summary

  • betterwright update downloads, 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 setup installs the fork when a public artifact exists, plus Cloak as fallback (--cloak-only skips 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-fork

v0.9.10: native Chromium fork, cloaking v2, egress proxy

Choose a tag to compare

@CuriosityOS CuriosityOS released this 22 Jul 14:53
0a4230a

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.9 tag 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 (platform defaults to macos; opt out with linux/windows).
  • Zero-config fork discovery~/.betterwright/chromium/<platform>/, or BETTERWRIGHT_CHROMIUM_PATH / _ROOT. Missing artifact → Cloak. =off forces 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/ttf is 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_HOME from Cloak (shared profiles are not downgrade-safe). Pin timezone/locale to the exit IP’s region, or use geoip: true with upstreamProxy.
  • Docs: docs/getting-started.md, docs/chromium-fork.md.

Verify

npx betterwright@0.9.10 doctor

Chromium fork 150.0.7871.129

Choose a tag to compare

@CuriosityOS CuriosityOS released this 22 Jul 15:05
0a4230a

Pinned BetterWright Chromium fork artifacts for betterwright update / default setup.

  • mac-arm64 and linux-x64 zips (SHA-256 in SHA256SUMS.zips and in src/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

Choose a tag to compare

@CuriosityOS CuriosityOS released this 20 Jul 12:51
f0c127e

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/callback instead of the rejected localhost variant. 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

Choose a tag to compare

@CuriosityOS CuriosityOS released this 20 Jul 08:32
cecffbb

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, TerminateProcess skips 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.
  • EPERM creating 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/EBUSY during 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.mjs with 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.