What Is Markdown, Really?
Markdown is a lightweight markup language created by John Gruber in 2004. It lets you write formatted content in plain text using simple, readable syntax — headings with #, bold with **, links with []() — which then converts to HTML or other output formats.
It’s everywhere: README files, documentation, blog posts, forums, and static site generators. But behind that simplicity lies a fragmented ecosystem.
The Standards Landscape
There is no single Markdown standard. Instead, several competing specs have emerged, each extending the original in different directions.
The Top 5
| Standard | Description |
|---|---|
| CommonMark | The closest thing to a universal spec — strict, well-defined, widely adopted by parsers and platforms |
| GitHub Flavored Markdown (GFM) | CommonMark + tables, task lists, strikethrough, and autolinks — the most commonly encountered variant |
| MultiMarkdown (MMD) | Adds footnotes, citations, definition lists, and metadata — popular in academic and writing contexts |
| MDX | Markdown + JSX components — popular in React, Next.js, and Astro ecosystems for interactive content |
| PHP Markdown Extra | Adds footnotes, abbreviations, definition lists, fenced code blocks, and tables — influential in the PHP/WordPress world |
Feature Comparison
| Feature | CommonMark | GFM | MultiMarkdown | MDX | PHP Markdown Extra |
|---|---|---|---|---|---|
| Strict spec | ✅ | ✅ | Partial | ✅ | Partial |
| Tables | ❌ | ✅ | ✅ | ✅ | ✅ |
| Task lists | ❌ | ✅ | ❌ | ✅ | ❌ |
| Strikethrough | ❌ | ✅ | ❌ | ✅ | ❌ |
| Footnotes | ❌ | ❌ | ✅ | Via plugins | ✅ |
| Citations | ❌ | ❌ | ✅ | ❌ | ❌ |
| Definition lists | ❌ | ❌ | ✅ | Via plugins | ✅ |
| Metadata/frontmatter | ❌ | ❌ | ✅ | ✅ | ❌ |
| JSX components | ❌ | ❌ | ❌ | ✅ | ❌ |
| Auto-linked URLs | ❌ | ✅ | ✅ | ✅ | ❌ |
| Fenced code blocks | ✅ | ✅ | ✅ | ✅ | ✅ |
| Based on CommonMark | — | ✅ | ❌ | ✅ | ❌ |
| Primary ecosystem | Universal | GitHub/GitLab | Academic/writing | React/Astro/Next.js | PHP/WordPress |
The core syntax — headings, bold, italic, links, lists, code — is consistent across all of them. The differences emerge in extensions and edge cases.
GFM: The De Facto Choice
For most developers today, GFM is the default. The reasons are straightforward:
- Almost every project lives on GitHub or GitLab, which render GFM natively
- It covers the most common needs without plugins
- It’s built on CommonMark, so it’s well-specified
- Most editors, IDEs, and preview tools support it out of the box
- Developers already know it from writing READMEs, issues, and PR descriptions
GitHub provides official documentation in two forms:
- The GFM Spec — a formal specification documenting exactly how GFM extends CommonMark
- Writing on GitHub guide — a practical guide covering everyday usage including Mermaid diagrams and LaTeX math
The Renderer Gap
Here’s where things get interesting. GitHub does not provide a client-side JavaScript library that replicates their rendering. They offer a server-side Markdown API that returns the exact same HTML GitHub produces, but it’s rate-limited (60 requests/hour unauthenticated, 5,000 authenticated) — impractical for rendering at scale.
For client-side rendering, developers combine community tools:
- remark + remark-gfm — accurate GFM parsing
- marked — fast GFM-compatible parser
- github-markdown-css — replicates GitHub’s styling
This gets you ~95% there. The remaining differences are in niche edge cases: unusual nesting, sanitization rules, and GitHub-specific features like Mermaid rendering and issue autolinks.
The Blog vs. Docs Tradeoff
This creates a practical dilemma for anyone writing Markdown content:
Option A: Optimize for your framework
- Use framework-specific plugins and extensions (Astro’s remark plugins, Hugo’s Goldmark, Jekyll’s kramdown)
- Your site renders perfectly
- But
.mdfiles may not render correctly on GitHub’s web UI
Option B: Optimize for GitHub
- Stick strictly to GFM
- Files look perfect on GitHub
- But you miss out on framework-specific features like custom components, shortcodes, and image optimization
When to Choose Which
| Content type | Best choice | Why |
|---|---|---|
| Blog posts, personal writing | Framework spec | Readers see the built site, not raw .md files. Rich features matter. |
| Project docs, design plans, ADRs | GFM | Often read directly on GitHub. Contributors need to read/edit without building a site. Portability matters. |
| Public-facing documentation | Either | Many projects use GFM source files with a doc framework (Docusaurus, VitePress, Starlight) on top |
The Browser Wars Analogy
The current Markdown landscape is remarkably similar to the browser wars of the early 2000s:
| Browser wars | Markdown today |
|---|---|
| ”Best viewed in IE" | "Best rendered on GitHub” |
| Each browser renders CSS differently | Each framework renders Markdown differently |
| Devs add browser-specific hacks | Devs add framework-specific plugins |
| W3C spec existed but was inconsistently implemented | CommonMark spec exists but everyone extends it differently |
| Eventually converged via standards + shared engines | Still waiting |
The browser wars ended because three things happened:
- A strict spec (HTML5/CSS3) matured
- A shared engine (Chromium/WebKit) became dominant
- Developers demanded consistency loudly enough
Markdown has step 1 — CommonMark. But it’s missing step 2: a shared, authoritative reference renderer. If GitHub open-sourced their rendering pipeline as a client-side library, it could play the role Chromium played for browsers — a universal engine that everyone builds on.
The Pragmatic Path Forward
Until that convergence happens, the best strategy depends on your use case:
- Writing a blog? Use your framework’s spec. Readers only see the built site.
- Writing project docs? Stick to strict GFM. It renders well on GitHub, and “well enough” almost everywhere else.
- Need both? Keep your source files GFM-compatible and layer framework features on top sparingly.
GFM isn’t perfect, but it’s the least-bad option — the closest thing to “write once, render anywhere” that Markdown has today. And for technical documentation, its feature set (headings, tables, code blocks, task lists, links) is usually enough.
The dream of one syntax, one renderer, everywhere remains just that — a dream. But CommonMark laid the foundation, GFM built the most popular house on it, and someday the ecosystem might converge. Until then: write GFM, keep it simple, accept the tradeoffs.