Skip to content
$ uv run indx encode --signatures file://$PWD/tests/fixtures/invoice-anthropic.pdf
encode resultcompleted
page:1page · completed
invoice_number
MRFL4…0006
total
220.00 USD
page:1/chunk:1chunk · completed

Invoice · Amount due $220.00 USD

executioninvoice-parser · cpu · fallback 0
usage1 page · 68,446 bytes · $0.00

indx

Decide how to read a document before paying to read it. indx inspects a document cheaply and returns a plan: which capability reads each page, why, and what it should cost. Inspect the plan, store it, or refuse it. Execution follows only that plan and its declared fallbacks.

The problem

Nobody should hand-wire a pipeline per document type

Section titled “Nobody should hand-wire a pipeline per document type”

To use AI on internal documents, someone has had to decide up front which model and which parser reads each data type. Bespoke pipelines pile up, one per format. Months pass between a pilot and production.

indx exists to remove that decision. One routing layer sends each page to the cheapest path that works, and returns AI-ready output — text, structured metadata, chunks, and embeddings — for an index you control.

The ladder

Every page takes the cheapest rung that works

Section titled “Every page takes the cheapest rung that works”

Routing escalates over four capability kinds. Most pages stop at the first rung. Every rung below the selected one stays in the plan as a fallback, so no page is silently dropped.

native text layer

Read what is already text

The text layer already exists. Extraction runs on CPU at near-zero cost.

ocr

Recognize scanned pages

PP-OCR on CPU. An optional install: –extra ocr.

vlm

Escalate the hard pages

A vision model reads what OCR cannot. GPU or hosted. An optional install: –extra vlm.

manual review

End at a person, never at a loss

The terminal rung. A human can read anything, so nothing disappears.

What you get

01

Use the output directly

Blocks are addressable: document, page, region, chunk. Each carries text, status, hierarchy, and provenance.

02

Keep structure when it exists

Specialist capabilities attach extracted fields to the block that stated them. Nothing is flattened into plain text.

03

Prepare retrieval and agents

Chunk blocks can carry versioned embeddings. The matching query encoder is exposed through the same core.

04

Explain every result

The plan, every execution attempt, actual usage, and explicit unreadable states stay in the response.

Who it’s for

Retrieval and agent pipelines

Chunk text and versioned embeddings for an index you control. The matching query encoder comes with them, or the vectors are useless later.

Document-processing applications

Applications that must answer for their processing. The plan and the trace answer what it cost, where it ran, and what happened to page 47.

Corpus operators

The cheap path whenever it is sufficient. Explicit escalation when it is not. The difference is measurable, not asserted.

None of them wants a router. They want outcomes — see goals and non-goals.

Measured

The repository owns a benchmark over seventeen real multi-page documents, 1,361 pages. These three figures depend on no label. Both sides of the cost comparison are estimates from the same economics table, and accuracy is scored over a labelled subset whose labels are still under review, so no accuracy figure is quoted here.

0.05 sseconds per page
$0.00003per page routed, against $0.02 through the vision model
98.8%of pages processed on CPU only

Read the benchmark details before treating these as production claims.

Goals

Backbone first. Everything else waits for measured baselines.

Section titled “Backbone first. Everything else waits for measured baselines.”

Working now

  • Explainable plans, reproducible per input
  • Execution with declared fallbacks and a full trace
  • HTTP, CLI, and Python interfaces over one contract
  • A repository-owned benchmark

Planned

  • Corpus classification on CPU
  • Difficult enterprise data: handwriting, drawings, spreadsheets
  • Agent-readable export to an index you control

Non-goals

  • Owning your vector index
  • Heavy processing during planning
  • Silent re-planning during execution

The full lists live in goals and non-goals. The feature-by-feature catalog, with examples, is features.

Extend

A capability is an install, not a code change

Section titled “A capability is an install, not a code change”

Capabilities are separate distributions discovered through the indx.capabilities entry point. Installing one makes it routable. The default install carries no model weights and no credentials.

indx-capability-native-extractionindx-capability-manual-reviewindx-capability-invoiceindx-capability-generic-ocrindx-capability-generic-vlmindx-capability-embedding-hashed

Extend indx walks through building your own.

Active development. Routing, execution, fallbacks, and the HTTP, CLI, and Python interfaces are implemented. Output quality is not measured yet. OCR, VLM, and model-backed embedding engines are optional installs. Common questions are answered in the FAQ.