Key highlights:
• 17.1K GitHub stars, 982 forks, MIT license, pure Rust — repo opened August 3, 2026, latest release v0.1.9 (August 13, 2026)
• Median conversion: 4.4ms per document. No ML models, no GPU, no API key, no system dependencies
• 14 formats in one binary: `.doc`, `.docx`, `.docm`, `.xls`, `.xlsx`, `.xlsm`, `.xlsb`, `.ppt`, `.pptx`, `.odt`, `.ods`, `.odp`, `.rtf`, `.epub`, `.csv` — plus PDF via [pdf-inspector](https://andrew.ooo/posts/pdf-inspector-firecrawl-rust-pdf-parser-review/)
• Four runtimes: Rust crate, Node.js (`@firecrawl/anydoc`), Python (`firecrawl-anydoc`), and browser WebAssembly
• Ships as an Agent Skill — `npx skills add firecrawl/anydoc` and Claude Code, Codex, or Cursor can read any office document it stumbles into
Firecrawl — the web-scraping-for-LLMs company — hit the same wall every document pipeline hits: no single library reliably converts every common format to clean Markdown. You end up with four or five tools, each with its own dependency tree, its own output shape, and its own failure modes. A table that escapes correctly in your docx path renders broken in your rtf path, because different libraries wrote those serializers.
anydoc's answer is architectural rather than clever: every format gets its own parser, but all parsers emit into one shared document model, and that model renders through one Markdown serializer.
├─► format detection → content markers, not the extension
First, RAG pipelines finally admitted that parsing is the bottleneck. Chunking strategies and reranking got most of the 2025 attention, but teams kept discovering that retrieval quality was capped by garbage extraction upstream. A merged table cell that flattens into gibberish poisons every chunk downstream, and no reranker fixes it.
Second, the "just throw it at a vision model" era got expensive. Routing every upload through a multimodal endpoint at GPU prices, when most are structurally readable .docx files, eventually shows up on a CFO's radar. anydoc plus pdf-inspector is the deterministic, CPU-only path for everything that does not genuinely need pixels.
A note on the hype curve, because honesty is cheap here: anydoc did not blow up on Hacker News. The two submissions of the repo scored 4 points and 3 points respectively, with essentially no discussion. Its 17K stars came from X (Firecrawl's launch thread, amplified by Garry Tan), Reddit's r/AIDeveloperNews, and developer newsletters — not from a front-page HN thread. Star velocity from a well-connected YC company is not the same as broad practitioner validation, and you should weight it accordingly.
A quietly excellent design decision: anydoc reads the format from the bytes themselves — the PDF header, the RTF open group, OLE stream names, the ZIP package mimetype — not the filename.
Format::from_bytes(&bytes); // Some(Format::Docx), or None
Format::from_extension("pptm"); // Some(Format::Pptx)
This is a condensed version. The full article includes architecture diagrams, code examples, comparison tables, and practical use cases.
👉 Read the complete analysis on andrew.ooo
Topics: anydoc, firecrawl, rust, markdown, document parsing
No posts

Comments
Nothing yet. Say the first thing.
Sign in to join the conversation.