John MacFarlane a publié une rétrospective pour les vingt ans de pandoc. La première version, publiée sous GPL le 3 août 2006, comptait environ 3 000 lignes de Haskell sans dépendance autre que la bibliothèque standard de GHC, et convertissait entre Markdown, reStructuredText, HTML et LaTeX, plus RTF et S5 en sortie.

L'origine est joliment accidentelle : MacFarlane, philosophe, voulait apprendre Haskell après en avoir entendu parler sur le blog de Greg Restall, et choisit un analyseur Markdown comme projet d'exercice. Contrairement aux implémentations Markdown de l'époque (en Perl, Python, Ruby et PHP), fondées sur des expressions régulières, pandoc produisait un véritable arbre de syntaxe abstraite grâce aux combinateurs de parseurs, permettant N readers fois M writers. Parmi les premières étapes : le paquet Debian de Recai Oktaş, le passage à Hackage en 2007 et pandoc 1.0 en septembre 2008 avec writers MediaWiki, Texinfo, OpenDocument et ODT, blocs de code délimités avec coloration syntaxique et génération de citations via CSL.

Les grandes évolutions architecturales ont suivi : le système de templates dans 1.4 (2010), la migration de Google Code vers GitHub en 2010, la sortie docx dans 1.9 (2012), les writers Lua personnalisés, les blocs de métadonnées YAML et les filtres JSON en 2013, puis le support de commonmark dans 1.14 (2015) — né du groupe de travail « Standard Markdown » avorté, auquel John Gruber s'était opposé, d'où le changement de nom. Pandoc 2.0 (2017) a introduit l'abstraction PandocMonad permettant aux readers et writers d'effectuer des E/S, ainsi que les filtres Lua embarqués construits par Albert Krewinkel sur hslua. Un don de 100 000 dollars de Handshake en 2018 a financé des allocations pour les mainteneurs pendant cinq ans.

Pandoc 3.0 (2023) a scindé le monolithe en pandoc, pandoc-lua-engine, pandoc-server et pandoc-cli. Sont venus ensuite un reader Typst (nécessitant un interpréteur de langage complet), le format de balisage djot et, avec pandoc 3.9 (février 2026), la compilation vers WASM, permettant d'exécuter pandoc dans le navigateur.

Statistiques : pandoc gère désormais 51 formats d'entrée et 76 de sortie, soit 3 876 conversions distinctes. Les quatre paquets centraux représentent 85 684 lignes de Haskell, environ le double en comptant les dépendances propres à pandoc. Plus de 600 personnes ont contribué ; 7 346 tickets GitHub ont été résolus. MacFarlane attribue la viabilité d'un tel projet personnel aux types de données algébriques de Haskell, à son typage statique fort et à sa pureté.

Pour l'avenir, il concède que les LLM convertissent déjà correctement les formats de documents et pourraient un jour surpasser les convertisseurs déterministes — mais pandoc garde pour l'instant des avantages : consommation d'énergie bien moindre, sortie déterministe et meilleure fiabilité. Il se dit fier d'un projet qui a épargné d'innombrables heures de corvée à ses utilisateurs.