Markdown Extended Syntax Guide: Tables, Footnotes, Task Lists & More
Markdown extended syntax is the set of formatting elements added after John Gruber published the original specification in 2004. The 2004 spec defined 11 basic elements and left out tables, footnotes, task lists, and strikethrough entirely. Later projects filled those gaps: MultiMarkdown brought tables and footnotes in 2005, Pandoc arrived in 2006 with the largest extension set of any processor, CommonMark standardised the core in 2014 with room for extensions, and GitHub published the GFM specification in 2017. Every element on this page renders in the editor's live preview, so a 5-second paste tells you whether your target app handles it.
Support Matrix
No application supports all 12 extended elements, so check support for your destination before you publish. The 4 most common destinations differ sharply:
| Element | GitHub | Obsidian | Discord | Pandoc |
|---|---|---|---|---|
| Tables | Yes | Yes | No | Yes |
| Fenced code blocks | Yes | Yes | Yes | Yes |
| Footnotes | Yes | Yes | No | Yes |
| Heading IDs | Auto only | Partial | No | Yes |
| Definition lists | No | No | No | Yes |
| Strikethrough | Yes | Yes | Yes | Yes |
| Task lists | Yes | Yes | No | Yes |
| Emoji shortcodes | Yes | Plugin | Yes | Extension |
| Highlight | No | Yes | No | Extension |
| Subscript and superscript | HTML only | HTML only | No | Yes |
| Automatic URL links | Yes | Yes | Yes | Extension |
A practical shortcut: tables, fenced code blocks, strikethrough, and task lists render almost everywhere. Definition lists, highlight, subscript, and superscript are the 4 elements most likely to fail.
Tables
A markdown table separates columns with pipe characters and marks the header row with a divider line of 3 or more hyphens. Outer pipes are optional in most parsers, but they improve compatibility, so keep them.
| Feature | Status |
| :------ | -----: |
| Export | Done |
| Sync | Open |
Colons in the divider row control alignment. :--- aligns a column left, :---: centers it, and ---: pushes it right. The parser applies the alignment to every cell in that column. Hyphen counts do not need to match across columns. To print a literal pipe inside a cell, write the HTML entity |; GitHub also accepts the backslash escape \|. Cells take inline formatting such as bold text and code spans, but never block elements such as lists or headings.
MultiMarkdown introduced the syntax in 2005 and GFM adopted it in 2017. GitHub, GitLab, Obsidian, and Pandoc render tables. Discord does not.
Fenced Code Blocks
A fenced code block opens and closes with 3 backticks and needs no indentation, unlike the 4-space code blocks in the 2004 spec. Three tildes work as an alternative fence in most parsers.
```python
def total(items):
return sum(items)
```
A language identifier placed directly after the opening fence switches on syntax highlighting. highlight.js, the library behind many web renderers, ships definitions for about 200 languages, and common identifiers include python, js, json, bash, and sql. To display a code block inside another code block, make the outer fence 4 backticks.
Support is the broadest of any extended element. GitHub, Obsidian, Discord, and Pandoc all render fenced blocks, and all 4 apply language highlighting.
Footnotes
A footnote has 2 parts: a reference marker in the body text, written as [^1], and a definition placed anywhere in the file, written as [^1]: followed by the note. The renderer collects every definition at the bottom of the page and links each pair in both directions.
The claim has a published source.[^1]
[^1]: Smith, 2024, p. 41.
Identifiers can be words as well as numbers, and [^note] behaves exactly like [^1] because output numbering follows document order rather than the label. A footnote holds multiple paragraphs when the extra paragraphs sit indented 4 spaces under the definition.
MultiMarkdown shipped footnotes in 2005, Pandoc and Obsidian support them in full, and GitHub added footnote rendering in 2021. Discord has no footnote support.
Heading IDs
A custom heading ID sits in curly braces at the end of the heading line, and ## Refund Policy {#refunds} outputs the HTML element h2 with id="refunds". The ID becomes a stable anchor for links and CSS.
## Refund Policy {#refunds}
Jump straight to [the refund policy](#refunds).
The link is a standard markdown link with a hash and the ID as the target. External pages reach the same spot when #refunds is appended to the full page URL.
Pandoc and PHP Markdown Extra parse the curly-brace form. GitHub ignores it but generates automatic IDs from heading text, so a link to #refund-policy still works there. Obsidian uses its own [[Note#Heading]] pattern for heading links. Discord renders headings in messages but has no anchor system.
Definition Lists
A definition list pairs a term with 1 or more definitions: the term sits alone on a line, and each definition starts on the next line with a colon and a space.
Markdown
: A plain-text formatting syntax released in 2004.
Parser
: Software that converts markdown into HTML.
: Also called a processor.
The output is a real <dl> element with <dt> and <dd> children, which matters for glossaries and for screen readers. Stacked colon lines give a single term multiple definitions.
Support is narrow. PHP Markdown Extra defined the syntax, and Pandoc and MultiMarkdown both parse it. GitHub and Obsidian print the colon lines as plain text, and Discord does the same. Raw <dl> HTML is the reliable fallback on GitHub.
Strikethrough
Strikethrough wraps text in 2 tildes on each side, so like this renders as crossed-out text. The element comes from GFM, and the HTML output is a <del> element.
~~Ship v2 on Friday.~~ Moved to Monday.
GitHub also accepts a single tilde per side. Stick with 2 for portability, because single tildes mean subscript in Pandoc and a 1-character difference flips the meaning.
Support is near universal. GitHub, Obsidian, Discord, and Pandoc all render 2-tilde strikethrough.
Task Lists
A task list item starts like a normal list item and adds brackets: - [ ] marks an open task and - [x] marks a finished one. The space inside the empty brackets is required.
- [x] Draft the outline
- [x] Write the copy
- [ ] Publish the page
GitHub introduced the syntax in 2013 and made the checkboxes interactive in issues and pull requests, where a click updates the underlying markdown. GitHub also counts them, so an issue reports progress such as "2 of 3 tasks". Obsidian renders clickable checkboxes in reading view, and Pandoc converts task lists to HTML checkboxes. Discord leaves the brackets as typed characters.
Emoji
Emoji enter a markdown file in 2 ways: paste the Unicode character directly, or type a shortcode such as :rocket: in applications that expand shortcodes. Pasted emoji survive in any UTF-8 file, so 🎯 displays even where shortcodes fail.
Release day :tada: went live at 9 am.
A shortcode wraps an emoji name in 2 colons. GitHub expands roughly 1,800 shortcodes, and Discord expands its own set plus custom server emoji. Obsidian needs a community plugin for shortcodes but shows pasted emoji natively, and Pandoc expands shortcodes only with its emoji extension switched on. Names vary between platforms, so a shortcode that works on GitHub is not guaranteed anywhere else.
Highlight
Highlight wraps text in 2 equals signs, and ==like this== renders with a marker-style background, usually yellow. The HTML output is a <mark> element.
The deadline moved to ==14 March== at noon.
This is one of the least portable extended elements. Obsidian renders it by default, and Pandoc parses it once the mark extension is enabled, available since Pandoc 3.0 in 2023. GitHub and Discord print the equals signs literally. Where the syntax fails, the <mark> tag works in any renderer that passes HTML through, which includes GitHub readme files.
Subscript and Superscript
Subscript wraps characters in single tildes, as in H2O, and superscript wraps them in single carets, as in x^2^. Both forms come from Pandoc's extension set rather than from any common web flavor.
H~2~O freezes at 0 degrees.
E = mc^2^ dates from 1905.
Pandoc converts them to <sub> and <sup> elements. GitHub and Obsidian ignore the tilde and caret forms but pass the HTML tags through, so H2O works on both. Discord supports neither. Watch the tilde collision: an app with single-tilde strikethrough will cross out your subscript instead of lowering it.
Automatic URL Linking
Automatic URL linking turns a bare address such as https://example.com into a clickable link with no bracket syntax required. GFM formalised the behaviour as the autolink extension in its 2017 specification.
Full docs at https://example.com/docs
GitHub and Discord linkify bare URLs, and Obsidian does the same in reading view. Pandoc keeps the behaviour off unless the autolink_bare_uris extension is enabled. To stop a URL from turning into a link, wrap it in backticks; code spans never linkify, so https://example.com stays plain text in config samples and placeholder domains.
Frequently asked questions
Is extended syntax part of official markdown?
No. The 2004 specification defines 11 basic elements, and every element on this page comes from later flavors and processors. Markdown has no governing body, which is why support differs from one application to the next.
Which markdown flavor supports the most extended syntax?
Pandoc supports the widest range, with more than 30 optional syntax extensions, and it parses all 12 elements on this page. GFM is the more practical target for web publishing, because GitHub, GitLab, and most modern editors follow it.
Why does a table render on GitHub but not in Discord?
Discord implements a narrow markdown subset built for chat and leaves out tables, footnotes, task lists, and definition lists. Its subset covers bold, italics, strikethrough, headings, and fenced code blocks. Content headed for Discord should stay within those 5 elements.
How do I test extended syntax before publishing?
Paste the element into the online editor's live preview, which renders GFM plus footnotes in under 1 second. For any other destination, paste a 2-line sample into the target app itself; the support matrix covers the 4 most common cases.
