markitdown vs markitdown-rs
markitdown-rs is a markitdown alternative that keeps markitdown's output: Microsoft's markitdown rewritten in Rust as one binary, plus a Python package with the same API. Here is how it compares with markitdown itself and with the other tools people use to turn documents into Markdown for LLMs. Repository numbers were read from the GitHub and crates.io APIs on 2026-10-22; behaviour was checked by running each tool where possible, otherwise taken from its README (marked README).
At a glance
| markitdown-rs | microsoft/markitdown | markitdown on crates.io (uhobnil) | xberg (formerly kreuzberg) | MDFlux | |
|---|---|---|---|---|---|
| What it is | markitdown's CLI and converters in one Rust binary, and its Python API on them | the reference: Python library and CLI | Rust library and CLI inspired by markitdown | document-intelligence platform with a Rust core | desktop app around Python markitdown |
| GitHub stars (2026-10-22) | new | 191,550 | 76 | 9,437 | 568 |
| Latest release | v0.2.0 | v0.1.9 (2026-10-21) | 0.1.11 (2026-04-22) | v1.3.10 (2026-10-13) | v0.3.0 (2026-08-23) |
| License | MIT | MIT | MIT | MIT | MIT |
| Install | one binary (Homebrew, cargo install markitdown-rs, release archives); Python package: pip install "markitdown-rs[mcp]" from PyPI | pip install 'markitdown[all]' and Python 3.10+ | cargo install markitdown (needs --locked: unlocked, its calamine dependency no longer compiles) | pip, npm, cargo, Go, Java and more; Docker | Windows/Linux zip; sets up its own Python on first run |
| Runtime dependencies | none | Python and 46 packages for the docx/pptx/xlsx/xls/pdf/outlook extras, incl. magika and onnxruntime (328 MB virtualenv) | none | native library per binding; ONNX models for layout and OCR | bundled Python and markitdown |
| Output identical to markitdown | 401 of 406 test files (5 documented differences) | reference | 35 of 405 (164 files fail to convert) | not a goal (own Markdown) | same engine as markitdown, plus optional cleanup |
| Speed vs markitdown (CLI) | median 408× faster (15–1,660× on 231 files outside the test set) | 1× | not measured | not measured | same engine |
The "identical" row runs every fixture in the markitdown-rs repository through each tool's CLI and compares with Python markitdown 0.1.9's output byte for byte (406 files with a Python result; the crates.io crate was measured on 405, before one fixture was added). The crates.io crate is markitdown 0.1.11, installed with cargo install --locked.
Formats and features
| markitdown-rs | microsoft/markitdown | markitdown (crates.io) | xberg | MDFlux | |
|---|---|---|---|---|---|
| PDF (text layer) | yes, pdfminer-identical | yes (pdfminer and pdfplumber) | yes (plain text) | yes, with layout models | yes (markitdown) |
| PDF tables without borders | yes, markitdown's detection | yes | no | yes (table models) | yes (markitdown) |
| Scanned PDFs and images (OCR) | Python package, with the markitdown-ocr plugin (needs an LLM) | plugin (markitdown-ocr, needs an LLM) | no | yes (Tesseract, PaddleOCR, ...) | yes, built in |
Word .docx | yes; custom style_map in the Python package | yes | yes | yes | yes |
PowerPoint .pptx | yes | yes | yes | yes | yes |
Excel .xlsx / .xls | yes / yes (Excel 3/4 too) | yes / yes | yes / no README | yes | yes |
| HTML, Wikipedia, Bing pages | yes | yes | HTML only | yes | HTML |
| EPUB | yes | yes | no README | yes | yes |
Outlook .msg | yes | yes | no README | yes (email) | no README |
| CSV, JSON, XML, RSS/Atom, Jupyter | yes | yes | CSV, XML, RSS README | yes | CSV, JSON, XML |
| ZIP (converts contents) | yes, with size and nesting limits | yes | yes | yes, plus tar/7z | no README |
| Images, audio | metadata (exiftool); audio transcription in the Python package | metadata; audio transcription | images README | OCR; transcription (feature) | images, audio |
| http(s) URLs | yes | yes | no | yes (feature) | no README |
| YouTube pages | metadata, description, transcript | metadata, description, transcript (extra) | no | not stated | no |
| LLM image captions | Python package (llm_client) | yes (llm_client) | yes (llm_client) README | yes (VLM backends) | AI cleanup pass |
| Azure Document Intelligence, Content Understanding | Python package (markitdown's own converters; tested with mocked clients) | yes | no | not stated | no |
| Plugins | Python package (markitdown-ocr tested) | yes | no | yes (OCR backends) | no |
| Python API | yes: from markitdown import MarkItDown, same API incl. custom converters | yes | no | yes | no |
| Command line | Rust binary (fast); the Python package's markitdown with all of 0.1.9's flags | yes | yes | yes | no |
| Rust library | yes (markitdown-core) | no | yes | yes | no |
| MCP server | yes: markitdown mcp, stdio and HTTP/SSE, same tool as markitdown-mcp | yes (markitdown-mcp, stdio and HTTP) | no | yes | no |
| GUI | no | no | no | no | yes |
When to use which
- You call markitdown from a shell, CI job, container, agent (MCP) or Python code and want the same Markdown without markitdown's dependency stack: markitdown-rs.
- You need OCR, LLM captions, Azure or plugins: Python markitdown, or markitdown-rs's Python package, which runs them on the Rust converters (or MDFlux for a desktop app with OCR).
- You need layout-model PDF parsing, many more formats or bindings in other languages, and do not need markitdown's exact output: xberg.
Method
- Stars and dates:
gh api repos/<owner>/<repo>and/releases/latest, crates.io API, 2026-10-22. - Parity:
cargo testin the markitdown-rs repository; for the crates.io crate, the same fixtures through its CLI against the same snapshots. - Speed: 231 Apache Tika and arXiv files outside the test set (2026-11-05), and
scripts/bench.sh; numbers in the README.