You write | Name | Role | with a clean separator row, commit, and open the README. On GitHub it's a tidy table. In your team's docs site it's a wall of pipes. Same file, same lines, different renderer.
That's not a bug in your Markdown. "Markdown" stopped being one language years ago.
The three dialects you hit every week
CommonMark — the spec. Headings, lists, emphasis, links, code blocks, blockquotes, and not much else. If a renderer says "strict Markdown," this is what it means.
GFM (GitHub Flavored Markdown) — CommonMark plus tables, task lists, strikethrough, autolinked URLs, and footnotes. GitHub uses it. So does Dev.to, most static site generators (Jekyll, Hugo, MkDocs with the right plugin), and marked.js with remark-gfm in the JavaScript ecosystem.
Editor dialects — Notion, Obsidian and friends add callouts, [[wikilinks]], highlight marks and databases. They export Markdown, but the round trip is lossy: a Notion callout becomes a plain paragraph the moment it lands in someone else's editor.
Where the divergence actually bites
- Tables. GFM only. Without it, you get raw pipes.
-
Task lists.
- [x]renders as a checkbox on GitHub; elsewhere it's the literal text[x]. -
Emoji shortcodes.
:shipit:needs an emoji plugin. Core parsers leave it alone — paste the real character instead. - Line breaks. A single newline is a space in CommonMark. GitHub behaves the same way, which is why "my newline does nothing" is usually correct behavior rather than a broken preview.
-
Heading anchors. GitHub slugifies headings into anchors (
## Setup Guidebecomes#setup-guide). Other renderers generate different slugs, so cross-links break silently.
The practical habit is to write for the smallest common subset: assume CommonMark plus tables and task lists, and treat everything else as platform-specific sugar. Then verify before publishing — not in your editor, but in a renderer that matches your audience.
For that last step I keep a browser previewer open: it runs marked.js with GFM enabled (the same dialect GitHub and Dev.to use), renders as you type, and never uploads a byte — everything happens client-side. Here it is: Markdown Preview on CodeToolbox. Paste the file, confirm your tables and task lists survive the trip, then commit.
One minute of previewing beats a "fix README formatting" commit at 11pm.
Top comments (0)