The preview pane speaks GitHub Flavored Markdown, usually shortened to GFM. That means the CommonMark specification, the standardised core of Markdown, plus the extensions GitHub added for developer writing: pipe tables, checkbox task lists, double-tilde strikethrough and bare URLs that become links on their own. Rendering runs through marked.js with its GFM option on.
The dialect matters, because a few popular extensions sit outside it. Footnotes, definition lists and YAML front matter are not part of GFM. They will not render here, and they will not render on GitHub either, even though Obsidian and Pandoc handle them happily. Writing a README, an issue or a static-site blog? GFM is the target you want, and the GFM guide covers each extension in detail.
Three things do render here on top of plain GFM. Code fences with a language tag are colored with highlight.js, $math$ is typeset with KaTeX, and a mermaid fence is drawn as a diagram. GitHub does all three as well, so the preview stays a fair rehearsal for a README.
At a glance
| Base spec | CommonMark, extended by GFM |
|---|---|
| Parser | marked.js, running in your browser |
| Extensions supported | Tables, task lists, strikethrough, autolinks |
| Added on top of GFM | Highlighted code, KaTeX math, Mermaid diagrams |
| Not supported | Footnotes, definition lists, YAML front matter |
| Matches GitHub | Yes for structure, styling comes from the host |
Why Markdown has flavors at all
- GFM is CommonMark plus tables, task lists, strikethrough and autolinks.
- What the preview shows is the structure GitHub will build. Only the visual styling differs.
- Strikethrough and autolinks are safe on every platform. Tables and checkboxes are not.
- Footnotes and definition lists need a different tool, such as Obsidian or Pandoc.
- Math is not in GFM, but the preview here renders it anyway with KaTeX.
- A single newline is treated as a space, exactly as GitHub treats a
.mdfile.
The 2004 spec was deliberately small and, in places, vague. It had no tables and no task lists, and it left edge cases undefined. Two parsers could both be right and still disagree about a nested list.
So platforms filled the gaps their own users felt. GitHub added tables and task lists for issues and docs. Others added footnotes, highlights or wiki links. Each set of extensions became a flavor.
Tip: CommonMark later pinned that vague core down with a precise specification and a test suite. GFM is now formally defined as CommonMark plus a short, documented list of extensions, so "GitHub Flavored" names a real standard rather than a house style.
What GFM adds, in one example
Everything from the original syntax still works: headings, emphasis, lists, links, images, blockquotes and code. GFM adds four headline features, and this snippet uses all of them:
| Feature | Original MD | GFM |
| ------------- | :---------: | :-: |
| Tables | no | yes |
| Task lists | no | yes |
- [x] Draft the report
- [ ] ~~Email version~~ Share the link
https://mdeditor.tw becomes a link automatically
Every line in that block does something different, so read it element by element.
What the four extensions do
- Tables. The row of hyphens is the separator. It tells the parser that the line above is a header row, and the colons inside it set the alignment.
- Task lists.
- [x]and- [ ]become ticked and unticked checkboxes. This is how a GitHub issue shows a checklist. - Strikethrough. Double tildes cross a phrase out without deleting it, which is useful for showing a decision that changed.
- Autolinks. A bare URL becomes clickable with no bracket syntax at all.
Tip: Paste that block into the editor and compare the two panes line by line. Tables are the feature people reach for most, and the tables guide goes deep on alignment and the usual traps.
Which extensions survive where
The current picture
Extensions are exactly where portability breaks down, so it pays to know the destination before you write. These are the platforms people paste into most:
| Platform | Tables | Task lists | Strikethrough | Autolinks | Footnotes |
|---|---|---|---|---|---|
| GitHub | Yes | Yes | Yes | Yes | Yes |
| GitLab | Yes | Yes | Yes | Yes | Yes |
| Yes | No | Yes | Yes | No | |
| Discord | No | No | Yes | Yes | No |
| Notion | Partial | Yes | Yes | Yes | No |
| Obsidian | Yes | Yes | Yes | Yes | Yes |
| VS Code preview | Yes | Yes | Yes | Yes | No |
| MD Editor | Yes | Yes | Yes | Yes | No |
Two things to take from it
- Strikethrough and autolinks are effectively universal. Use them without thinking about it.
- Tables and task lists are developer-platform features. They are unreliable in chat, so turn a table into a short list before you send it to Discord or Slack.
If your destination is a chat client, the platform guides show what each one accepts before you hit send.
The engine: marked.js in your browser
Parsing happens in your tab
The editor renders with marked.js, a fast and widely used JavaScript parser, with its GFM option enabled. It runs entirely in your browser. That is why the preview reacts on every keystroke with no round trip, and why everything keeps working offline once the page has loaded. The generated HTML then passes through DOMPurify before it reaches the preview pane, so a pasted document containing a hostile script tag renders as harmless text.
The line-break rule that surprises people
Line breaks follow the GitHub convention. A single newline inside a paragraph counts as a space, not as a forced break. That matches how GitHub renders .md files. It does not match its comment boxes, where single newlines do break. Need a hard break? End the line with two spaces, or write <br>.
How closely it matches GitHub
What you see in the preview is what GitHub will show for your README, with one caveat. Final visual styling always comes from the destination site's CSS, so fonts, spacing and colours are theirs. The structure matches, meaning what becomes a table, a checkbox or a heading.
The GFM syntax mistakes that bite most often
Each GFM extension has one strict rule that people forget. This short block breaks all four at once:
Team roster:
| Name | Role |
| Ana | Editor |
- [x]Ship the beta
- [ ]Write release notes
That plan is ~cancelled~ for now.
Not one of those four constructs renders the way it was meant to.
What went wrong
- The table has no separator row, so it stays literal text with the pipes showing.
- The table is glued to the paragraph above it. A table block needs a blank line before it.
- The checkboxes have no space after the closing bracket, so the parser sees ordinary list items.
- Strikethrough used one tilde. GFM needs two.
The corrected block
Team roster:
| Name | Role |
| ---- | ------ |
| Ana | Editor |
- [x] Ship the beta
- [ ] Write release notes
That plan is ~~cancelled~~ for now.
A separator row needs at least three hyphens per column. Colons inside it set the alignment: :--- for left, :---: for centre, ---: for right. Column widths in your source do not have to line up, since the parser ignores extra spaces. Lining them up just keeps the raw file readable.
Tip: All four errors show up in the preview within a second or two, so watch the pane while you type. If you build tables often, the table generator writes the separator row for you.
Edge cases when your target isn't GitHub
When the destination adds its own extras
The core syntax travels perfectly. Extensions vary at the margins, as the table above shows. Some documentation systems add features GFM lacks, such as footnotes, wiki links or admonition blocks. Those blocks will not preview here. They will still publish correctly on the system that supports them, so all you lose is the live preview for those specific lines. Math is the happy exception, since the preview typesets it even though GFM never defined it.
A safe default
Stay on the common core when portability matters most, which means everything in the cheat sheet. Check the destination's own preview before you publish anything extension-heavy. Otherwise GFM remains the best default, because it is the largest syntax set that renders correctly in the most places. Still getting oriented? What Markdown is covers the fundamentals first.
Related questions
Try the Editor
Open Editor