Scraping modern websites has become a massive headache. You basically have two choices: pay for an expensive API like Firecrawl/Browserbase, or run a fleet of headless Chrome insta…

A fast, stealth, native-Rust web scraper — a lighter alternative to Firecrawl / Browserbase. Point it at a URL and get clean Markdown + metadata back, using a browser-faithful TLS/JA4 fingerprint to reach pages that block ordinary clients. No Node, no headless-Chrome fleet, no per-request browser boot. (This will automatically detect your OS/architecture, download the latest binary, and add it to your ~/.zshrc, ~/.bashrc, or ~/.config/fish/config.fish) For a standard HTML page that's a single fingerprinted fetch + parse — typically ~300 ms, no browser — and the Markdown pipeline mirrors Firecrawl's (deterministic main-content extraction + a Turndown/GFM-equivalent converter), implemented natively in Rust. Client-rendered SPAs (whose content only appears after JavaScript runs) are handled too, via render-then-Markdown — no headless browser fleet. Build prerequisites (for wreq's BoringSSL + bindgen; and V8, only for the optional json mode): cmake, a C/C++ compiler, clang/libclang, perl, pkg-config. Beyond Markdown, Draco can extract the structured data an SPA loads from its own API — a power feature for data-driven sites. It escalates through the cheapest tier that yields data: Flags: --format <markdown|html|raw-html|links|json|endpoints|both> (repeatable; default markdown; both = markdown+json), --json, --extract <JSONPATH>, --no-main-content, --wait-for <ms>, --tier-max <0|1|2>, --proxy, --delay <ms>, --timeout <ms>, --capture-window-ms <ms>, --ignore-robots, --allow-unsafe-replay, --runtime-log, --pretty. (--no-jail / --strict-sandbox are still accepted for compatibility and are inert — see Security model.) Debugging a page that hydrates to nothing? --runtime-log (also on discover, and as runtimeLog on the daemon/MCP) surfaces the isolate's page-side diagnostics — swallowed exceptions, console.error lines, every brokered fetch ([raze.fetch] METHOD URL → STATUS (bytes, live|stub)), failed chunk/module loads, and why/when the capture window closed — all stamped [+ms] from capture start, so the trace reads as a timeline: browser-devtools visibility, no browser. Some pages render their content only after JavaScript runs — the fetched HTML is a thin shell (an empty <div id="root">). Draco handles these automatically: when the initial parse finds almost no content and Tier 2 is permitted (the default), it hydrates the shell in the same in-process V8 isolate, serializes the live DOM, splices the shell's real <head> (title / Open Graph / canonical) onto the hydrated <body>, and re-runs the exact same content engine over it. You get clean Markdown from a client-rendered page with no headless browser — the trace shows a runtime.render step and source_tier: runtime_interception.