In 2017, GitHub published a formal specification for the dialect of markdown it uses across its platform. That spec, GitHub Flavored Markdown (GFM), is built on CommonMark and adds six extensions that have since become the de facto standard for developer-facing markdown. If you write READMEs, open issues, or publish docs, you are almost certainly writing GFM.
What Is GitHub Flavored Markdown
CommonMark is a strict, unambiguous parsing specification for markdown. It standardizes the ambiguous parts of John Gruber's original markdown so that every parser produces the same output from the same input. GFM takes CommonMark as its base and adds six syntax extensions that GitHub needed for its workflows. The full spec is published at github.github.com/gfm.
The Six GFM Extensions
Tables
Tables use pipe characters to separate columns. A row of dashes below the header row separates header cells from body cells. Colons in the separator row control column alignment.
| Name | Type | Required |
|-----------|---------|----------|
| title | string | yes |
| date | date | yes |
| excerpt | string | no |
| Left | Center | Right |
|:-----|:------:|------:|
| a | b | c |
Column widths do not need to match. Pipes at the start and end of each row are optional but conventional.
Task Lists
Task list items are list items with a checkbox marker. An x inside the brackets marks the item as checked; a space leaves it unchecked.
- [x] Write draft
- [x] Add code examples
- [ ] Peer review
- [ ] Publish
On GitHub, checked items render as ticked checkboxes. In Issues and PRs, GitHub also tracks the ratio of completed items and shows it in the issue list.
Strikethrough
Wrapping text in double tildes produces strikethrough output.
The build time was ~~45 minutes~~ 8 seconds after the cache fix.
Single tildes do not trigger strikethrough in GFM. The double-tilde syntax is specific to GFM and is not in CommonMark.
Autolinks
GFM turns bare URLs into clickable links without requiring the [text](url) syntax or angle brackets. Any string that looks like a URL (starting with http:// or https://) becomes a hyperlink automatically.
Visit https://md0.io for the full tool list.
Email addresses that match standard email patterns also become mailto: links in GFM contexts.
Disallowed HTML
GFM allows most HTML passthrough from CommonMark, but it strips a specific set of tags for security reasons. Tags like <script>, <style>, <iframe>, and <title> are filtered out before rendering. This matters for GitHub-hosted content where arbitrary HTML would be a security risk. The stripped tags are listed in the GFM spec's disallowed-raw-HTML extension.
Extended Autolinks
Beyond basic URL autolinks, GFM also linkifies URLs that appear without a scheme if they match patterns for www. domains, and it handles URLs inside other inline constructs more aggressively than CommonMark does. This extension is what makes bare www.example.com text clickable on GitHub without http:// in front of it.
Where GFM Renders
GFM renders on GitHub's own surfaces: READMEs, Issues, Pull Requests, GitHub Gist, GitHub Discussions, and GitHub Wiki pages. GitHub Pages renders GFM when you use Jekyll (its default static site generator), though some Jekyll themes apply their own markdown processor settings.
Outside GitHub, GFM support depends on the parser. Renderers and tools that support GFM include:
- Any project using remark-gfm (the remark ecosystem plugin)
- marked with the
gfm: trueoption (its default) - GitLab (a close but not identical dialect)
- VS Code preview (uses a GFM-compatible renderer)
- Obsidian (supports tables and task lists; strikethrough depends on plugin settings)
- md0's own tools (see below)
Standard CommonMark parsers do not support tables or task lists by default. If you paste a GFM table into a plain CommonMark renderer, the pipes appear as literal text rather than a rendered table.
GFM vs CommonMark
GFM is a superset of CommonMark. Every valid CommonMark document is also valid GFM. The reverse is not true: a GFM document with tables or task lists may not render correctly in a pure CommonMark parser.
CommonMark's value is precision: it defines a strict parsing algorithm so that the same input always produces the same output, regardless of which CommonMark-compliant parser handles it. GFM inherits that precision and adds the six extensions on top.
Most modern static site generators support GFM or can be configured to do so:
| SSG | Default parser | GFM support | |-----------|-------------------|-------------------| | Next.js | remark | via remark-gfm | | Astro | remark | via remark-gfm | | Hugo | goldmark | built in | | Jekyll | kramdown | partial (no task lists by default) | | Eleventy | markdown-it | via plugin |
If your SSG uses remark, adding remark-gfm to your unified pipeline is the standard path to full GFM support.
GFM in md0 Tools
All md0.io tools use a GFM-compatible renderer, so tables, task lists, strikethrough, and autolinks all work without any configuration.
- /cheatsheet: full syntax reference covering GFM and CommonMark syntax side by side
- /editor: split-pane editor with live GFM preview; useful for testing how a document will render before committing it
- /to-html: converts GFM documents to clean HTML, including table markup and checked list items
- /to-table: generates GFM pipe-syntax tables from structured input (paste data, get a table)
- /toc-generator: builds a GFM-linked table of contents from heading structure in your document
Common Mistakes
A few GFM patterns trip people up repeatedly. Forgetting a blank line before a table is the most common: GFM requires at least one blank line between a paragraph and a table, or the table is parsed as a continuation of the paragraph text. Another frequent issue is assuming that pipe column alignment matters for parsing; GFM ignores visual alignment in the source, but some older parsers do not. Writing raw <script> or <style> tags inside a GFM document on GitHub will silently strip those tags rather than throw an error, which can hide bugs in documents that include inline HTML. Finally, task list nesting requires standard list indentation (two or four spaces depending on the parser); inconsistent indentation causes nested items to render at the wrong level or break out of the list entirely.