← Back to Blog

Obscura — A Rust-Powered Headless Browser That's 10x Faster Than Chrome for AI Agents

Obscura — A Rust-Powered Headless Browser That's 10x Faster Than Chrome for AI Agents

What is Obscura?

Obscura is an open-source headless browser engine written in Rust, purpose-built for AI agent automation and web scraping at scale. It's a drop-in replacement for headless Chrome that uses 90% less memory, loads pages 6x faster, and boots instantly — all while staying fully compatible with Puppeteer and Playwright via the Chrome DevTools Protocol (CDP).

GitHub: github.com/h4ckf0r0day/obscura
Stars: ⭐ 9,300+ (and climbing fast)
License: Apache 2.0

Why this matters: If you're running AI agents (Claude Code, Codex, browser-use, etc.) or large-scale scrapers, headless Chrome is often the heaviest dependency in your stack. Obscura slashes resource usage by an order of magnitude.

Key Features

Metric Obscura Headless Chrome
Memory 30 MB 200+ MB
Binary size 70 MB 300+ MB
Page load 85 ms ~500 ms
Startup Instant ~2 s
Anti-detection Built-in None
Puppeteer/Playwright Yes Yes
  • Real JavaScript — Powered by V8, not a toy. Runs actual JS, XHR, fetch, and DOM manipulation.
  • CDP Server — Full Chrome DevTools Protocol support. Connect Puppeteer or Playwright and it just works.
  • Stealth Mode — Anti-fingerprinting, tracker blocking (3,520 domains), navigator.webdriver masking.
  • Three CLI Commandsfetch (single page), serve (CDP server), scrape (parallel bulk).
  • Single Binary — No Chrome, no Node.js, no npm. One curl and you're done.

Architecture Overview

Obscura is composed of six Rust crates:

Obscura Architecture

The CLI feeds into either the CDP WebSocket server (for external tooling) or directly into the browser engine. The browser engine orchestrates V8 for JS, html5ever for DOM, and reqwest for networking. Stealth mode wraps the engine in anti-detection layers.

Prerequisites

  • Linux x86_64 (binary), or macOS (Apple Silicon / Intel)
  • Rust 1.75+ (only if building from source)
  • No Chrome, no Node.js, no Docker required

Setup Guide

Option 1: Download the Binary (Recommended)

# Linux
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-linux.tar.gz
tar xzf obscura-x86_64-linux.tar.gz
sudo mv obscura /usr/local/bin/

# macOS (Apple Silicon)
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-macos.tar.gz
tar xzf obscura-aarch64-macos.tar.gz
sudo mv obscura /usr/local/bin/

# Verify
obscura --help

Option 2: Build from Source

git clone https://github.com/h4ckf0r0day/obscura.git
cd obscura

# Standard build (~5 min first time, V8 compiles from source)
cargo build --release

# With stealth mode
cargo build --release --features stealth

sudo cp target/release/obscura /usr/local/bin/

Option 3: Docker (if you prefer containers)

Since Obscura is a single static binary, you can containerize it yourself:

FROM alpine:3.20
COPY obscura /usr/local/bin/obscura
EXPOSE 9222
ENTRYPOINT ["obscura"]
CMD ["serve", "--port", "9222"]

Build and run:

docker build -t obscura .
docker run -d -p 9222:9222 obscura serve --port 9222

Step-by-Step Usage

1. Quick Page Fetch

# Get a page title
obscura fetch https://news.ycombinator.com --eval "document.title"
# → "Hacker News"

# Dump all links
obscura fetch https://example.com --dump links

# Render JS-heavy page
obscura fetch https://example.com --wait-until networkidle0 --dump html

2. Start the CDP Server

obscura serve --port 9222

# With stealth mode
obscura serve --port 9222 --stealth

3. Connect Puppeteer

npm install puppeteer-core
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'))
    .slice(0, 10)
    .map(a => ({ title: a.textContent, url: a.href }))
);
console.log(stories);

await browser.disconnect();

4. Connect Playwright

npm install playwright-core
import { chromium } from 'playwright-core';

const browser = await chromium.connectOverCDP({
  endpointURL: 'ws://127.0.0.1:9222',
});

const page = await browser.newPage();
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
console.log(await page.title());

await browser.close();

5. Bulk Scraping

obscura scrape \
https://example.com/page1 \
https://example.com/page2 \
https://example.com/page3 \
--concurrency 25 \
--eval "document.querySelector('h1').textContent" \
--format json > results.json

Stealth Mode

Obscura's stealth mode is built-in — no plugins, no extra config. When enabled with --features stealth, it:

  • Randomizes fingerprints per session (GPU, screen, canvas, audio, battery)
  • Spoofs navigator.userAgentData with realistic Chrome 145 values
  • Masks navigator.webdriverundefined (matches real Chrome)
  • Blocks 3,520 tracker domains (analytics, ads, telemetry, fingerprinting)
  • Native function maskingFunction.prototype.toString() returns [native code]

Use Cases

  • AI Agent Browsing — Give Claude Code or Codex a lightweight browser to navigate the web
  • Web Scraping at Scale — 25 concurrent workers, JSON output, minimal memory
  • Testing — Drop-in CDP-compatible browser for Playwright/Puppeteer test suites
  • Monitoring — Lightweight page checks on a Raspberry Pi
  • Social Media Automation — Login flows, posting, data extraction

Performance

Page Type Obscura Headless Chrome
Static HTML 51 ms ~500 ms
JS + XHR + fetch 84 ms ~800 ms
Dynamic scripts 78 ms ~700 ms
← Retour au Blog

Obscura — Un Navigateur Headless en Rust 10x Plus Rapide Que Chrome pour les Agents IA

Obscura — Un Navigateur Headless en Rust 10x Plus Rapide Que Chrome pour les Agents IA

Qu'est-ce qu'Obscura ?

Obscura est un moteur de navigateur headless open-source écrit en Rust, conçu spécifiquement pour l'automatisation par agents IA et le web scraping à grande échelle. C'est un remplacement direct de Chrome headless qui utilise 90 % de mémoire en moins, charge les pages 6x plus vite et démarre instantanément — tout en restant totalement compatible avec Puppeteer et Playwright via le protocole Chrome DevTools (CDP).

GitHub : github.com/h4ckf0r0day/obscura
Stars : ⭐ 9 300+ (en croissance rapide)
Licence : Apache 2.0

Pourquoi c'est important : Si vous utilisez des agents IA (Claude Code, Codex, browser-use, etc.) ou des scrapers à grande échelle, Chrome headless est souvent la dépendance la plus lourde de votre stack. Obscura réduit la consommation de ressources d'un ordre de grandeur.

Fonctionnalités clés

Métrique Obscura Chrome Headless
Mémoire 30 Mo 200+ Mo
Taille du binaire 70 Mo 300+ Mo
Chargement de page 85 ms ~500 ms
Démarrage Instantané ~2 s
Anti-détection Intégré Aucun
Puppeteer/Playwright Oui Oui
  • JavaScript réel — Propulsé par V8, pas un jouet. Exécute du JS, XHR, fetch et manipulation du DOM.
  • Serveur CDP — Support complet du protocole Chrome DevTools. Connectez Puppeteer ou Playwright et ça marche.
  • Mode Furtif — Anti-empreinte numérique, blocage de trackers (3 520 domaines), masquage de navigator.webdriver.
  • Trois commandes CLIfetch (page unique), serve (serveur CDP), scrape (parallèle en masse).
  • Binaire unique — Pas de Chrome, pas de Node.js, pas de npm. Un curl et c'est fini.

Architecture

Obscura est composé de six crates Rust :

Architecture d'Obscura

La CLI alimente soit le serveur WebSocket CDP (pour les outils externes), soit directement le moteur du navigateur. Le moteur orchestre V8 pour le JS, html5ever pour le DOM et reqwest pour le réseau. Le mode furtif enveloppe le moteur dans des couches d'anti-détection.

Prérequis

  • Linux x86_64 (binaire), ou macOS (Apple Silicon / Intel)
  • Rust 1.75+ (uniquement pour la compilation depuis les sources)
  • Pas de Chrome, pas de Node.js, pas de Docker requis

Guide d'Installation

Option 1 : Télécharger le Binaire (Recommandé)

# Linux
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-linux.tar.gz
tar xzf obscura-x86_64-linux.tar.gz
sudo mv obscura /usr/local/bin/

# macOS (Apple Silicon)
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-macos.tar.gz
tar xzf obscura-aarch64-macos.tar.gz
sudo mv obscura /usr/local/bin/

# Vérification
obscura --help

Option 2 : Compilation depuis les Sources

git clone https://github.com/h4ckf0r0day/obscura.git
cd obscura

# Compilation standard (~5 min la première fois, V8 compile depuis les sources)
cargo build --release

# Avec le mode furtif
cargo build --release --features stealth

sudo cp target/release/obscura /usr/local/bin/

Option 3 : Docker

FROM alpine:3.20
COPY obscura /usr/local/bin/obscura
EXPOSE 9222
ENTRYPOINT ["obscura"]
CMD ["serve", "--port", "9222"]

Construction et exécution :

docker build -t obscura .
docker run -d -p 9222:9222 obscura serve --port 9222

Utilisation Pas à Pas

1. Récupération Rapide d'une Page

# Obtenir le titre d'une page
obscura fetch https://news.ycombinator.com --eval "document.title"
# → "Hacker News"

# Extraire tous les liens
obscura fetch https://example.com --dump links

# Rendre une page chargée en JS
obscura fetch https://example.com --wait-until networkidle0 --dump html

2. Démarrer le Serveur CDP

obscura serve --port 9222

# Avec mode furtif
obscura serve --port 9222 --stealth

3. Connecter Puppeteer

npm install puppeteer-core
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'))
    .slice(0, 10)
    .map(a => ({ title: a.textContent, url: a.href }))
);
console.log(stories);

await browser.disconnect();

4. Connecter Playwright

npm install playwright-core
import { chromium } from 'playwright-core';

const browser = await chromium.connectOverCDP({
  endpointURL: 'ws://127.0.0.1:9222',
});

const page = await browser.newPage();
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
console.log(await page.title());

await browser.close();

5. Scraping en Masse

obscura scrape \
https://example.com/page1 \
https://example.com/page2 \
https://example.com/page3 \
--concurrency 25 \
--eval "document.querySelector('h1').textContent" \
--format json > results.json

Mode Furtif (Stealth)

Le mode furtif d'Obscura est intégré — pas de plugins, pas de configuration supplémentaire. Activé avec --features stealth, il :

  • Randomise les empreintes par session (GPU, écran, canvas, audio, batterie)
  • Usurpe navigator.userAgentData avec des valeurs réalistes de Chrome 145
  • Masque navigator.webdriverundefined (comme un vrai Chrome)
  • Bloque 3 520 domaines de traqueurs (analytiques, pubs, télémétrie, empreinte)
  • Masquage des fonctions nativesFunction.prototype.toString() retourne [native code]

Cas d'Utilisation

  • Navigation par Agent IA — Donnez à Claude Code ou Codex un navigateur léger pour naviguer sur le web
  • Web Scraping à Grande Échelle — 25 workers concurrents, sortie JSON, mémoire minimale
  • Tests — Navigateur compatible CDP pour les suites de tests Playwright/Puppeteer
  • Monitoring — Vérifications légères de pages sur un Raspberry Pi
  • Automatisation des Réseaux Sociaux — Flux de connexion, publication, extraction de données

Performances

Type de Page Obscura Chrome Headless
HTML statique 51 ms ~500 ms
JS + XHR + fetch 84 ms ~800 ms
Scripts dynamiques 78 ms ~700 ms