A

Mengenal Obscura: Headless Browser Rust untuk Agent dan Scraping

Review Obscura, headless browser Rust untuk AI agent dan scraping. CDP drop-in Puppeteer/Playwright, ~30 MB RAM, native render, MCP, stealth.

6 menit bacaAhmad Apandi

Masalahnya

Headless Chrome di server scraping atau AI agent itu mahal diam-diam. Satu proses Chromium mudah makan 200 MB RAM. Sepuluh sesi paralel, VPS kecil sudah sesak. Startup ~2 detik per browser. Bundle 300 MB. Bot detector melihat navigator.webdriver = true dan memblokir.

Playwright dan Puppeteer tetap nyaman. Yang berat adalah engine di belakangnya.

Obscura mencoba potong rantai itu: browser headless ditulis di Rust, JS lewat V8, bicara Chrome DevTools Protocol. Skrip Puppeteer/Playwright yang sudah ada tinggal diarahkan ke WebSocket-nya.

Apa itu Obscura

Obscura adalah engine headless browser open-source (Apache-2.0) untuk web scraping dan otomasi AI agent. Bukan wrapper Chromium. Ia punya layout engine sendiri, embed V8, dan expose CDP.

Angka dari README resmi (Agustus 2026):

Metrik Obscura Headless Chrome
RAM ~30 MB 200+ MB
Ukuran binary ~70 MB 300+ MB
Page load (klaim) ~85 ms ~500 ms
Startup Instant ~2 s
Anti-detect Built-in (--stealth) Tidak ada
Puppeteer / Playwright Ya (CDP) Ya
Lisensi Apache-2.0 BSD

Repo: 21.6k stars, 1.5k forks, bahasa Rust. Image Docker distroless ~57 MB compressed. Binary rilis tidak butuh Chrome, Node.js, atau runtime lain.

Angka kecepatan di tabel itu klaim upstream, bukan benchmark independen. Suite lengkap ada di obscura-benchmark. Pakai sebagai urutan besar, bukan SLA.

Puppeteer / Playwright / MCP / CLI

                 │  CDP ws://127.0.0.1:9222

         ┌───────────────┐
         │  Obscura      │
         │  V8 + layout  │
         │  optional     │
         │  --stealth    │
         └───────┬───────┘


            halaman web

Fitur yang membedakan

CDP drop-in

obscura serve --port 9222 lalu puppeteer.connect({ browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser' }). Playwright: chromium.connectOverCDP. Tidak rewrite selector. Form POST, cookie, redirect 302 ditangani engine.

Domain CDP yang diimplementasi: Target, Page (screenshot, screencast, PDF), Runtime, DOM, Network, Fetch (intersepsi live), IO, Storage, Input, plus LP.getMarkdown untuk DOM ke Markdown.

Bukan 1:1 Chromium. Long-tail CSS, beberapa Web API, media playback, dan raster font bisa beda. Cek dulu halaman yang Anda scrape.

Native rendering, tanpa Chromium

Rilis resmi dan image Docker sudah include layout engine: block, inline, flex, grid, table, float, transform, SVG, canvas, background, border, animasi. Screenshot viewport/full-page, PDF raster, screencast CDP.

Ini bagian yang paling berani (dan paling berisiko). Independensi dari Chromium = hemat RAM, tapi pixel-perfect vs Chrome tidak dijamin. Untuk ekstrak teks/HTML biasanya cukup. Untuk visual regression ketat, Chrome masih lebih aman.

CLI: fetch, scrape, eval

Tanpa Node:

obscura fetch https://example.com --eval "document.title"
obscura fetch https://news.ycombinator.com --dump html
obscura fetch https://example.com --dump links
obscura fetch https://example.com -s page.png

--dump menerima html, text, links, markdown, assets (NDJSON sub-resource), atau original (body mentah, binary-safe). Parallel:

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

--wait-until load|domcontentloaded|networkidle0, --timeout, --selector, --proxy http|socks5.

MCP untuk coding agent

obscura mcp (stdio) atau obscura mcp --http --port 8080. Tool: navigate, snapshot, screenshot, PDF, click, fill, type, press_key, select_option, evaluate, wait_for, network_requests, console_messages, close.

Ada plugin Hermes yang spawn obscura serve per sesi dan drive lewat CDP. Cocok kalau Anda sudah pakai Hermes Agent.

Stealth mode

Build --features render,stealth, nyalakan --stealth saat runtime. Fingerprint diacak per sesi (GPU, screen, canvas, audio, battery). navigator.webdriver undefined. Function.prototype.toString() mengembalikan [native code]. Tracker block 3.520 domain.

Stealth bukan jaminan lolos Cloudflare/Turnstile. Ini mengurangi sinyal otomasi kasar. Situs yang menuntut browser sungguhan tetap bisa menolak. Hormati robots.txt (--obey-robots) dan ToS target.

Mulai cepat

Binary dari Releases:

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

Linux x86_64: obscura-x86_64-linux.tar.gz (glibc 2.35+, target Ubuntu 22.04). Ada juga AUR obscura-browser dan Nix nixpkgs.obscura. Archive rilis berisi obscura + obscura-worker; simpan di folder yang sama untuk scrape paralel.

Docker:

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

Bind ke localhost. Jangan expose 9222 ke internet tanpa auth di depan.

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://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();

SPA berat: default script budget 30 detik. Naikkan OBSCURA_SCRIPT_DEADLINE_MS=60000 kalau React/Vue belum sempat fetch data. Heap V8: --v8-flags "--max-old-space-size=4096".

Di mana posisinya di toolbox?

Kebutuhan Pilihan
Banyak sesi paralel, RAM ketat Obscura
Skrip Puppeteer/Playwright sudah ada Obscura lewat CDP
Agent butuh browser tool (MCP) Obscura MCP
Pixel-perfect / WebGL / video Headless Chrome / Playwright Chromium
Browser text-only, sangat tipis Lightpanda
Situs yang cuma lolos di Chrome sungguhan Tetap Chromium

Kapan memakai / kapan menunda

Situasi Saran
Scrape HTML/JSON, ratusan URL, VPS kecil Pakai Obscura
Agent (Hermes, Claude Desktop, Cursor) butuh browser MCP + serve
Visual QA vs Chrome, canvas/WebGL rumit Tunda. Chromium lebih prediktabel
Halaman yang gagal layout di engine sendiri Fallback Chrome per URL
Produksi dengan SLA ketat Uji corpus Anda dulu. Engine masih bergerak cepat

Catatan praktis

  • Benchmark page load di README adalah angka vendor. Ukur sendiri halaman target.
  • Body network di-buffer default 2 MiB (OBSCURA_NETWORK_BODY_BUFFER_BYTES). Download besar: Fetch.takeResponseBodyAsStream + IO.read.
  • Build dari source: Rust 1.75+, compile V8 ~5 menit pertama. Stealth butuh CMake, Clang, libclang (BoringSSL).
  • Obscura Cloud (hosted + proxy residensial) masih waitlist. Engine OSS tetap Apache-2.0 tanpa feature gating, menurut README.
  • Port 9222 = remote debugging. Firewall ketat, atau reverse proxy + auth.

Penutup

Obscura menarik kalau bottleneck Anda adalah Chromium, bukan API otomasi. CDP membuat biaya pindah kecil. RAM 30 MB vs 200 MB terasa di agent fleet. Rendering native adalah taruhan: bagus untuk scrape dan screenshot kasar, belum pengganti Chrome untuk setiap situs.

Coba obscura fetch di satu URL kerja Anda. Kalau HTML dan --eval sudah benar, baru serve + Puppeteer. Kalau layout pecah, jangan maksa. Chrome masih ada.

Sumber: github.com/h4ckf0r0day/obscura · docs.obscura.sh · obscura.sh

Artikel terkait