The Problem

Web scraping and AI agent automation at scale are bottlenecked by heavyweight browser engines. Headless Chrome consumes 200+ MB of memory per instance and takes seconds to start, making parallel scraping expensive and slow. Existing headless browsers also have obvious fingerprints that anti-bot systems detect and block.

What This Does

Obscura is a headless browser engine written in Rust that implements the Chrome DevTools Protocol (CDP) as a drop-in replacement for headless Chrome. It runs real JavaScript via V8 and works with Puppeteer and Playwright without code changes. The architecture is split into focused crates: obscura-browser handles page lifecycle and contexts, obscura-cdp implements the CDP server and protocol domains (network, DOM, runtime, input, storage), obscura-net manages the HTTP client, cookies, and robots.txt compliance, and obscura-js embeds the V8 JavaScript engine.

The README claims significant performance advantages: ~30 MB memory usage, ~85 ms page loads, and instant startup versus Chrome's ~500 ms and 200+ MB. A stealth feature flag enables anti-detection and tracker blocking, built from the obscura-net crate's blocklist and interceptor modules.

How To Use It

The project is a Rust workspace managed with Cargo. Build from source with cargo build --release, optionally adding --features stealth for anti-detection. Prebuilt binaries are available from the GitHub releases page.

Fetch a page and extract the title

obscura fetch https://example.com --eval "document.title"

Start the CDP server for Puppeteer/Playwright

obscura serve --port 9222 --stealth

Scrape multiple URLs in parallel

obscura scrape url1 url2 url3 --concurrency 25 --format json

The CLI entry point is crates/obscura-cli/src/main.rs, which delegates to the worker module for parallel scraping. The CDP server runs from crates/obscura-cdp/src/server.rs. No environment variables or config files are required; all configuration is via CLI flags.

Real-World Use

A typical deployment is a scraping service where each container runs one obscura serve --port 9222 instance. A Python or Node.js orchestrator connects via CDP to distribute work across pages:

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://news.ycombinator.com'); const stories = await page.evaluate(() => Array.from(document.querySelectorAll('.titleline > a')) .map(a => ({ title: a.textContent, url: a.href })) );

The --stealth flag matters for production scraping: it enables anti-detection measures and tracker blocking that plain Chrome lacks.

Code Health & Issues

Med – No test files detected. The entire workspace has zero test files across 38 Rust files. Critical protocol handling in obscura-cdp/src/dispatch.rs and DOM serialization in obscura-dom/src/serialize.rs are untested. This is the biggest risk for a browser engine. Med – Single CI workflow. Only .github/workflows/release.yml exists. No CI for linting, formatting, or tests on pull requests. Low – Heuristic-only issue detection. The analysis flagged no security or dependency problems, but the absence of tests means vulnerabilities could go unnoticed. Low – Missing license file. The repo has a LICENSE file, which is good.

The Bottom Line

Obscura addresses a real pain point: headless browsers that are too heavy and too detectable for production scraping. The Rust implementation and CDP compatibility are technically sound, and the performance claims are plausible given the architecture. The lack of tests is a serious concern for a project positioning itself as infrastructure — protocol bugs in a browser engine are costly to diagnose. Use it for prototyping or if you need Chrome-compatible automation at lower resource cost, but verify behavior against your target sites before committing to it in production.