Converts office files and PDFs without Python or ML models
anydoc is an MIT-licensed Rust library from Firecrawl that turns office documents and PDFs into GitHub-Flavored Markdown, ready for an LLM or a RAG index. The same core ships as a crate, as a native Node.js module with a CLI, as a Python wheel and as a WebAssembly package that converts inside the browser. It calls no ML model and no outside service, and it runs without Python.
MarkItDown, Microsoft's converter, does the same job in Python 3.10 through 3.14, and Markdownify MCP installs it into a Python virtual environment to hand it to an agent. anydoc reads less (no standalone images, no audio, no HTML), but a Rust or Node.js service can embed it without bringing Python into the stack.
The comparison of open source OCR and document conversion tools sets anydoc against OCR engines and vision models, which read what it skips: scanned pages.
Reads binary .doc and .xls, flags scanned pages
- Legacy Office formats too: binary
.doc,.pptand.xlsnext to.docx,.pptx,.xlsx,.xlsband the macro-enabled variants, plus OpenDocument, RTF, EPUB, CSV and PDF. - Format detected from the bytes, not the extension, so a misnamed file still converts. CSV has no marker, and is the one format that needs its extension or an explicit option.
- One document model for every format: each parser fills the same structure, and a single Markdown serializer renders it. Merged table cells, list numbering and footnotes come out the same whatever went in, and equations become LaTeX.
- Excel read in-house: since v0.2.0 the project's own reader has replaced the calamine dependency, so dates, currencies and rounding match across
.xlsx,.xlsband.xls. - Errors a batch job can sort on:
NeedsOcrlists the scanned pages,EncryptedorMalformedsay why a file did not convert, and the CLI exits with code 3 when a page needs OCR. The job sets the file aside and moves to the next one.
OCR goes to Firecrawl, last commit August 28
No local OCR, and the opt-in goes to the vendor. anydoc reads text-based PDFs through Firecrawl's pdf-inspector library; a scanned page makes the conversion fail. The --ocr hosted option (CLI, Node and Python, but not the Rust crate or the WebAssembly package) then sends the whole document, not just the affected pages, to Firecrawl Parse. Parse counts one credit per page, and its free tier includes 1,000 credits a month (pricing read on October 7, 2026). Images embedded in a Word or PowerPoint file are not read either: only their alt text reaches the Markdown.
The CLI needs Node.js 20, and there is no official Docker image. The CLI is a Node.js script that loads the native module and converts one document per call. Prebuilt binaries cover macOS, Linux (glibc and musl) and x64 Windows, not Windows on ARM. The wheel needs Python 3.10 or later and installs as firecrawl-anydoc, because an unrelated package already holds the anydoc name on PyPI. The request for a Docker image (#11) has been open since August 5, 2026, with no reply from the maintainers.
A vendor-run benchmark that cannot be rerun as is. The README ranks anydoc ahead of six other converters, MarkItDown included, on 100 documents. An LLM judge assigned the scores, and the corpus is not redistributable, so it is not in the repository.
Two months old, no commit since August 28. The repository was created on August 3, 2026, and all fourteen releases, v0.1.1 through v0.2.4, came out between August 4 and August 27. One developer authored 118 of the 130 commits. As of October 7, 64 pull requests and 40 issues are open, among them a report of a docx silently truncated with no error (#187) and one of multi-column PDF tables collapsed into a single column (#173).
