Repository navigation
Releases
v0.1.3 | Lands the `deno_core` 0.408 bump deferred from 0.1.2 — a V8 isolate must now be constructed inside an entered tokio runtime or the process aborts — and makes the V8 heap ceiling environment-tunable.
Fixed
-
A V8 isolate constructed outside a tokio runtime aborted the process
(#37).deno_core
0.408 capturestokio::runtime::Handle::try_current()when it registers an
isolate and spawns V8's delayed foreground tasks — GC memory-reducer work —
on that handle; with no handle it prints a diagnostic and calls
std::process::abort(). The synchronous constructors
(BrowserJsRuntime::new/with_profile/with_options) are public API
callable from a plainfn mainor a#[test], so they now enter a
process-lifetime fallback runtime when the caller has none. Applies to both
the page and worker realms.Worth being precise, because it shaped the 0.1.2 release: the abort is
not debug-gated and not platform-specific. Release builds passed only
while V8 happened not to post a delayed task inside the window under test —
i.e. a latent production abort, which is why the bump was held back from
0.1.2 rather than shipped. Reproduced on Linux, macOS and Windows.
Added
-
Environment-tunable V8 heap limits. The right ceiling is a property of
the deployment, not of the engine, and the previous hard-coded 4 GB silently
over-committed small containers.BROWSER_OXIDE_HEAP_MAX_MB— default4096(4 GB)BROWSER_OXIDE_HEAP_INITIAL_MB— default1024(1 GB)
Unparseable or zero values fall back to the defaults with a warning rather
than failing; an initial above the ceiling is clamped, since V8 rejects that
pairing. Both are per-isolate, so aPagePoolof N pages can commit up
to N × the ceiling — seedocs/CONFIGURATION.md.
Dependencies
deno_core0.404 → 0.408 (V8 149.2.0 → 149.4.0), the bump deferred from
0.1.2.
Changed
- CI runs
cargo testwith--nocapture. Not cosmetic: libtest captures each
test's output and replays it only on failure, so when a test aborts the
reason dies with it. That is why #37 first surfaced as a bare
signal: 6, SIGABRTwith no diagnosis. Any future abort-on-construction
would otherwise be undiagnosable from CI logs alone.
Verified
- Canvas fingerprint byte-identical across the V8 bump —
examples/canvas_fp_probe.rsreportslen=17502 fnv1a=5b1d42ee9bdc9713, the
same value as 0.1.1 and 0.1.2. - Real-site regression vs
main, 15 open sites, both engine paths: zero
regressions; the warm-reuse fix from 0.1.2 still holds (pool 11/15 → 12/15). - Full CI matrix green on ubuntu (stable/beta/nightly), macOS and Windows —
including the debug jobs that previously aborted.
Installation
Rust (crates.io)
cargo add browser_oxidePython (PyPI)
pip install browser-oxideMCP Server (for AI assistants)
cargo install browser_oxide_mcpOr download a pre-built browser-oxide-mcp binary for Linux, macOS, or Windows
from the assets below.
Platform Support (MCP binary)
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 (glibc) | browser-oxide-mcp-x86_64-unknown-linux-gnu.tar.gz |
| macOS | ARM64 (Apple Silicon) | browser-oxide-mcp-aarch64-apple-darwin.tar.gz |
| macOS | x86_64 (Intel) | browser-oxide-mcp-x86_64-apple-darwin.tar.gz |
| Windows | x86_64 | browser-oxide-mcp-x86_64-pc-windows-msvc.tar.gz |
Changelog
See CHANGELOG.md for full details.
v0.1.0 | First open-source release of BrowserOxide — a from-scratch stealth headless browser engine in Rust: own HTTP/1+2+3 + BoringSSL TLS stack, V8 via deno_core, from-scratch CSS/DOM/layout/canvas, configurable browser-identity profiles, and a CDP-compatible debugging surface. Dual-licensed MIT OR Apache-2.0.
Added
- From-scratch browser engine: HTML parser, arena-allocated DOM + Shadow DOM +
iframes, CSS parser/selectors/values/cascade, layout, and Canvas 2D / WebGL
rendering — no Chromium, no fork. - Stealth networking stack: HTTP/1, HTTP/2, and HTTP/3 with Chrome-identical
TLS ClientHello + HTTP/2 fingerprint via boring2 (Cloudflare BoringSSL fork). - Native (not injected) browser fingerprint via configurable stealth profiles
(Chrome 148 / Firefox 135 / Safari 18 desktop + mobile presets), loadable
from YAML/JSON. - JavaScript runtime on V8 (deno_core 0.403) with Web-platform APIs, workers,
and an event loop. ChallengeSolvertrait +Page::navigate_with_solvershook for embedders;
no per-vendor bypass code ships in the public crate (seeSCOPE.md).- Python bindings (PyO3), published to PyPI as
browser-oxide. - MCP server (
browser_oxide_mcp) for AI assistants. - CDP-compatible debugging/automation surface (Puppeteer/Playwright drop-in).
Performance
- Single-process architecture: ~60–135 MB peak RSS per page vs a headless-Chrome
process tree's 1–2 GB — roughly 15× lighter (seedocs/MEMORY.md). - Warm
PagePoolamortizes V8 isolate + snapshot setup across navigations.
Notes
- Anti-bot corpus: routed 118/126 commercially-protected sites to a real render
in a same-machine, same-IP cleanroom run, with zero per-vendor bypass code
(seedocs/BENCHMARK.md). - Python wheels ship for macOS (Apple Silicon + Intel) and Windows. The Linux
wheel is deferred to 0.1.1: the prebuilt V8 uses a local-exec TLS model that
can't link into a-sharedCPython extension, and a from-source rebuild isn't
possible from the crates.iov8tarball. The Linux package will land via a
sidecar (engine binary + thin Python client). The Rust crate and the MCP server
are unaffected and support Linux, macOS, and Windows.
Installation
Rust (crates.io)
cargo add browser_oxidePython (PyPI)
pip install browser-oxideMCP Server (for AI assistants)
cargo install browser_oxide_mcpOr download a pre-built browser-oxide-mcp binary for Linux, macOS, or Windows
from the assets below.
Platform Support (MCP binary)
| Platform | Architecture | Archive |
|---|---|---|
| Linux | x86_64 (glibc) | browser-oxide-mcp-x86_64-unknown-linux-gnu.tar.gz |
| macOS | ARM64 (Apple Silicon) | browser-oxide-mcp-aarch64-apple-darwin.tar.gz |
| macOS | x86_64 (Intel) | browser-oxide-mcp-x86_64-apple-darwin.tar.gz |
| Windows | x86_64 | browser-oxide-mcp-x86_64-pc-windows-msvc.tar.gz |
Changelog
See CHANGELOG.md for full details.