A Brief History of MultiMarkdown
(Revised 2026-03-14)
MultiMarkdown.pl / MultiMarkdown v1 - v2
https://github.com/fletcher/MultiMarkdown
The first version of MultiMarkdown (MMD) was a modification of John Gruber’s original
Markdown.pl Perl script. It rapidly underwent a few development changes,
and the first “real” public version was version 2. MMD added support for
footnotes, tables, metadata, and a few other things.
The HTML output was then processed using Extensible Stylesheet Language Transformations (XSLT) into other formats, primarily LaTeX.
2004–03–19 – I installed Markdown.pl on my blosxom web site
2005–02–20 – I posted to Markdown-Discuss asking if there was any support for Markdown and Oddmuse.
2005–07–26 – Mentioned MultiMarkdown on the Markdown-Discuss mailing list
2005–09–25 – MMD 1.0.1(?); used XSLT
2005–12–10 – First MMD page on my Oddmuse site http://web.archive.org/web/20051210021342/http://fletcher.freeshell.org/wiki/MultiMarkdown
2006–09 – Announced MMD 2.0a along with a TextMate Bundle to support it
2009–06–20 – First release of Markdown 2 on Github
2011–01–20 – Last Github commit
peg-multimarkdown / MultiMarkdown v3
https://github.com/fletcher/peg-multimarkdown
The next version of MMD was derived from John MacFarlane’s peg-markdown. This used a Parsing Expression Grammar (PEG) to clearly define the syntax grammar and ensure accuracy in parsing. This was my first project using C, which I had not used in quite a while. There were bugs and memory leaks that I never fully cleaned up.
peg\leg was used to generate the parser from the grammar. It worked well
enough, but was not re-entrant, so it was hard to use the code for other purposes
2010–11–09 – First commit to Github repository
2018–01–19 – Last Github commit
MultiMarkdown v4
https://github.com/fletcher/MultiMarkdown-4
v4 was a complete rewrite of v3. It still used the same basic PEG, but was
otherwise restructured. This fixed memory leaks and used greg instead of
peg/leg to create the parser, allowing it to be re-entrant and
thread-safe.
2013–04–10 – First private commit I can find
2013–05–09 – First commit to public repository
2015–11–12 – Last Github commit
MultiMarkdown v5
https://github.com/fletcher/MultiMarkdown-5
v5 used largely the same code as v4, but was restructured to make it easier to maintain, including switching the build system to CMake. I also switched to a “light” version of the git flow approach to using a development branch and a main branch.
2015–06–13 – First commit to public repository
2016–10–30 – Last Github commit
MultiMarkdown v6
https://github.com/fletcher/MultiMarkdown-6
v6 was a complete rewrite from scratch, without using a PEG. I ultimately
settled on using re2c to generate tokens from the source text, and lemon
to generate a parser that processed lines of tokens into blocks. To improve
memory allocation, I added support for pools to allocate larger chunks of
memory at a time. I created an algorithm to pair tokens (such as **foo**)
that seemed to work accurately and quickly (though does not always agree
with what CommonMark chooses to do.)
In short, v6 dramatically improved performances as compared to earlier versions. It was faster than CommonMark (0.27.0) on short files (e.g. 27 kB or less), but slower on longer files (e.g. 200 kB or more).
I also created my own test suite to confirm (and remember) various edge cases to ensure parsing accuracy. It was also the first time I used fuzz testing (with American fuzzy lop) to find bugs.
2016–04–06 – First private commit I can find
2017–01–18 – Initial public commit
2025–10–30 – Last Github commit
MultiMarkdown v7
https://github.com/fletcher/MultiMarkdown-7
v7 began when I experimented with trying to improve the codebase for speed, accuracy, and maintainability. I experimented with several different parser approaches to determine which was fastest and easiest to work with. I created a hand-rolled recursive descent parser to convert lines into blocks and compared this with one generated by lemon (which was the approach I used with v6).
During development I made heavier use of fuzz testing along the way. I also tried to start from scratch as much as possible, without copying large chunks of code wholesale without good reason.
MMD v7 is much faster than v6 in comparison tests.
2024–08–15 – First private commit I can find
2025–09–08 – Initial public pre-release commit to Github
2026–03-XX – 7.0.0 release