History · 8 min read

There Is No Markdown Standard

Its creator refused to write one. The committee that tried was forced to rename its spec twice in 48 hours. Then GitHub settled the question without asking anyone.

Markdown may be the most widely used markup format ever shipped: billions of files, every developer platform, most of the notes apps on earth. And there is no standard for it. Not a stalled draft, not a dormant committee. None. The last official word on Markdown syntax is a companion page to a Perl script, frozen in 2004.

Two documents fill the vacuum. CommonMark (2014) is the standard on paper: a rigorous, testable spec for how core Markdown parses. GitHub Flavored Markdown (formalized 2017) is the standard in practice: CommonMark plus tables, task lists, strikethrough, and autolinks. If you wrote a README, an issue comment, or an Obsidian note this week, you wrote GFM.

How that settled is the interesting part, because no committee ever ratified any of it. Markdown’s standard was decided the way most real standards are: not by whoever wrote the best spec, but by whoever had the most users. It took a creator who refused to standardize, a working group he forced to rename its spec twice in 48 hours, and a product default that put a Markdown file on the front page of every software project on the planet.

Timeline of Markdown standards from Markdown 1.0.1 in 2004 to CommonMark in 2014, GFM in 2017, and today's de facto standard.
Markdown's practical standard emerged in layers rather than through a single governing body.

The spec that refused to grow

John Gruber released Markdown in 2004: a syntax description and a Perl script. Version 1.0.1 is still the last version. Gruber wasn’t ignoring it. He was openly against standardizing it. Different sites have different needs, he argued, and no single syntax would make everyone happy.

The problem is that his description left a lot of basic questions open. How many spaces indent a nested list? Is a blank line required before a blockquote? Every implementation guessed differently. And since nothing in Markdown is ever a syntax error, files moved between tools didn’t break. They just rendered wrong, silently. Ten years in, “Markdown” was dozens of slightly incompatible languages sharing a name.

The same Markdown source rendered differently by three parsers.
Loose syntax feels forgiving until the same file reaches a different parser.

The standard that had to change its name. Twice.

By 2012, Jeff Atwood of Stack Overflow had lost patience and pulled together a working group: people from Stack Exchange, GitHub, and Reddit, with Pandoc author John MacFarlane writing most of the spec. Two years of work produced a rigorous, fully testable definition of Markdown: every ambiguity resolved, every rule backed by test cases. The group had invited Gruber to join by email in 2012 and never heard back. In September 2014 they shipped it as Standard Markdown.

The night it launched, an email from Gruber arrived, not about the spec but about the name, which he called “infuriating.” He made three requests: rename the project, shut down the domain without redirecting it, and apologize. They renamed it Common Markdown within a day. Not enough. Gruber followed up that no form of the word “Markdown” was acceptable. Two days after launch, the project became CommonMark. To this day, the most careful specification of Markdown ever written is not allowed to have Markdown in its name.

Three-step naming sequence from Standard Markdown to Common Markdown to CommonMark within 48 hours.
The project's name changed twice in roughly 48 hours.

The name fight makes for good drama, but underneath it sat two genuinely different theories of how a format wins. Gruber thought loose conventions spread further than strict specs. The CommonMark camp thought a format used by millions across incompatible tools needs deterministic parsing. Both were right, in sequence: looseness won Markdown its adoption, and the mess that adoption created is exactly why CommonMark had to exist.

One more detail matters: CommonMark deliberately specified only the core. No tables, no task lists, no footnotes. It standardized parsing and left features to someone else.

GitHub picks the winner

That someone else was GitHub, mostly by accident.

GitHub’s key move wasn’t a spec. It was a product default. Put a README.md in your repo and GitHub renders it as your project’s front page. That one convention made Markdown mandatory for practically every developer. Nobody evaluated markup languages and chose Markdown; their project’s landing page simply was a Markdown file.

GitHub had been extending Markdown since about 2009 with things developers kept needing: tables, fenced code blocks, checkboxes, auto-linked issues. None of it was in Gruber’s spec. All of it became, in millions of heads, just “Markdown.”

Then in 2017 GitHub did the thing that settled the question: it published a formal GFM spec built directly on CommonMark, as a strict superset, and rebuilt its own parser on CommonMark’s reference implementation. The committee’s spec and the platform’s dialect became one lineage. CommonMark won the argument; GitHub supplied the enforcement. A spec with a test suite is nice. A spec sitting under 400+ million repositories is a standard.

And the mechanism still runs. When GitHub started rendering Mermaid diagrams in 2022, “Mermaid support” became table stakes across the whole ecosystem within a couple of years. Whatever GitHub renders, everyone else learns to render. Markdown does have a standards body after all. It just happens to be GitHub’s product team.

Where the flavors stand

Every flavor you’ll meet today is best understood by its distance from the CommonMark/GFM core:

FlavorRelationship to the standard
CommonMarkThe baseline spec
GFMCommonMark + tables, task lists, strikethrough, autolinks. The de facto standard
GitLab Flavored MarkdownGFM + GitLab references, math, its own rendering pipeline
Obsidian, TyporaNear-GFM editor profiles with deliberately non-portable extras (wikilinks, callouts)
Pandoc, MultiMarkdownOlder publishing dialects that predate CommonMark and follow their own rules
MDX, MySTMarkdown as app infrastructure: components and ASTs, only loosely CommonMark-shaped
Concentric diagram with CommonMark at the core, GFM around it, and platform-specific Markdown flavors outside.
Portability decreases as syntax moves away from the CommonMark and GFM core.

The practical rule falls straight out of the table: CommonMark is the floor, core GFM is the ceiling for anything that needs to travel between tools. Stay inside that ring (headings, links, images, fenced code, pipe tables, task lists) and your file renders correctly essentially everywhere. Step outside it and you’re targeting one specific tool, which is fine, as long as you’re doing it on purpose.


What exactly lives outside the ring (footnotes, math, diagrams, callouts, front matter, and which flavors support which) is its own topic, and a bigger one than it sounds. We’re covering it feature by feature in a follow-up post.