Skip to content
AstroPaper
Go back

Markdown Standards and the GitHub Convergence Problem

Edit page

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

StandardDescription
CommonMarkThe 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
MDXMarkdown + JSX components — popular in React, Next.js, and Astro ecosystems for interactive content
PHP Markdown ExtraAdds footnotes, abbreviations, definition lists, fenced code blocks, and tables — influential in the PHP/WordPress world

Feature Comparison

FeatureCommonMarkGFMMultiMarkdownMDXPHP Markdown Extra
Strict specPartialPartial
Tables
Task lists
Strikethrough
FootnotesVia plugins
Citations
Definition listsVia plugins
Metadata/frontmatter
JSX components
Auto-linked URLs
Fenced code blocks
Based on CommonMark
Primary ecosystemUniversalGitHub/GitLabAcademic/writingReact/Astro/Next.jsPHP/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:

GitHub provides official documentation in two forms:

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:

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

Option B: Optimize for GitHub

When to Choose Which

Content typeBest choiceWhy
Blog posts, personal writingFramework specReaders see the built site, not raw .md files. Rich features matter.
Project docs, design plans, ADRsGFMOften read directly on GitHub. Contributors need to read/edit without building a site. Portability matters.
Public-facing documentationEitherMany 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 warsMarkdown today
”Best viewed in IE""Best rendered on GitHub”
Each browser renders CSS differentlyEach framework renders Markdown differently
Devs add browser-specific hacksDevs add framework-specific plugins
W3C spec existed but was inconsistently implementedCommonMark spec exists but everyone extends it differently
Eventually converged via standards + shared enginesStill waiting

The browser wars ended because three things happened:

  1. A strict spec (HTML5/CSS3) matured
  2. A shared engine (Chromium/WebKit) became dominant
  3. 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:

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.


Edit page
Share this post on:

Previous Post
Bubblewrap: Linux Sandboxing with Namespaces and sysctl
Next Post
Designing a Config Sync Strategy for Claude Code