Contents
Introduction
For years, headless Chrome has been the de facto standard for programmatic web browsing. It works — but at a cost. A typical headless Chrome instance consumes 200–300 MB of RAM, takes roughly two seconds to start, and ships with a binary over 300 MB in size. When you multiply that across dozens of concurrent AI agent sessions, the resource overhead becomes a first-class architectural concern.
Obscura is a headless browser written in Rust that reimagines this stack entirely. It replaces Chromium’s Blink rendering engine and V8 JavaScript runtime with a purpose-built Rust core backed by Deno’s V8 bindings, delivering a browser that boots instantly, consumes roughly 30 MB of RAM per page, and produces a binary around 70 MB. Despite the radical reduction in footprint, Obscura remains fully compatible with the Chrome DevTools Protocol (CDP), meaning existing tooling — Puppeteer, Playwright, and custom CDP clients — can connect to it as a drop-in replacement.
With over 15,700 GitHub stars and an active open-source community, Obscura has positioned itself as the browser purpose-built for AI agents, automation pipelines, and edge deployments where every megabyte matters.
Key Features
- Lightweight footprint: ~30MB RAM per page, ~70MB binary — run hundreds of concurrent sessions on a single machine
- Rust + V8 engine: Memory safety, no garbage collector, single V8 isolate via
deno_core - CDP compatible: Target, Page, Runtime, DOM, Network, Fetch, Storage, Input + custom LP domain for Markdown conversion
- Stealth mode built-in: TLS fingerprint randomization,
navigator.webdriver = undefined, 3,520 tracker domains blocked - MCP server: 12 structured browser tools for AI agents via Model Context Protocol
- Docker ready: ~57 MB compressed image on distroless/cc, no shell, no package manager
Architecture Overview
Obscura is organized into eight Rust crates, each with a clearly scoped responsibility:
| Crate | Role |
|---|---|
obscura-cli |
CLI entry point — fetch, serve, scrape, mcp subcommands |
obscura-cdp |
CDP WebSocket server — message dispatch and domain handler registration |
obscura-browser |
Page type, navigation, lifecycle events, session management |
obscura-js |
V8 runtime via deno_core — bootstrap.js plus Rust ops |
obscura-dom |
DOM tree data structures and serialization |
obscura-net |
HTTP client, stealth session, cookie jar, robots.txt cache, tracker blocklist |
obscura-mcp |
Model Context Protocol server — 12 browser tools |
obscura |
Embeddable Rust library API for programmatic use |
A critical architectural decision is the single V8 isolate design. Unlike Chrome which spawns a full renderer process per tab, Obscura runs all JavaScript within a single isolate per page. This eliminates IPC overhead and dramatically reduces memory consumption.
Performance & Benchmark
| Metric | Obscura | Headless Chrome |
|---|---|---|
| Memory per page | ~37 MB | 200–300 MB |
| Binary size | ~70 MB | 300+ MB |
| Startup time | Instant | ~2 seconds |
| Anti-detection | Built-in | None |
Latency benchmark (n=20 runs):
| Target | Obscura p50 | Chrome p50 | Obscura σ | Chrome σ |
|---|---|---|---|---|
| news.ycombinator.com | 219 ms | 268 ms | 16 ms | 76 ms |
| scrapegraphai.com | 234 ms | 242 ms | 11 ms | 68 ms |
Key insight: variance is dramatically lower on Obscura — σ stays under 20ms vs Chrome’s 68–76ms. For scraping pipelines where tail latency kills throughput, this is the real win.
Puppeteer / Playwright Compatibility
Obscura speaks CDP over WebSocket, which means it can serve as a backend for both Puppeteer and Playwright with minimal configuration.
// Puppeteer
import puppeteer from 'puppeteer-core';
const browser = await puppeteer.connect({
browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser',
});
const page = await browser.newPage();
await page.goto('https://example.com');
// Playwright
import { chromium } from 'playwright-core';
const browser = await chromium.connectOverCDP({
endpointURL: 'ws://127.0.0.1:9222',
});
AI Agent Integration
Obscura’s MCP server exposes 12 structured tools via both stdio and HTTP transports:
browser_navigate, browser_snapshot, browser_click, browser_fill,
browser_type, browser_press_key, browser_select_option,
browser_evaluate, browser_wait_for, browser_network_requests,
browser_console_messages, browser_close
Three key differentiators for AI agents:
- DOM-to-Markdown conversion — native LP domain returns clean Markdown for LLM consumption
- Stealth by default — no extra plugins needed for anti-detection
- Low per-agent cost — ~37MB/page enables hundreds of concurrent sessions on modest hardware
Getting Started
# Binary download
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-linux.tar.gz
tar xzf obscura-x86_64-linux.tar.gz
./obscura serve --port 9222
# Docker
docker run -d -p 9222:9222 h4ckf0r0day/obscura
# Build from source
git clone https://github.com/h4ckf0r0day/obscura && cd obscura
cargo build --release
./target/release/obscura serve --port 9222 --stealth
Conclusion
Obscura delivers an order-of-magnitude reduction in resource consumption while maintaining full CDP compatibility. At ~37 MB per page with predictable sub-250 ms latencies, it transforms the economics of running browser-based automation at scale.
For AI agent pipelines, edge computing environments, and any scenario where resource efficiency drives the bottom line, Obscura is a compelling alternative to headless Chrome.
The project is open-source under Apache 2.0 with releases following a rapid cadence — from v0.1.0 in April to v0.1.8 in June 2026. The roadmap includes Obscura Cloud, a managed hosting service that will further simplify deployment.