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:

  1. DOM-to-Markdown conversion — native LP domain returns clean Markdown for LLM consumption
  2. Stealth by default — no extra plugins needed for anti-detection
  3. 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.

Leave a Comment

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply