olmocr vs xberg
Open toolkit that linearizes messy PDFs — scans, tables, equations, handwriting — into clean ordered Markdown with a self-hosted vision-language model. Built for LLM training data and RAG ingestion. — versus — Rust-core extraction orchestrator with 15 language bindings: 96 formats — PDF, Office, images, audio, code, web — to clean text, tables and RAG-ready chunks. OCR and structured extraction built in.
Same end goal — clean, ordered Markdown from PDFs for RAG/training ingestion. olmocr is a dedicated self-hosted vision-language model that excels on scans, tables and handwriting; Xberg is a general extraction framework with its own OCR (ONNX, Candle, or any VLM via LiteLLM) and a plugin layer where olmocr could sit as one backend. Use olmocr when OCR quality is the bottleneck, Xberg when you need many formats and language bindings.
| olmocr | xberg | |
|---|---|---|
| Stars | 20k | 9.4k |
| Forks | 1.6k | 593 |
| Language | Python | Rust |
| License | Apache-2.0 | MIT |
| Last activity | 6 months ago | today |
| Topics | rag, ocr | ocr, rag, local |
| Curated connections | 12 | 7 |
olmocr — the curator's take
Reach for olmocr when you have lots of messy PDFs to convert into high-quality text for a training corpus or RAG index and you have GPU to run the VLM. It is the parsing FRONT-END of a pipeline, not a RAG system itself — pair it with an indexer/retriever (LlamaIndex) and a vector store (Chroma). NOT worth it for clean, digital-native PDFs where a cheap text extractor does the job — running a vision-language model for those is overkill.
xberg — the curator's take
The polyglot pick: reach for Xberg when your stack spans Rust, Python, Node, Go, the JVM or WASM and you want ONE extraction engine instead of a per-language pipeline. Handles 96 formats — PDFs, Office, images, audio/video (Whisper), source code (306 languages, syntax-aware chunking) — and websites, dynamic pages included. OCR is built in, not bolted on: ONNX and Candle models run locally, or any VLM (Gemini, Mistral, …) through LiteLLM; on top sit structured extraction to a JSON schema and NER, keywords, classification and captioning. Think of it as a parallel extraction orchestrator with a plugin architecture — a MinerU backend or your own local VLM can sit behind it — rather than a single parser. It's the v1 successor to Kreuzberg. Don't reach for it if all you need is max-fidelity parsing of messy scanned PDFs and nothing else (a dedicated VLM like MinerU or olmocr is the shorter path, though either can also run behind Xberg), or if you're Python-only and already committed to LlamaIndex's own readers.