h4ckf0r0day/obscuraPublic

The headless browser for AI agents and web scraping

AI summary: A Rust-based headless browser tailored for AI agents and automated scraping.

Stars
20.3K
+313 today
Forks
1.5K
Watchers
69
Open issues
22
Open PRs
17
Contributors
~48
Commits
432
Branches
1

RustApache-2.0Created Apr 13, 2026Last push 2d agoLatest release v0.1.11+476 stars this week+509 this month

Star history

since Apr 12, 2026
010K20KApr 2026May 2026Jun 2026Aug 2026
20.3K stars as of Aug 7, 2026, tracked back to Apr 12, 2026. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

Contribution activity

commits per day, last 52 weeks
AugSepOctNovDecJanFebMarAprMayJunJulAugMonWedFri2025-08-10: 0 commits2025-08-11: 0 commits2025-08-12: 0 commits2025-08-13: 0 commits2025-08-14: 0 commits2025-08-15: 0 commits2025-08-16: 0 commits2025-08-17: 0 commits2025-08-18: 0 commits2025-08-19: 0 commits2025-08-20: 0 commits2025-08-21: 0 commits2025-08-22: 0 commits2025-08-23: 0 commits2025-08-24: 0 commits2025-08-25: 0 commits2025-08-26: 0 commits2025-08-27: 0 commits2025-08-28: 0 commits2025-08-29: 0 commits2025-08-30: 0 commits2025-08-31: 0 commits2025-09-01: 0 commits2025-09-02: 0 commits2025-09-03: 0 commits2025-09-04: 0 commits2025-09-05: 0 commits2025-09-06: 0 commits2025-09-07: 0 commits2025-09-08: 0 commits2025-09-09: 0 commits2025-09-10: 0 commits2025-09-11: 0 commits2025-09-12: 0 commits2025-09-13: 0 commits2025-09-14: 0 commits2025-09-15: 0 commits2025-09-16: 0 commits2025-09-17: 0 commits2025-09-18: 0 commits2025-09-19: 0 commits2025-09-20: 0 commits2025-09-21: 0 commits2025-09-22: 0 commits2025-09-23: 0 commits2025-09-24: 0 commits2025-09-25: 0 commits2025-09-26: 0 commits2025-09-27: 0 commits2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 5 commits2026-04-14: 0 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 2 commits2026-04-25: 5 commits2026-04-26: 0 commits2026-04-27: 3 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 18 commits2026-05-04: 0 commits2026-05-05: 1 commit2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 10 commits2026-05-10: 1 commit2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 11 commits2026-05-14: 10 commits2026-05-15: 9 commits2026-05-16: 3 commits2026-05-17: 0 commits2026-05-18: 2 commits2026-05-19: 0 commits2026-05-20: 0 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 9 commits2026-05-25: 3 commits2026-05-26: 1 commit2026-05-27: 1 commit2026-05-28: 0 commits2026-05-29: 5 commits2026-05-30: 2 commits2026-05-31: 6 commits2026-06-01: 0 commits2026-06-02: 5 commits2026-06-03: 9 commits2026-06-04: 2 commits2026-06-05: 5 commits2026-06-06: 9 commits2026-06-07: 5 commits2026-06-08: 8 commits2026-06-09: 5 commits2026-06-10: 11 commits2026-06-11: 9 commits2026-06-12: 1 commit2026-06-13: 3 commits2026-06-14: 1 commit2026-06-15: 0 commits2026-06-16: 0 commits2026-06-17: 5 commits2026-06-18: 5 commits2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 7 commits2026-06-23: 8 commits2026-06-24: 9 commits2026-06-25: 1 commit2026-06-26: 2 commits2026-06-27: 1 commit2026-06-28: 0 commits2026-06-29: 3 commits2026-06-30: 3 commits2026-07-01: 5 commits2026-07-02: 0 commits2026-07-03: 6 commits2026-07-04: 0 commits2026-07-05: 0 commits2026-07-06: 2 commits2026-07-07: 2 commits2026-07-08: 0 commits2026-07-09: 5 commits2026-07-10: 5 commits2026-07-11: 4 commits2026-07-12: 0 commits2026-07-13: 1 commit2026-07-14: 12 commits2026-07-15: 0 commits2026-07-16: 12 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 5 commits2026-07-20: 5 commits2026-07-21: 1 commit2026-07-22: 11 commits2026-07-23: 1 commit2026-07-24: 4 commits2026-07-25: 1 commit2026-07-26: 16 commits2026-07-27: 1 commit2026-07-28: 2 commits2026-07-29: 3 commits2026-07-30: 3 commits2026-07-31: 1 commit2026-08-01: 7 commits2026-08-02: 2 commits2026-08-03: 4 commits2026-08-04: 0 commits2026-08-05: 1 commit2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits
346 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Widely adopted

    20,317 stars

  • Breakout launch

    20,317 stars in 116 days

  • Outside contributions

    93% of recent commits from the community

  • Permissive license

    Apache-2.0

  • Continuous integration

    Automated checks passing

  • Repeat trending

    7 trending appearances

What obscura does

Obscura is a specialized headless browser engineered specifically to serve the needs of AI agents and web scraping tools. Written in Rust, it emphasizes performance, reliability, and evasion capabilities. It incorporates 'antidetect' features to help automated scripts bypass common bot protection mechanisms. By providing a robust, CDP-compatible (Chrome DevTools Protocol) interface, it acts as a powerful backend for higher-level automation frameworks like Playwright or Puppeteer.

Data engineers, security researchers, and developers building autonomous AI agents that require robust web interaction capabilities. It is ideal for those facing strict anti-bot measures.

  • Rust implementation: Ensures high performance, memory safety, and low overhead during operation.
  • Antidetect capabilities: Built-in features designed to evade standard bot detection systems.
  • AI agent focus: Specifically tailored to handle the unpredictable navigation patterns of autonomous agents.
  • CDP compatibility: Seamlessly integrates with existing automation tools via the Chrome DevTools Protocol.
  • Headless optimization: Stripped down for efficient execution without unnecessary GUI overhead.

Where teams use it

AI agent browsing

Provide a reliable, stealthy browsing backend for autonomous agents gathering data.

Large-scale web scraping

Extract data from complex, heavily defended websites at scale with reduced blocking rates.

Automated testing

Run reliable end-to-end tests against applications that employ aggressive bot mitigation.

Evasion research

Test and develop new techniques for bypassing modern web application firewalls.

README

main branch

Obscura

Obscura

h4ckf0r0day%2Fobscura | Trendshift

Documentation Website Book a demo Releases

The open-source headless browser for AI agents and web scraping.
Lightweight, stealthy, and built in Rust.


Obscura is a headless browser engine written in Rust, built for web scraping and AI agent automation. It runs real JavaScript via V8, supports the Chrome DevTools Protocol, and acts as a drop-in replacement for headless Chrome with Puppeteer and Playwright.

Why Obscura over headless Chrome?

Designed for automation at scale, not desktop browsing.

Metric Obscura Headless Chrome
Memory 30 MB 200+ MB
Binary size 70 MB 300+ MB
Anti-detect Built-in None
Page load 85 ms ~500 ms
Startup Instant ~2s
Puppeteer Yes Yes
Playwright Yes Yes

🎉 10,000 stars and what's next

We are working on Obscura Cloud the hosted version, with managed infrastructure, residential proxies, and dedicated support. For people who want the engine without operating it themselves.

The open-source engine stays Apache-2.0, fully featured. No feature gating, ever.

Get on the waitlist →
📅 Book a demo →

Sponsors

Obscura is supported by sponsors who help keep development independent.

Want to sponsor? Email hello@obscura.sh.

SX.org 🚀 Obscura × SX.org
Using Obscura for AI agents, browser automation, or web scraping? Power your workflow with stable proxies from SX.org.

🌍 12M+ IPs across 235 countries
🏠 7M+ residential IPs
📱 4M+ mobile IPs
🏢 1M+ corporate proxies
🔁 Rotating & sticky sessions
📍 Flexible geo setup
🌐 HTTP, HTTPS & SOCKS5 support
⚡ Up to 99.97% connection success
🛟 24/7 support

🎁 Use code Obscura3gb to get a free 3GB trial.

Stable proxies. Fewer blocks. Most reliable Obscura automation.
NodeMaven NodeMaven — the most reliable proxy provider with the highest quality IPs on the market. Built for automation, web scraping, SEO research, and social media management.

99.9% uptime
Sticky sessions up to 7 days
IP filtering on every proxy
No KYC required
Cashback on traffic — earn up to 10% back

🎁 Use code OBSCURA35 for 35% off Mobile & Residential, or OBSCURA40 for 40% off ISP (Static) proxies.
ProxyEmpire 🚀 Obscura × ProxyEmpire
Using Obscura for AI agents, browser automation, or web scraping? Power it with reliable residential and mobile proxies from ProxyEmpire.

🌍 30M+ residential IPs in 170+ countries
📱 4G/5G mobile proxies
🔄 Rotating & sticky sessions
🎯 City, region & ISP targeting
🔐 HTTP, HTTPS & SOCKS5 support

🎁 Use code OBSCURA35 for a 35% recurring discount.

Better proxies. Fewer blocks. More scalable automation.
9Proxy 9Proxy provides residential proxies from just $0.018/IP or $0.68/GB. 20M+ IPs across 90+ countries. Sticky or rotating sessions, managed from desktop or mobile app.
Thordata 🚀 Obscura × Thordata
Need more stable proxies for automation, public web scraping, SEO, or ad verification? Power your workflow with Thordata.

🌍 Residential Proxies: 100M+ real residential IPs in 190+ countries
♾️ Unlimited Proxies: for heavy traffic and high concurrency
✨ Recently upgraded residential IP pool
✨ Unlimited Concurrent Sessions
🔁 Rotating & Sticky Sessions
📍 Flexible GEO targeting
⚡ Stable HTTP(S) connections

🎁 Use code obscura for 10% off.

Get started with a 3-day free trial and test Thordata with your own workflow.

Install

Download

Grab the latest binary from Releases:

# 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
./obscura fetch https://example.com --eval "document.title"

# Linux ARM64 (aarch64)
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-linux.tar.gz
tar xzf obscura-aarch64-linux.tar.gz

# Arch Linux (AUR)
yay -S obscura-browser

# NixOS
nix-env -iA nixpkgs.obscura

# 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

# macOS Intel
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-macos.tar.gz
tar xzf obscura-x86_64-macos.tar.gz

# Windows
Download the `.zip` from the releases page and extract it manually.

No Chrome, no Node.js, no dependencies. Release archives include both obscura and obscura-worker; keep them in the same directory for the parallel scrape command.

Default archive names contain the lean binary. Archives ending in -stealth.tar.gz or -stealth.zip additionally include the wreq/BoringSSL transport used for TLS impersonation.

Linux release builds target Ubuntu 22.04 so the downloaded binary remains usable on common LTS servers with glibc 2.35+.

Docker

docker run -d --name obscura -p 127.0.0.1:9222:9222 h4ckf0r0day/obscura

Image on Docker Hub. Multi-stage build on distroless/cc, no shell, no package manager, ~57 MB compressed.

Build from source

git clone https://github.com/h4ckf0r0day/obscura.git
cd obscura
cargo build --release

# With stealth mode (anti-detection + tracker blocking)
cargo build --release --features stealth

Requires Rust 1.75+ (rustup.rs). First build takes ~5 min (V8 compiles from source, cached after). The stealth build also compiles BoringSSL and generates bindings, so it needs CMake, Clang, and the libclang/LLVM development libraries. On Ubuntu/Debian:

sudo apt-get install build-essential cmake clang libclang-dev llvm-dev

The default build does not require these additional stealth dependencies.

Quick Start

Fetch a page

# Get the page title
obscura fetch https://example.com --eval "document.title"

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

# Render JavaScript and dump HTML
obscura fetch https://news.ycombinator.com --dump html

# Write dump or eval output to a file
obscura fetch https://example.com --dump text --output page.txt

# Stream the raw response body verbatim (binary-safe; bypasses the JS/DOM layer).
# Use this for images, JSON, JS, CSS, or any non-HTML resource.
obscura fetch https://picsum.photos/200/300 --dump original > photo.jpg

# List every sub-resource URL the page would fetch (NDJSON; one record per asset)
obscura fetch https://example.com --dump assets

# Fetch through an HTTP or SOCKS proxy
obscura --proxy socks5://127.0.0.1:1080 fetch https://example.com --dump text

# Wait for dynamic content
obscura fetch https://example.com --wait-until networkidle0

# Bound navigation time for slow or broken pages
obscura fetch https://example.com --timeout 10

Start the CDP server

obscura serve --port 9222

# With stealth mode (anti-detection + tracker blocking)
obscura serve --port 9222 --stealth

Scrape in parallel

obscura scrape url1 url2 url3 ... \
  --concurrency 25 \
  --eval "document.querySelector('h1').textContent" \
  --format json

# Suppress scrape progress on stderr for script-friendly output
obscura scrape https://example.com --quiet --format json

# Scrape workers inherit the global proxy
obscura --proxy http://127.0.0.1:8080 scrape https://example.com https://news.ycombinator.com

Puppeteer / Playwright

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'))
    .map(a => ({ title: a.textContent, url: a.href }))
);
console.log(stories);

await browser.disconnect();

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.newContext().then(ctx => ctx.newPage());
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
console.log(await page.title());

await browser.close();

Form submission & login

await page.goto('https://quotes.toscrape.com/login');
await page.evaluate(() => {
  document.querySelector('#username').value = 'admin';
  document.querySelector('#password').value = 'admin';
  document.querySelector('form').submit();
});
// Obscura handles the POST, follows the 302 redirect, maintains cookies

Benchmarks

Page load:

Page Obscura Chrome
Static HTML 51 ms ~500 ms
JS + XHR + fetch 84 ms ~800 ms
Dynamic scripts 78 ms ~700 ms

The full benchmark suite (WPT conformance, obstacle course, real-world corpus, and vs-Chrome speed) lives in a separate repo: https://github.com/h4ckf0r0day/obscura-benchmark

Stealth Mode

Enable with --features stealth.

Anti-fingerprinting

  • Per-session fingerprint randomization (GPU, screen, canvas, audio, battery)
  • Realistic navigator.userAgentData (Chrome 145, high-entropy values)
  • event.isTrusted = true for dispatched events
  • Hidden internal properties (Object.keys(window) safe)
  • Native function masking (Function.prototype.toString()[native code])
  • navigator.webdriver = undefined (matches real Chrome)

Tracker Blocking

  • 3,520 domains blocked
  • Blocks analytics, ads, telemetry, and fingerprinting scripts
  • Prevents trackers from loading entirely
  • Enabled automatically with --stealth

CDP API

Obscura implements the Chrome DevTools Protocol for Puppeteer/Playwright compatibility.

Domain Methods
Target createTarget, closeTarget, attachToTarget, createBrowserContext, disposeBrowserContext
Page navigate, getFrameTree, addScriptToEvaluateOnNewDocument, lifecycleEvents
Runtime evaluate, callFunctionOn, getProperties, addBinding
DOM getDocument, querySelector, querySelectorAll, getOuterHTML, resolveNode
Network enable, setCookies, getCookies, setExtraHTTPHeaders, setUserAgentOverride
Fetch enable, continueRequest, fulfillRequest, failRequest (live interception), takeResponseBodyAsStream
IO read, close (stream a large response body in chunks)
Storage getCookies, setCookies, deleteCookies
Input dispatchMouseEvent, dispatchKeyEvent
LP getMarkdown (DOM-to-Markdown conversion)

To download a large resource without one giant Network.getResponseBody blob, call Fetch.takeResponseBodyAsStream then read it in chunks with IO.read / IO.close. Response bodies over the cache limit (OBSCURA_NETWORK_BODY_BUFFER_BYTES, default 2 MiB) are not retained, so raise that limit when you intend to stream large downloads.

CLI Reference

Tuning V8

Obscura embeds V8 directly. Use --v8-flags to pass raw flags through to V8, same syntax as Chromium's --js-flags and Node's command-line flags. Most common use is raising the heap cap to fix JavaScript heap out of memory on JS-heavy pages:

obscura --v8-flags "--max-old-space-size=4096" fetch <url>

Heavy SPAs (script execution budget)

Obscura caps the page's script-execution phase so one slow or hung page cannot stall a worker. The default budget is 30s; pages that finish sooner return immediately, so the cap only affects pages that keep running. A very heavy React/Vue/Angular SPA on a slow network can need more time to boot before it fires its data requests. Raise the budget with OBSCURA_SCRIPT_DEADLINE_MS (milliseconds), and pair it with a matching navigation timeout in your CDP client:

OBSCURA_SCRIPT_DEADLINE_MS=60000 obscura serve --port 9222

obscura serve

Start a CDP WebSocket server.

Flag Default Description
--port 9222 WebSocket port
--proxy HTTP/SOCKS5 proxy URL
--stealth off Enable anti-detection + tracker blocking
--workers 1 Number of parallel worker processes
--obey-robots off Respect robots.txt

obscura fetch <URL>

Fetch and render a single page.

Flag Default Description
--dump html Output: html, text, links, markdown, assets (NDJSON of every sub-resource URL the page references), or original (raw response body)
--eval JavaScript expression to evaluate
--wait-until load Wait: load, domcontentloaded, networkidle0
--timeout 30 Maximum navigation time in seconds
--selector Wait for CSS selector
--stealth off Anti-detection mode
--output Write dump or eval output to a file
--quiet off Suppress banner
--proxy Inherited global HTTP/SOCKS5 proxy URL

obscura scrape <URL...>

Scrape multiple URLs in parallel with worker processes.

Flag Default Description
--concurrency 10 Parallel workers
--eval JS expression per page
--format json Output: json or text
--quiet off Suppress scrape progress on stderr
--proxy Inherited global HTTP/SOCKS5 proxy URL for all workers

MCP (Model Context Protocol)

Obscura ships an MCP server that exposes browser automation tools to AI agents (Claude Desktop, Cursor, etc.).

Start

stdio (default) — for Claude Desktop and MCP clients that launch a subprocess:

obscura mcp

HTTP — for clients that connect over the network:

obscura mcp --http --port 8080
# endpoint: http://127.0.0.1:8080/mcp

Optional flags (both transports):

Flag Description
--proxy <URL> HTTP/SOCKS5 proxy
--user-agent <UA> Custom User-Agent string
--stealth Enable anti-detection mode

Claude Desktop config

{
  "mcpServers": {
    "obscura": {
      "command": "obscura",
      "args": ["mcp"]
    }
  }
}

Tools

Tool Description
browser_navigate Navigate to a URL (url, optional waitUntil: load / domcontentloaded / networkidle0)
browser_snapshot Return the current page URL, title, and body text
browser_click Click an element by CSS selector
browser_fill Set an input value (triggers input + change events)
browser_type Append text to an input
browser_press_key Dispatch a keyboard event (key, optional selector)
browser_select_option Select an <option> by value or text
browser_evaluate Evaluate a JavaScript expression and return the result
browser_wait_for Wait for a CSS selector to appear (selector, optional timeout in seconds)
browser_network_requests List network requests made by the current page
browser_console_messages Return console messages logged by the page
browser_close Close the page and reset browser state

Integrations

  • Hermes agent plugin: run Hermes agent browser tasks on Obscura. The plugin spawns obscura serve per session (or connects to an already running server) and drives it over CDP, with optional --stealth.

License

Apache 2.0


View on GitHub

Recent activity

commits and pull requests

Releases and announcements

12 total
  1. v0.1.11v0.1.11Jul 26, 202618.6K downloads

    # v0.1.11 CDP sessions are now isolated and safe to run concurrently, DOM traversal and template handling are substantially more browser-compatible, sequential embedded Browser sessions no longer share fetch state, and the MCP and release paths received additional hardening. 81 commits since v0.1.10. ## Highlights • **Concurrent CDP sessions no longer share V8 state.** Each connection owns its runtime and browser context, preventing cross-isolate aborts and stopping cookies, headers, targets, and User-Agent overrides from leaking between clients (#435, #456). • **TreeWalker, NodeIterator, templates, and fragments now behave like real DOM APIs.** Traversal follows document order in both directions, filters handle `FILTER_SKIP` and `FILTER_REJECT` correctly, `<template>.content` exposes parsed markup, and inserting a `DocumentFragment` moves its children rather than attaching the fragment itself (#447, #454, #464, #465, #466, #471, #472, #476). • **Network activity is observable and isolated.** Scripted `fetch()`/XHR requests emit CDP Network events, passive request/response callbacks can be detached, and callbacks stay scoped to the page that registered them (#414, #415

  2. v0.1.10v0.1.10Jul 11, 202627K downloads

    # v0.1.10 React/Vue controlled-input automation now works end to end, deeply nested and heavy pages no longer crash or stall, and CDP grew coverage for file uploads and large downloads. 48 commits since v0.1.9. ## Highlights • **React/Vue controlled inputs fire onChange.** Typing over CDP writes the value through the prototype setter so a framework value tracker sees a real change, and event handlers are exposed on document/element so React uses the input-event path (#353). Form-filling agents can now drive real SPAs. • **Deep and heavy pages are safe.** The DOM serialize / textContent / import walks and the `--dump text` extractor are iterative, so a deeply nested page no longer overflows the stack and aborts the process (#367, #368). Heavy SPAs get a larger script budget so they finish booting (#371), and Vite dev / React Refresh apps mount instead of leaving `#root` empty (#380). • **CDP uploads and streaming.** `DOM.setFileInputFiles` implements Puppeteer `uploadFile()` / Playwright `setInputFiles()` and fires trusted input/change events (#369, #385). `Fetch.takeResponseBodyAsStream` + `IO.read`/`IO.close` stream large downloads in bounded chunks from a capped store,

  3. v0.1.9: Request interception and global stealthv0.1.9Jun 24, 202611.7K downloads

    # v0.1.9 Request interception for the embeddable crate, a global stealth flag, a large stealth-consistency overhaul (creepjs now reports 0% detection), and a batch of CDP, Web API, and build fixes. 59 commits since v0.1.8. ## Highlights • **Request/response interception API** on the embeddable `obscura` crate (#306): observe, block, mock, or rewrite any request a page makes, including JS `fetch()`/XHR. • **`--stealth` is now a global flag**, applied to `fetch`, `serve`, `scrape`, and `mcp`, before or after the subcommand (#325). `scrape` workers inherit it. • **Stealth overhaul:** one consistent Chrome 145 identity across TLS, JS, and WebGL. creepjs now reports 0% stealth detection. `obscura --stealth` renders booking.com's AWS WAF challenge like headless Chrome. ## New features and Web APIs • Interception API: `on_request` / `on_response` callbacks, `enable_interception()` (Continue / Fulfill / Fail), and `add_preload_script` (#306). • Global `--stealth` flag across all subcommands (#325). • `--dump cookies`: export the cookie jar as JSON, including HttpOnly cookies (#313). • `--dump assets` now also lists `fetch()`/XHR request URLs (#301). • CDP `Network.setB

  4. v0.1.8v0.1.8Jun 11, 20265.2K downloads

    ## What's Changed * feat(mcp): add --host flag for MCP HTTP transport bind address by @ousamabenyounes in https://github.com/h4ckf0r0day/obscura/pull/254 * Give relList and sandbox their supported tokens by @SGavrl in https://github.com/h4ckf0r0day/obscura/pull/256 * perf: DOM read fast paths (constant nodeType, borrowed op reads, base64 table) by @SGavrl in https://github.com/h4ckf0r0day/obscura/pull/259 * fix: resolve element .src to an absolute URL (#255) by @SGavrl in https://github.com/h4ckf0r0day/obscura/pull/260 * Fix/issues 257 258 by @SGavrl in https://github.com/h4ckf0r0day/obscura/pull/261 * perf: bound slow ES modules with a DOM-rendered-aware budget by @SGavrl in https://github.com/h4ckf0r0day/obscura/pull/262 * perf: cut RSS with a V8 young-gen cap and optimize-for-size by @SGavrl in https://github.com/h4ckf0r0day/obscura/pull/263 * Add --quiet to serve by @SGavrl in https://github.com/h4ckf0r0day/obscura/pull/265 * Make AbortSignal a real constructor (prototype, throwIfAborted, events) by @SGavrl in https://github.com/h4ckf0r0day/obscura/pull/267 * Stealth profile consistency by @johnnogueira in https://github.com/h4ckf0r0day/obscura/pull/269 * Make naviga

  5. v0.1.7v0.1.7Jun 6, 20264.5K downloads

    This release hardens the engine so one page cannot hang, crash, or wedge a worker, adds an embeddable Rust library, and lands a batch of standards and performance work. ## Reliability - V8 watchdog terminates runaway scripts and microtask storms. - Panic-safe DOM ops, and cyclic DOM mutations are rejected instead of looping forever. - Per-command CDP deadline so one hung session can't stall the others. - Scripted fetch/XHR now times out instead of stranding the request. ## New - `obscura` Rust crate: drive the engine in-process (Browser / Page / Element + cookies). - Big WPT conformance gains (DOM, URL, Ranges, FileAPI, Storage, Shadow DOM). - Faster querySelector, CDP network path, and promise resolution. Still ~12x faster and ~6x lighter than headless Chrome on framework pages. - Stealth and TLS improvements, multi-arch images (amd64 + arm64), MCP agent skill. ## New env knobs - `OBSCURA_CDP_COMMAND_TIMEOUT_MS` (default 60000, `0` disables) - `OBSCURA_FETCH_TIMEOUT_MS` (default 30000) Full changelog: https://github.com/h4ckf0r0day/obscura/compare/v0.1.6...v0.1.7

Code frequency

additions and deletions
+20K-20KWeek of 2026-04-12: +20,012 linesWeek of 2026-04-12: -16 linesWeek of 2026-04-19: +357 linesWeek of 2026-04-19: -105 linesWeek of 2026-04-26: +620 linesWeek of 2026-04-26: -43 linesWeek of 2026-05-03: +1,497 linesWeek of 2026-05-03: -129 linesWeek of 2026-05-10: +3,382 linesWeek of 2026-05-10: -339 linesWeek of 2026-05-17: +307 linesWeek of 2026-05-17: -153 linesWeek of 2026-05-24: +4,422 linesWeek of 2026-05-24: -745 linesWeek of 2026-05-31: +9,184 linesWeek of 2026-05-31: -1,475 linesWeek of 2026-06-07: +3,029 linesWeek of 2026-06-07: -645 linesWeek of 2026-06-14: +399 linesWeek of 2026-06-14: -15 linesWeek of 2026-06-21: +1,934 linesWeek of 2026-06-21: -225 linesWeek of 2026-06-28: +1,362 linesWeek of 2026-06-28: -81 linesWeek of 2026-07-05: +1,258 linesWeek of 2026-07-05: -225 linesWeek of 2026-07-12: +3,147 linesWeek of 2026-07-12: -640 linesWeek of 2026-07-19: +3,191 linesWeek of 2026-07-19: -351 linesWeek of 2026-07-26: +571 linesWeek of 2026-07-26: -132 linesApr 12, 2026Jul 26, 2026
+54.7K lines added, -5.3K removed over the last year.

Commits per week

last 52 weeks
420Week of 2025-08-10: 0 commitsWeek of 2025-08-17: 0 commitsWeek of 2025-08-24: 0 commitsWeek of 2025-08-31: 0 commitsWeek of 2025-09-07: 0 commitsWeek of 2025-09-14: 0 commitsWeek of 2025-09-21: 0 commitsWeek of 2025-09-28: 0 commitsWeek of 2025-10-05: 0 commitsWeek of 2025-10-12: 0 commitsWeek of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 0 commitsWeek of 2026-04-05: 0 commitsWeek of 2026-04-12: 5 commitsWeek of 2026-04-19: 7 commitsWeek of 2026-04-26: 3 commitsWeek of 2026-05-03: 29 commitsWeek of 2026-05-10: 34 commitsWeek of 2026-05-17: 2 commitsWeek of 2026-05-24: 21 commitsWeek of 2026-05-31: 36 commitsWeek of 2026-06-07: 42 commitsWeek of 2026-06-14: 11 commitsWeek of 2026-06-21: 28 commitsWeek of 2026-06-28: 17 commitsWeek of 2026-07-05: 18 commitsWeek of 2026-07-12: 25 commitsWeek of 2026-07-19: 28 commitsWeek of 2026-07-26: 33 commitsWeek of 2026-08-02: 7 commitsAug 10, 2025Aug 2, 2026
346 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 0 commitsSun 1:00 — 2 commitsSun 2:00 — 1 commitsSun 3:00 — 0 commitsSun 4:00 — 0 commitsSun 5:00 — 0 commitsSun 6:00 — 0 commitsSun 7:00 — 0 commitsSun 8:00 — 0 commitsSun 9:00 — 3 commitsSun 10:00 — 3 commitsSun 11:00 — 8 commitsSun 12:00 — 9 commitsSun 13:00 — 0 commitsSun 14:00 — 0 commitsSun 15:00 — 1 commitsSun 16:00 — 0 commitsSun 17:00 — 11 commitsSun 18:00 — 3 commitsSun 19:00 — 5 commitsSun 20:00 — 6 commitsSun 21:00 — 6 commitsSun 22:00 — 2 commitsSun 23:00 — 3 commitsMon 0:00 — 0 commitsMon 1:00 — 0 commitsMon 2:00 — 0 commitsMon 3:00 — 0 commitsMon 4:00 — 1 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 4 commitsMon 8:00 — 0 commitsMon 9:00 — 1 commitsMon 10:00 — 4 commitsMon 11:00 — 1 commitsMon 12:00 — 4 commitsMon 13:00 — 3 commitsMon 14:00 — 3 commitsMon 15:00 — 2 commitsMon 16:00 — 2 commitsMon 17:00 — 4 commitsMon 18:00 — 3 commitsMon 19:00 — 1 commitsMon 20:00 — 2 commitsMon 21:00 — 5 commitsMon 22:00 — 3 commitsMon 23:00 — 1 commitsTue 0:00 — 4 commitsTue 1:00 — 0 commitsTue 2:00 — 0 commitsTue 3:00 — 0 commitsTue 4:00 — 1 commitsTue 5:00 — 0 commitsTue 6:00 — 2 commitsTue 7:00 — 4 commitsTue 8:00 — 2 commitsTue 9:00 — 1 commitsTue 10:00 — 4 commitsTue 11:00 — 1 commitsTue 12:00 — 2 commitsTue 13:00 — 2 commitsTue 14:00 — 1 commitsTue 15:00 — 2 commitsTue 16:00 — 3 commitsTue 17:00 — 4 commitsTue 18:00 — 1 commitsTue 19:00 — 1 commitsTue 20:00 — 2 commitsTue 21:00 — 2 commitsTue 22:00 — 0 commitsTue 23:00 — 1 commitsWed 0:00 — 0 commitsWed 1:00 — 1 commitsWed 2:00 — 0 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 2 commitsWed 7:00 — 0 commitsWed 8:00 — 1 commitsWed 9:00 — 4 commitsWed 10:00 — 4 commitsWed 11:00 — 0 commitsWed 12:00 — 2 commitsWed 13:00 — 0 commitsWed 14:00 — 1 commitsWed 15:00 — 5 commitsWed 16:00 — 2 commitsWed 17:00 — 0 commitsWed 18:00 — 3 commitsWed 19:00 — 9 commitsWed 20:00 — 8 commitsWed 21:00 — 8 commitsWed 22:00 — 7 commitsWed 23:00 — 9 commitsThu 0:00 — 1 commitsThu 1:00 — 0 commitsThu 2:00 — 0 commitsThu 3:00 — 0 commitsThu 4:00 — 1 commitsThu 5:00 — 0 commitsThu 6:00 — 0 commitsThu 7:00 — 1 commitsThu 8:00 — 4 commitsThu 9:00 — 2 commitsThu 10:00 — 7 commitsThu 11:00 — 1 commitsThu 12:00 — 6 commitsThu 13:00 — 0 commitsThu 14:00 — 0 commitsThu 15:00 — 1 commitsThu 16:00 — 1 commitsThu 17:00 — 2 commitsThu 18:00 — 2 commitsThu 19:00 — 4 commitsThu 20:00 — 1 commitsThu 21:00 — 8 commitsThu 22:00 — 5 commitsThu 23:00 — 1 commitsFri 0:00 — 0 commitsFri 1:00 — 0 commitsFri 2:00 — 1 commitsFri 3:00 — 0 commitsFri 4:00 — 1 commitsFri 5:00 — 0 commitsFri 6:00 — 0 commitsFri 7:00 — 2 commitsFri 8:00 — 2 commitsFri 9:00 — 1 commitsFri 10:00 — 1 commitsFri 11:00 — 2 commitsFri 12:00 — 4 commitsFri 13:00 — 0 commitsFri 14:00 — 0 commitsFri 15:00 — 1 commitsFri 16:00 — 2 commitsFri 17:00 — 5 commitsFri 18:00 — 0 commitsFri 19:00 — 2 commitsFri 20:00 — 8 commitsFri 21:00 — 4 commitsFri 22:00 — 2 commitsFri 23:00 — 2 commitsSat 0:00 — 1 commitsSat 1:00 — 1 commitsSat 2:00 — 2 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 2 commitsSat 8:00 — 2 commitsSat 9:00 — 1 commitsSat 10:00 — 1 commitsSat 11:00 — 1 commitsSat 12:00 — 0 commitsSat 13:00 — 0 commitsSat 14:00 — 2 commitsSat 15:00 — 10 commitsSat 16:00 — 7 commitsSat 17:00 — 5 commitsSat 18:00 — 7 commitsSat 19:00 — 1 commitsSat 20:00 — 1 commitsSat 21:00 — 0 commitsSat 22:00 — 1 commitsSat 23:00 — 0 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits30 (7%)
Community commits402 (93%)

432 commits in total over the last year.

DateListRankStars gained
Jun 30, 2026daily#23+15
May 1, 2026daily#20+67
Apr 30, 2026daily#24+41
Apr 27, 2026daily#12+113
Apr 26, 2026daily#7+357
Apr 25, 2026daily#3+584
Apr 24, 2026daily#9+151
  • ultraworkers/claw-code

    An agent-managed museum exhibit, built in Rust with Gajae-Code / LazyCodex — developed and maintained with no human intervention.

    195K stars · Rust

  • ultraworkers/claw-code

    An agent-managed museum exhibit, built in Rust with Gajae-Code / LazyCodex — developed and maintained with no human intervention.

    194.9K stars · Rust

  • ultraworkers/claw-code

    An agent-managed museum exhibit, built in Rust with Gajae-Code / LazyCodex — developed and maintained with no human intervention.

    194.9K stars · Rust

  • vercel/next.js

    The React Framework

    141.7K stars · JavaScript

  • farion1231/cc-switch

    A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io

    125.4K stars · Rust

  • denoland/deno

    A modern runtime for JavaScript and TypeScript.

    108.2K stars · Rust