github jo-inc/camofox-browser v1.19.0
v1.19.0 — Agent tooling, reliability, and hardening

51 minutes ago

v1.19.0

A large release: the MCP agent tool surface is now complete and symmetric, browser interactions are more resilient under load, and the whole dependency and container story is tightened. Most of it comes out of running camofox-browser in production at Jo.

Every browser action is now an agent tool. The HTTP API and the MCP/OpenClaw tool interface are kept in lockstep by a build-time parity gate, so there is no action you can reach over HTTP that an agent can't call as a tool. This release adds a camofox_upload tool and a fullPage screenshot option, lets MCP callers pass a per-call userId/sessionKey (behind CAMOFOX_MCP_USER_IDS), and gives evaluate a timeoutMs that actually stops waiting when it fires. The bundled MCP SDK is updated to 1.32.1.

New low-level browser primitives. Coordinate clicks can now assert what they're about to hit (expected_role / expected_accessible_name) and refuse if the target moved. There are new endpoints to bring a tab to the front, read the raw accessibility tree, discover candidate interactive elements, page through large table rows, export a session's storage state and import localStorage, perform an atomic trusted pointer drag, scroll with an element-scoped mouse wheel, and get per-ref bounding boxes from a snapshot. Invalid evaluate expressions now come back as 400 invalid_expression instead of a 500.

More reliable sessions and tabs under real agent load. A self-closed popup (for example an OAuth window calling window.close()) no longer tears down the rest of a user's session, and a single stuck browser context can't hang that user's later requests (#15252). A cold-start POST /tabs that outlives its deadline now returns a retriable 503 with Retry-After and gets one bounded warmup extension, rather than a misleading 500 (#15183). Tab creation refuses gracefully under cgroup memory pressure, a responsive page timeout keeps its tab instead of bouncing near the memory cap, tab recycling is isolated by session key, and evaluate no longer takes the per-tab lock. Memory-pressure restarts are guarded against re-entrancy and churn, sessions persist longer under sustained work, and shutdown leaves a persistence-safe budget. Browser startup is decoupled from Google's availability, and interrupted-navigation serialization is fixed.

Viewport, fingerprint, and popups. Viewport sizing is fixed on Playwright 1.62 by stripping the new isMobile/screenSize Juggler fields (#14622). CAMOFOX_OS lets you override the fingerprint OS, which matters for Linux containers (#15106). Google OAuth popups are resized to a usable 640×700 while normal pages keep viewport: null (#7742).

Downloads, Docker, and plugins. Completed downloads are persisted and failed-download artifacts are cleaned up. The container image runs as non-root by default and tolerates arbitrary UIDs — the browser lives at /opt/camoufox-cache, the layout is group-0 writable, and it ships USER 1000 (#10989). Camoufox build defaults are aligned to the npm-bundled version (#14667). The plugin dependency installer now handles disabled plugins and install failures, and the VNC plugin can raise a session's window on the shared display (#15227).

Diagnostics and hardening. Native-memory leak auto-reports no longer fire on a normal working set — they report only when growth is large, sustained, and still climbing, and they carry the growth rate and active-session count so the genuine ones are actually diagnosable. Google SERP organic results are detected behind Google-hosted redirect wrappers. External Camoufox cache setup is hardened against version and symlink races, profile cleanup is restricted to completed owners, and element refs resolve by exact name. Every open Dependabot alert was cleared (24 of them), including the critical proxy-addr advisory; root and standalone-MCP audits report no moderate, high, or critical findings.

Ops note. Deployments that hardcode /root/.cache/camoufox or /root/.camofox must repoint: the browser is now at /opt/camoufox-cache/camoufox, writable data lives under /home/camofox/.camofox, and bind-mounts need :0 group access or an fsGroup.

Thanks to @zupolgec for CAMOFOX_OS, @shauneccles for per-call MCP identity and the evaluate timeout, @PluginsKers for the VNC raise-window support, and @pei711 for aligning the build defaults.

Don't miss a new camofox-browser release

NewReleases is sending notifications on new releases.