Draco — the low-poly dragon, wings spread, descending

The web, at memory speed.

The world's data brought to heel. 

Draco forces the world’s data to the edge in milliseconds. It escalates tier by tier, from global workers to a genuine browser, until the data is yours. No exceptions.

stat
~0 ms
URL → clean Markdown. One fingerprinted fetch, no browser boot.
stat
~0 ms
Warm-daemon SPA hydration — fetch to Markdown, end to end.
stat
0
Headless browsers in the stack. None hiding in a fleet, either.
stat
Browser-faithful TLS fingerprint on every request it makes.

How Draco works

Built different.
Because the web demands it.

The browser fleet

  • Boots Chrome to read HTML
  • Gigabytes of RAM per worker
  • Waits, retries, flaky selectors
  • Pays the render tax on every page
The Draco engine — dragon head emblem

DRACO ENGINE

native RustJA4-faithful TLStiered escalation

The Draco engine

  • One fingerprinted fetch, native-Rust parse
  • Megabytes, not gigabytes
  • Deterministic extraction, honest traces
  • Escalates only when a page earns it

Tangled web in. Clean data out. Draco reads pages the way frameworks serve them — not the way browsers paint them.

p50 latency 187ms
workspace 7 crates
telemetry 0 bytes
license MIT / Apache-2.0

The extraction ladder

Escalation, not brute force.

Draco climbs the cheapest tier that yields data. Most pages never wake the isolate.

TIER 0
TIER 1
TIER 2

TIER 0

Static state

The data was in the HTML all along. __NEXT_DATA__, JSON-LD, embedded state — parsed straight out of the first response. Cost: one fetch.

source_tier: static_embedded

TIER 1

Build-id replay

Speak the framework's own dialect. Draco lifts the Next.js build id and fetches /_next/data/…json directly — the page's data, without the page.

source_tier: buildid_replay

TIER 2

The discovery oracle

A jailed, jitless V8 isolate lets the page's own JavaScript hydrate, watches every fetch it fires, ranks the candidates, and replays the winner over the stealth client. An oracle — not a renderer.

source_tier: runtime_interception

Render → Markdown

Thin SPA shells hydrate in the same isolate, then re-enter the exact same Markdown engine. Client-rendered pages, clean Markdown, still no browser.

Honest by design

A real challenge wall returns needs_browser — never a spoofed result. Screenshots and clicks? An explicit 422. Draco doesn't fake what it can't see.

Tier 2 runs air-gapped · userns/netns isolation · seccomp denylist · Landlock FS lockdown · jitless V8, zero host bindings

Built for speed

The web, devoured in milliseconds.

Draco turns any URL into clean, structured data in the blink of an eye. No headless Chrome. No render tax. Just raw speed.

Already on Firecrawl? Point your client at Draco and change nothing else.

~287 ms response0 browsers bootedJA4 fingerprintevery step traced

The edge network

Faster than local.

Draco runs where the web lives. Your request lands on the nearest edge worker, the fetch happens next door to the target, and only clean data crosses the ocean back to you.

Draco · edge worker 53ms
you → edge · 9ms
edge → page · 41ms
parse → markdown · 3ms
local headless browser still booting…
boot chrome · 1400ms+
iadsfofraamssinnrtsydgrubomjnbcdglhryyzhkg

And when a wall goes up — DataDome, PerimeterX, the hard stuff — the ladder keeps climbing. Tier ∞ is a genuine browser. No target is off limits.

Capabilities

One engine. Every acquisition pattern.

Scrape

URL → Markdown + metadata + an honest trace. The core primitive.

draco scrape <url>

Search

The web as a query surface — search and scrape fused into one call.

POST /v1/search

Map

A site's URL surface in one call — sitemaps merged with on-page links.

POST /v1/map

Crawl

Bounded BFS with the full ladder on every page. SPAs hydrate mid-crawl.

POST /v1/crawl

Batch

A list of URLs as one async job — parallel, under one concurrency budget.

POST /v1/batch/scrape

Discover

The ranked catalog of APIs behind a SPA. See the data source, replay the winner.

POST /v1/discover

Interact

LLM-driven sessions with a direct JS API — sticky state, no CDP fumbling.

POST /v1/interact

Webhooks

started · page · completed · failed — delivered with retries, never robots-gated.

"webhook": { "url": … }

MCP

draco_scrape and draco_discover as first-class agent tools. stdio or HTTP.

draco mcp

Firecrawl drop-in

Same request shape, same envelope. Change a base URL, keep your client.

POST /v1/scrape

Open core

No browser farm. No black box.
Just physics.

Draco is a single Rust workspace — seven crates, MIT/Apache-2.0, no telemetry, no login wall between you and a benchmark. Clone it, build it, point it at the web.

For public data, your own properties, and APIs you’re permitted to use. Polite by default: robots.txt respected, per-host rate limits, bounded retries.

draco/— one workspace, seven crates

  • ├─ draco-types the wire contract
  • ├─ draco-net stealth TLS/JA4 client
  • ├─ draco-static Markdown + metadata engine
  • ├─ draco-jail sandbox supervisor
  • ├─ draco-runtime V8 discovery isolate
  • ├─ draco-core the escalation brain
  • └─ draco-cli the draco binary

license: MIT OR Apache-2.0 · telemetry: none

edge regions 14
browsers booted 0
fingerprint JA4-faithful
escalation tiered · honest

Stop feeding the browser fleet.

Point Draco at a URL. Get clean Markdown back before a headless browser would have finished booting.

curl -fsSL https://get.draco.sh | bash

Linux & macOS first-class · MIT OR Apache-2.0