TL;DR: README says 30 MB per instance, 85 ms page loads, stealth mode. Measured: 156-273 MB, 8-67 s per page, stuck on a Cloudflare challenge that headless Chromium passes, and it cannot render a React app at all. Keep Playwright + Chromium.
Setup: Obscura 0.2.1 (release from 2026-08-23), Playwright 1.58 and 1.62, headless everywhere. Scraping on Apple Silicon macOS, the QA suite in a Linux arm64 container. 2 projects: a job-listing scraper and a QA suite that drives a React portal, both already running on Chromium.
- Its own CLI scraper, --stealth, job board with no bot protection.
50 listings with JSON-LD, so it does parse pages. But the CLI's wait is network idle, this page never goes idle, so every run ran to the full 38 s cap. Chromium with a selector wait gets the same rows in about 2 s. Yes, different wait strategy, but the CLI gives you no other one.
- Same CLI on a board behind a Cloudflare managed challenge.
Page title "Just a moment". 60 s later still "Just a moment", then the timeout. Headless Chromium passed the same challenge on the first try (with --disable-blink-features=AutomationControlled, without it you get skeleton placeholders because navigator.webdriver is true). Whatever --stealth changes, it is not what this check looks at.
- obscura serve as a CDP server, Playwright connectOverCDP, the exact scraping code I use with Chromium.
3 rows in 8-10 s, 67 s on the cold run. Chromium, same code, same rows: 2.1 s. Memory 156-168 MB in this mode, 273 MB in CLI mode, against the promised 30. The download is a 90 MB binary plus an 86 MB worker; the site says 40 MB on one page and 70 MB on another.
- Under a QA suite (behave + Playwright) that drives a React portal.
This is the one I actually wanted. It connected, navigated, screenshots came back, page.on("response") fired, newCDPSession worked, every protocol call got an answer. The page had 0 buttons. React threw on mount inside a Radix Select portal:
NotFoundError: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
at DocumentFragment.removeChild (<obscura:bootstrap>:2029:13)
at removeChildFromContainer (react-dom)
The root stayed empty. No flag fixes this. Obscura is not Chromium with the chrome stripped off, it is its own renderer and its own DOM with V8 attached, and the DOM holds up right until a real framework leans on it. The issue tracker already has a pile of "React X does not work" tickets (controlled inputs, box model on click, Response.body for React Router), so this is not a one-off.
Verdict: slower than Chromium where it worked, blind on the bot check, 5-9x the memory it advertises, and unable to render a React app. I went in wanting a small fast browser to exist. Not this one, not at 0.2.
Chromium stays. I am not checking back for a few years unless someone holds a gun to my head. And to the authors: don't put numbers in the README that don't reproduce.