Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Quickstart

Try it without installing

The playground runs entirely in your browser — extraction happens locally via WebAssembly and your document never leaves your machine: try docray → (also embedded in every docray-server at /playground)

Install

# Homebrew (macOS/Linux)
brew install f2-ai-inc/tap/docray

# or a container (server + playground included)
docker run -d --rm -p 41619:41619 ghcr.io/f2-ai-inc/docray:latest

# or grab a prebuilt archive from the releases page — pdfium is bundled

Building from source instead? Clone the repo, run ./scripts/fetch-pdfium.sh once, then cargo build --release -p docray-cli -p docray-server.

Extract your first PDF

docray extract your.pdf --granularity element | jq .

PPTX uses element granularity as well:

docray extract deck.pptx --granularity element | jq .

Run the server + playground

cargo build --release -p docray-cli -p docray-server
./target/release/docray-server
docray-server listening on http://localhost:41619
playground UI:        http://localhost:41619/playground

Open the playground and drop a PDF, PPTX, or DOCX on it. PDFs appear as rendered pages; PPTX slides appear as offline visual renders inside a locked-down browser sandbox, with an extraction-derived structure schematic as the fallback. Word documents appear as a scrollable isolated render beside honest flow lenses: positioned containers only in BOXES and a labeled reading-order schematic in X-RAY. All formats sit beside extracted content and live JSON — see the playground.

Extract over HTTP:

curl -sf -F file=@your.pdf 'http://localhost:41619/v1/extract?granularity=element'
curl -sf -F file=@deck.pptx 'http://localhost:41619/v1/extract?granularity=element'

Docker

docker build -t docray .
docker run -d --rm -p 41619:41619 docray
curl -sf http://localhost:41619/healthz

The image bundles the pinned PDFium build; no host dependencies.

Why port 41619?

It’s deliberately obscure so it never collides with your other dev servers. Override with DOCRAY_PORT.