Markdown is a terrible language
Theo reacts to Brock's blog post "Why are we still using Markdown?" (https://bgslabs.org/blog/why-are-we-using-markdown). Despite being a long-time Markdown advocate (he once refused jobs that wouldn't accept a Markdown resume), he agrees we've pushed the format past its breaking point.
The good
- Minimal language for typesetting trivial documents:
.mdin,.htmlout. - Near-zero learning curve; legible without rendering.
- Credit to John Gruber and Aaron Swartz for something genuinely magical.
The bad — the language can't decide what it is
- Multiple syntaxes for the same output. Bold can be
**,__, or<b>; headings have ATX (#) and Setext (underline) forms; unordered lists have multiple markers; ordered lists ignore the numbers you write. - Edge cases everywhere. Nested bold/italic combinations are nearly unparseable. Real CVE: a 6.9-severity ReDoS in markdown-it (just stars in a link can DoS a parser).
- Inline HTML — "ASM bolted into a sandboxed doc format". Means every Markdown parser must also ship a friendly HTML parser → recurring XSS vulnerabilities across major implementations.
- Old/obscure syntax inherited from Usenet/email (quote
:, pipe-separated columns) that Markdown can't actually render properly. - T3 Chat hit these rendering edge cases hard; LaTeX edge cases are even worse.
Parsing isn't even the hard part — rendering is
- Footnotes / reference-style links require global definition resolution → grammar becomes context-sensitive, not context-free.
- Adding what people actually want (footnotes, callouts, math, custom CSS, plugins) escalates from a transliterator to a full compiler with a dependency graph and execution engine.
- Quote: "Markdown is the C++ of markup languages."
Notion aside (Theo's hot take)
- Notion's export of Markdown is broken/garbage — don't use it.
- But Notion's use of Markdown syntax as input hotkeys (~# ~ → H1) is genuinely good UX.
Proposed direction (from the article)
- Plain text, MDX, reStructuredText all fail in their own ways.
- Real fix: a purpose-built markup language with a proper build system, no inline HTML, well-defined shortcodes/hooks, and a trivially-parsable grammar.
- Theo agrees: "we are trying to use it like [a programming language] and because it lacks a formal foundation, it's failing at both."
Historical note
- 2012: Jeff Atwood begged Gruber to bless a standard. Gruber's original
markdown.plcalled "one of the worst small programs I've ever read" — so buggy that an MD5-hash collision in inline-escape handling caused a Reddit XSS incident.
Takeaway
Theo started as an unconditional Markdown fan and ended the video admitting the article pushed him "over the edge" — Markdown is bad, we use it daily anyway, and the LLM/agent era (everything emits Markdown) is making the parsing/security situation worse.