John MacFarlane has published a retrospective celebrating twenty years of pandoc. The first version, released under the GPL on August 3, 2006, was roughly 3,000 lines of Haskell with no dependencies beyond GHC's standard library, converting between Markdown, reStructuredText, HTML and LaTeX, plus RTF and S5 output.

The origin story is pleasingly accidental: MacFarlane, a philosopher, wanted to learn Haskell after reading about it on Greg Restall's blog, and picked a Markdown parser as his practice project. Unlike the regex-based Markdown implementations of the era (in Perl, Python, Ruby and PHP), pandoc parsed into a real abstract syntax tree via parser combinators, making N readers times M writers possible. Early milestones included Debian packaging by Recai Oktaş, the move to Hackage in 2007, and pandoc 1.0 in September 2008 with MediaWiki, Texinfo, OpenDocument and ODT writers, fenced code blocks with syntax highlighting, and CSL-based citation generation.

Major architectural steps followed: the template system in 1.4 (2010), the move from Google Code to GitHub in 2010, docx output in 1.9 (2012), Lua custom writers, YAML metadata blocks and JSON filters in 2013, and commonmark support in 1.14 (2015) — born from the failed 'Standard Markdown' working group, which John Gruber objected to, prompting the rename. Pandoc 2.0 (2017) introduced the PandocMonad abstraction allowing readers and writers to perform I/O, plus embedded Lua filters built by Albert Krewinkel on hslua. A $100,000 donation from Handshake in 2018 funded maintainer stipends for five years.

Pandoc 3.0 (2023) split the monolith into pandoc, pandoc-lua-engine, pandoc-server and pandoc-cli. Later additions include a Typst reader (requiring a full language interpreter), the djot markup format, and in pandoc 3.9 (February 2026) compilation to WASM, enabling pandoc to run in the browser.

Statistics: pandoc now supports 51 input and 76 output formats — 3,876 distinct conversions. The four core packages comprise 85,684 lines of Haskell, roughly doubling when pandoc-specific dependencies are counted. Over 600 people have contributed; 7,346 GitHub issues have been resolved. MacFarlane credits Haskell's algebraic data types, strong static typing and purity for making a spare-time project of this scale manageable.

Looking ahead, he concedes that LLMs already convert between document formats decently, and may one day out-perform deterministic converters — but notes pandoc's advantages for now: far lower energy use, deterministic output and higher reliability. He closes by saying he is proud of a project that has saved users countless hours of drudgery.