Model reference · open weights
indra-ocr is an open-weight language model from datalab-to. indra-ocr (FP32) weighs 2 MB; the smallest configuration that runs it is RTX 3060 12 GB.
For self-hosting, compare this build's requirements below with the GPU you plan to rent.
Summary of the datalab-to/indra-ocr model card, 2026-10-18
What it is
| Released by | datalab-to |
|---|---|
| Released | 2026-10-10 |
| Parameters | 1M |
| VRAM | 2 MB for the weights |
What it runs on
How much memory each request adds isn't estimated yet for this architecture. The weights need at least the cards below, plus room for the context.
| Card | Weights alone |
|---|---|
| RTX 3060 12 GB | fits |
| RTX 4060 Ti 16 GB | fits |
| RTX 3090 24 GB | fits |
| RTX 4090 24 GB | fits |
| RTX 5090 32 GB | fits |
| L40S 48 GB | fits |
| A100 80 GB | fits |
| H100 80 GB | fits |
| RTX PRO 6000 Blackwell 96 GB | fits |
| DGX Spark (GB10) 128 GB unified | fits |
| H200 141 GB | fits |
| B200 180 GB | fits |
From the model card
Indra OCR is a 1M-parameter OCR model that reads up to 49 pages per second on CPU. It turns PDFs and images into markdown, plain text, or JSON with boxes, and it has these features:
The main recognizer, rec.onnx, has about 1M parameters. See benchmarks for the full results and limitations for what it does not do yet.
Indra OCR is named for Indra.
Indra OCR is built for speed on CPUs. When you need the highest accuracy, on handwriting, math, complex tables and degraded scans, our managed platform runs Chandra, our state of the art OCR model, with zero data retention by default, SOC 2 Type 2, and custom BAAs.
If you have high volume workloads, we offer a batch processing service that can handle 1B+ pages a day.
Get started with $5 in free credits - sign up - or try Chandra in our public playground.
pip install indra-ocr
indra-ocr paper.pdf # markdown to stdout
indra-ocr *.pdf --out results/ # one .md per input, all cores
indra-ocr scan.png --format json # lines, boxes, layout blocks, confidences
indra-ocr-viewer # local web viewer on http://localhost:8765
The first run downloads the models (about 18 MB) from Hugging Face.
Real Indra OCR outputs on OmniParseBench pages. Colored boxes are layout blocks with their label, faint blue boxes are lines, drawn from the JSON output with no edits.
See more examples, with the markdown output for each →
The code is Apache 2.0. The model weights use a modified OpenRAIL-M license (LICENSE).
This code is Apache 2.0, and our model weights use a modified OpenRAIL-M license (free for research, personal use, and startups under $20M funding/revenue, cannot be used competitively with our API). To remove the OpenRAIL license requirements, or for broader commercial licensing, visit our pricing page here.
pip install indra-ocr
Python 3.10 or newer. It installs ONNX Runtime, OpenCV and pypdfium2, and no PyTorch. The models download from Hugging Face on the first run and are cached. To use a local copy, set INDRA_OCR_MODEL_DIR or pass --model-dir.
indra-ocr paper.pdf # markdown to stdout
indra-ocr *.pdf --out results/ # one .md per input
indra-ocr scan.png --format json # lines, boxes, layout blocks, confidences, timings
indra-ocr paper.pdf --format text # plain text, one line per detected line
indra-ocr paper.pdf --mode ocr --timings # ignore the text layer, OCR every page; timings on stderr
indra-ocr paper.pdf --keep-furniture # keep page headers and footers in the markdown
indra-ocr *.pdf --out results/ --cores 8 # limit the cores (default: all usable cores)
indra-ocr paper.pdf --math # write math as LaTeX (off by default; slower on math pages)
CLI Options:
--out DIR: write one file per input (.md, .txt or .jsonl)--format [md|text|json]: output format (default: md)--mode [auto|ocr|text]: auto reads the text layer where it passes the checks and OCRs elsewhere (default). ocr never reads the text layer. text uses the text layer even when the checks fail--model-order: order text-layer lines with the order model, not the PDF content order--no-image-ocr: on text-layer pages, do not OCR text inside images--cores N: cores to use, one worker process each (default: all usable cores)--dpi: render resolution for PDFs (default: 200)--max-pages N: read at most N pages per file--password: password for encrypted PDFs--keep-furniture: keep page headers and footers in the markdown--math: write math as LaTeX ($...$); off by default, see Math--timings: print per-page source and time to stderr--model-dir: folder with the models (default: download)The CLI continues past files it cannot read, and exits with 1 if any failed.
import indra_ocr
conv = indra_ocr.load(threads=4) # mode="auto" | "ocr" | "text"
for i, page in conv.convert("paper.pdf"):
print(page.source, page.timings["total_ms"])
print(page.markdown) # headings, lists, tables as HTML
page.blocks # [{"label", "bbox", "text"}] in reading order
page.lines # [Line(box, text, conf)] in reading order
For many pages or files, convert_many runs one single-threaded worker process per core, one page per task, and returns results in input order:
import indra_ocr
if __name__ == "__main__": # worker processes re-impoQuoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.