The Problem

Processing unstructured data into LLM-ready formats remains fragmented. Teams commonly stitch together separate OCR, transcription, and web crawling tools, resulting in inconsistent output schemas, duplicated model management, and integration friction with RAG or fine-tuning pipelines. The pain point is operational: ingest a document, image, audio, or web page and get structured, actionable data without orchestrating a custom pipeline each time.

What This Does

OmniParse is a parsing platform that supports ~20 file types—documents, images, audio, video, and web pages—converting them to high-quality structured markdown optimized for GenAI workflows. The codebase is organized into modular packages under omniparse/:

  • omniparse/documents/ – document parsing with Surya OCR and Florence-2 models
  • omniparse/media/ – Whisper-based audio/video transcription
  • omniparse/image/ – image processing and captioning
  • omniparse/web/ – Selenium-based web crawling with configurable strategies
  • omniparse/chunking/ – post-parse chunking for LLM context windows

Entry point is server.py, which orchestrates model loading and API serving. Supporting files include download.py for pre-downloading models and omniparse/utils.py for shared utilities. The python-sdk/omniparse_client/ provides a Python client for programmatic access.

How It Is Wired

Execution starts at server.py, which parses CLI flags (--documents, --media, --web) and triggers model loading via omniparse/web/model_loader.py. The web module routes through omniparse/web/router.py and depends on omniparse/web/models.py for model instantiation and omniparse/web/prompts.py for prompt templates. Document parsing flows through omniparse/documents/router.py, which coordinates Surya and Florence-2. Media transcription uses omniparse/media/router.py with Whisper. The web crawler in omniparse/web/web_crawler.py uses Selenium and respects a strategy pattern in omniparse/web/crawler_strategy.py.

A notable external dependency: the Docker image is published to Docker Hub as savatar101/omniparse, and the repo references LangChain in its workflows, suggesting integration points exist but are not deeply mapped in the current surface area.

Internal call graph: server.py → model_loader → router → (document/media/web specific handlers). The widest blast radius is in omniparse/web/router.py and omniparse/documents/router.py, as both are entry points for model initialization and can load heavy vision/LLM models.

How To Use It

Setup: Clone the repository:

git clone https://github.com/moses-y/omniparse
cd omniparse

Create a Python 3.10+ environment and install dependencies:

poetry install
# or
pip install -e .

Configuration: No environment variables are required for local mode, but model downloads depend on download.py --documents --media --web. The README notes the server only runs on Linux-based systems due to system-specific dependencies.

Running it: Start the API server:

python server.py --host 0.0.0.0 --port 8000 --documents --media --web

This loads document models (Surya OCR, Florence-2), Whisper for media, and enables the Selenium web crawler. To pre-download models:

python download.py --documents --media --web

Docker build and run are also supported via Dockerfile and the published savatar101/omniparse:0.1 image.

Real-World Use

A RAG pipeline ingesting PDFs and website URLs can offload preprocessing to OmniParse: point the parser at a directory of documents and web sources, receive structured markdown back, and feed that directly into a vector store. The web crawler (omniparse/web/web_crawler.py) extracts and converts pages in one step, eliminating a separate scraping + cleaning layer. For multimedia, omniparse/media/router.py transcribes audio/video to text that can be chunked and embedded alongside document content.

Code Health & Issues

  • No test files detected – repository-wide untested code paths. Critical parsing and model-loading logic has no unit or integration test coverage.
  • Dependencies declared without a lockfile – pyproject.toml lists dependencies but no poetry.lock or requirements.txt with pinned versions, leading to non-reproducible builds across environments.

SDLC observations: The .github/workflows/ directory contains Docker CI and Python publish pipelines, and a CODE_OF_CONDUCT.md, CONTRIBUTING.md, and issue/pr templates are present. However, the absence of a lockfile and test suite is a practical blocker for team adoption.

The Bottom Line

OmniParse delivers a functional, locally-run parsing pipeline for ~20 data types with a single CLI flag, and the Docker image is readily available. The codebase is modular but thin on testing and dependency pinning, which limits its readiness for production RAG or fine-tuning pipelines without engineering investment. Teams that need a self-hosted, no-API-parser and are comfortable managing model versions and environment compatibility will find it usable; others should expect to add test coverage and lockfile discipline before shipping to production.