
1. Opening: if only a tool could finish this one step for you…
You deploy a crawler overnight and check the logs in the morning: 200 URLs, 17 alive, the rest all blocked by the target site's risk controls. Your ops colleague blames "poor IP pool quality", so you cycle through three batches of residential proxies and Cloudflare challenge pages are still waiting for you. Then you switch to Puppeteer + headless Chrome, single-instance memory jumps to 800MB, and as soon as concurrency goes up the server OOMs first. Crawler engineers and AI agent teams run into this constantly — the browser automation tool that was supposed to be the solution became the new bottleneck.
Is there a browser that runs in 30MB of memory, starts in nearly no time and comes with anti-fingerprinting built in? Obscura, a 21K-star Rust project, says yes.
2. In one sentence: what is this project
Obscura is an open-source headless browser engine written in Rust, designed for AI agent automation and large-scale web scraping. It embeds V8 to actually execute JavaScript, implements the Chrome DevTools Protocol in full, works as a drop-in replacement for headless Chrome, and is compatible with Puppeteer and Playwright.
Core keywords: written in Rust, native V8, built-in anti-detection, CDP compatible, Apache-2.0. It has picked up 21310 stars so far, and the team is preparing a hosted Obscura Cloud.
3. A deep dive into the core features
1. An extremely lightweight runtime
The Obscura binary is only 70MB and uses 30MB of memory at runtime, while headless Chrome typically needs 200MB+. The Docker image is built on distroless/cc and comes to roughly 57MB compressed — no shell, no package manager, clean enough to drop into any CI pipeline. For scraping clusters that need to scale horizontally, that means 5–7x more concurrent instances on the same physical machine.
2. Real JavaScript rendering plus built-in screenshots and PDF
Obscura embeds the V8 engine directly, and its rendering pipeline implements mainstream CSS paths natively — block, inline, flex, grid, table, float, transform — along with viewport and full-page screenshots, event-driven CDP screencast and rasterized PDF export. None of this requires launching Chromium, and a single command covers "visit → render → export":
obscura fetch https://example.com -s page.png
3. Built-in anti-fingerprinting and tracker blocking
Add --stealth at launch to enable anti-detection mode. It randomizes GPU, screen, canvas, audio and battery fingerprints per session, spoofs the high-entropy navigator.userAgentData values of Chrome 145, makes event.isTrusted = true, and resets navigator.webdriver to undefined. It also ships a built-in blocklist of 3520 tracking domains, out of the box — a capability that any headless Chrome setup has to assemble from third-party extensions.
4. Concurrent scraping and an MCP interface
obscura scrape fetches multiple URLs in parallel worker processes, 10 concurrent by default, tunable with --concurrency. Each worker inherits the global proxy configuration automatically. With obscura mcp you get an MCP Server, so AI clients such as Claude Desktop and Cursor can call browser_navigate, browser_snapshot, browser_click, browser_evaluate and 13 other tools — letting AI agents genuinely drive a browser that risk control doesn't flag.
5. Full CDP compatibility
It implements the core CDP domains — Target, Page, Runtime, DOM, Network, Fetch, IO, Storage, Input — including the chunked download path of Fetch.takeResponseBodyAsStream + IO.read, which streams large response bodies instead of buffering them all at once. That means existing Puppeteer/Playwright scripts can connect straight to Obscura with no changes to your business code.

4. Technical highlights and performance data
The official benchmarks are aggressive: 51ms to load a static HTML page (Chrome: about 500ms), 84ms for a JS page with XHR/fetch (Chrome: about 800ms), 78ms for a dynamic script-heavy page (Chrome: about 700ms). Startup time drops from Chrome's 2 seconds to nearly instantaneous.
A few technical details worth noting: native V8 embedding supports --v8-flags passthrough, and together with the OBSCURA_SCRIPT_DEADLINE_MS environment variable you can tune an SPA's script execution budget precisely; the stealth build integrates BoringSSL and provides a hardened network stack via wreq; and -no-render and -no-render-stealth variants let you choose between "protocol layer only" and "rendering + anti-detection".
On ecosystem compatibility, Puppeteer-core and Playwright-core both connect on the spot, and a Hermes agent plugin has already been released, so the community barely needs to rewrite its integration layer.
5. Use cases and who it's for
Large-scale web scraping: e-commerce price monitoring, SEO rank tracking, public opinion collection — high concurrency, heavily watched by risk control. Obscura's low memory plus built-in anti-fingerprinting targets exactly that.
AI agent browser automation: when an LLM has to actually "operate a browser" to complete a task (booking tickets, filling forms, aggregating information), the MCP Server exposes those capabilities straight to Claude/Cursor.
Rendering JS-heavy single-page apps: traditional HTTP clients can't get SPA data; Obscura's native V8 rendering lets you dump HTML / markdown / screenshots / PDF directly.
Not suitable for: scenarios needing WebGL 3D, games, media playback, rich text editors and other long-tail web APIs — the project explicitly says these are still evolving and may diverge from Chromium behavior.
6. Competitive comparison
| Dimension | Obscura | Headless Chrome | Playwright (Chromium) |
|---|---|---|---|
| Memory footprint | 30 MB | 200+ MB | 250+ MB |
| Binary size | 70 MB | 300+ MB | Requires full Chromium |
| Startup time | Instant | ~2s | ~2s |
| Anti-fingerprinting | Built in | None | Needs a stealth plugin |
| Tracker blocking | 3520 domains | None | Needs extensions |
| Page load | 51–84ms | 500–800ms | 500–800ms |
| CDP compatible | Yes | Yes | Yes |
In one line: Obscura delivers the same CDP capabilities as headless Chrome at about one tenth of the resource cost, and builds anti-detection into the default binary.

7. How to get started fast
One-line install (Linux x86_64):
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-linux.tar.gz && tar xzf obscura-x86_64-linux.tar.gz
Arch users can just run yay -S obscura-browser; macOS and Windows packages are on the Releases page. Docker users need one command: docker run -d --name obscura -p 127.0.0.1:9222:9222 h4ckf0r0day/obscura.
Minimal working example:
./obscura fetch https://example.com --eval "document.title"
Start the CDP server for Puppeteer:
./obscura serve --port 9222 --stealth
Then connect with puppeteer-core via puppeteer.connect({ browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser' }) — existing scripts need almost no modification.
Advanced tips: for JS-heavy sites remember to add --v8-flags "--max-old-space-size=4096" and set OBSCURA_SCRIPT_DEADLINE_MS=60000 so the V8 heap doesn't blow up or the script budget get cut short. Raise OBSCURA_NETWORK_BODY_BUFFER_BYTES when you need to stream large downloads.

8. Summary and recommended actions
Obscura rewrites the critical paths of a headless browser in Rust and solves the four pain points scraping and AI agent teams feel most — memory, startup, concurrency and anti-fingerprinting — all at once, while staying fully compatible with Puppeteer/Playwright, so existing scripts migrate almost painlessly. The engine is open source under Apache-2.0 with no features held back; Obscura Cloud will eventually offer hosted infrastructure and residential proxies, but the open-source version will always stay complete.
If headless Chrome's resource overhead is giving you headaches, or you're locked in a fight with Cloudflare challenge pages, grab the latest release from the GitHub repo and you can take memory usage from gigabytes down to megabytes tonight. If you'd rather not run the infrastructure yourself, you can also join the Cloud waitlist at obscura.sh.
The point of a tool is to free engineers from repetitive work — and Obscura is exactly the kind of project that should have entered your toolchain long ago.