Headings
# HeadingA heading is a line that starts with one to six hash signs and a space.
Markdown is not one language. The same file is a document on GitHub, a wall of asterisks in Slack and something in between everywhere else. This is the whole of that, in one table.
Every cell comes from the platform’s own documentation, read in August 2026 and listed at the foot of the page. Where a vendor does not say, this says so rather than guessing: half the value of a table like this is that it does not bluff.
Of the 27 constructs below, 2 work identically everywhere. That is the safe subset, and it is smaller than most people assume.
| Construct | GitHub | GitLab | Obsidian | VS Code | Notion | Discord | Slack |
|---|---|---|---|---|---|---|---|
| Bold**bold** | Supported | Supported | Supported | Supported | Supported | Supported | Works differentlyOne asterisk: *bold*. Two show as literal asterisks. |
| Italic*italic* | Supported | Supported | Supported | Supported | Supported | Supported | Works differentlyUnderscores only: _italic_. |
| Strikethrough~~struck~~ | Supported | Supported | Supported | Supported | Works differentlyOne tilde: ~struck~. | Supported | Works differentlyOne tilde: ~struck~. |
| Underline<ins>text</ins> | Works differentlyOnly as HTML: <ins>text</ins>. | Works differentlyOnly as HTML, which GitLab sanitises but allows. | Not supported | Not supported | Not supported | Works differently__text__, which is bold everywhere else. The single most confusing difference in this table. | Not supported |
| Highlight==highlighted== | Not supported | Not supported | Supported | Not supported | Not supported | Not supported | Not supported |
| Headings# Heading | Supported | Supported | Supported | Supported | Works differentlyThree levels only. A fourth hash is text. | Works differentlyThree levels only, and a hash with no space after it is a channel mention. | Not supported |
| Blockquote> quoted | Supported | Supported | Supported | Supported | Works differently> makes a toggle list. A quote is a double quote and a space. | Works differently> for one line, >>> for everything after it. | Supported |
| Line breaktwo trailing spaces | Supported | Supported | Not documented | Supported | Works differentlyThere is no syntax. Pressing Enter breaks the line. | Works differentlyThere is no syntax. Shift and Enter breaks the line; Enter sends the message. | Works differentlyThere is no syntax. Shift and Enter breaks the line; Enter sends the message. |
| Bulleted list- item | Supported | Supported | Supported | Supported | Supported | Supported | Works differentlySlack documents no list syntax. Typing - and a space makes the composer build one, but the message is not markdown. |
| Numbered list- item | Supported | Supported | Supported | Supported | Supported | Supported | Works differentlySame as bulleted: the composer builds it, the syntax is not documented. |
| Task list- [ ] to do | Supported | Works differentlyAlso - [~] for an inapplicable item, which is GitLab's own. | Supported | Supported | Works differentlyType [] and it becomes a to-do block, not a markdown checkbox. | Not supported | Not supported |
| Inline code`code` or ``` | Supported | Supported | Supported | Supported | Supported | Supported | Supported |
| Code block`code` or ``` | Supported | Supported | Supported | Supported | Supported | Supported | Supported |
| Syntax highlighting`code` or ``` | Supported | Supported | Supported | Supported | Supported | Supported | Works differentlyThe language is accepted and ignored. Slack does not highlight. |
| Table| a | b | | Supported | Supported | Supported | Supported | Not supported | Not supported | Not supported |
| Link[text](url) | Supported | Supported | Works differentlyAlso [[Note name]] for a link to another note, which is Obsidian's own. | Supported | Supported | Supported | Works differentlyAngle brackets and a pipe: <https://example.com|text>. |
| Link to a heading[text](#a-heading) | Supported | Supported | Works differentlyAlso [[Note#Heading]], which links to a heading in another note. | Supported | Not supported | Not supported | Not supported |
| Image | Supported | Supported | Works differentlyAlso takes a size: ![[photo.png|300]]. | Supported | Not supported | Not supported | Not supported |
| Footnotes[^1] | Supported | Supported | Supported | Not documented | Not supported | Not supported | Not supported |
| Math$x^2$ | Works differently$...$ and $$...$$, and also $ ... $ and a ``` `math ``` fence. Rendered with MathJax. | Supported | Supported | Supported | Not documented | Not supported | Not supported |
| Mermaid diagrams```mermaid | Supported | Supported | Supported | Supported | Supported | Not supported | Not supported |
| Hidden comment<!-- hidden --> | Supported | Supported | Works differentlyAlso %% its own comment syntax %%. | Supported | Not supported | Not supported | Not supported |
| Callouts> quoted | Supported | Supported | Works differentlyIts own form: > [!note] with a title on the same line. | Not documented | Not supported | Not supported | Not supported |
| Front matter--- ... --- | Not documented | Works differentlyYAML, TOML or JSON, and GitLab hides it rather than rendering it. | Supported | Not documented | Not supported | Not supported | Not supported |
| Horizontal rule--- | Supported | Supported | Supported | Supported | Supported | Not documented | Not documented |
| Escaping\*literal\* | Supported | Supported | Not documented | Supported | Not documented | Not documented | Not documented |
| Spoiler||hidden|| | Not supported | Not supported | Not supported | Not supported | Not supported | Supported | Not supported |
A differs cell is the dangerous one, because the file still renders. It just renders as something else. __text__ is bold on GitHub and underline on Discord, so a document moved between them changes meaning without changing a character. Those are the cells worth reading before you paste.
A no cell is safer, because it is visible: the syntax arrives as its own punctuation and you can see at a glance that something went wrong. The usual answers are a code block for a table, bold on its own line for a heading, and an upload for an image.
The two chat platforms are the outliers, and they are outliers in opposite directions. Slack’s own documentation says mrkdwn is “inspired by markdown, but uses different rules”, which is why a pasted README falls apart there. Discord is much closer to standard markdown and then adds things nobody else has.
The syntax itself, so the page answers the common case without a click. Each one has a page of its own with the mistakes that catch people and the platforms that disagree.
# HeadingA heading is a line that starts with one to six hash signs and a space.
two trailing spacesPressing Enter once does nothing visible: markdown joins the two lines into one paragraph.
first line
second line
\*literal\*Put a backslash in front of a markdown character to show it rather than act on it.
*not italic*
# not a heading
2 * 3 * 4
<!-- hidden -->Markdown has no comment syntax.
--- ... ---Front matter is metadata at the very top of a markdown file, fenced by three dashes above and below.
**bold**Wrap text in two asterisks to make it bold.
bold text
also bold
*italic*One asterisk either side gives italic text.
italic text
also italic
~~struck~~Two tildes either side of the text draw a line through it.
struck through
<ins>text</ins>There is no markdown syntax for underlining, and that is deliberate.
underlined text
- itemA dash and a space makes a bullet.
- [ ] to doA task list is a bulleted list where each item starts with a pair of brackets.
`code` or ```One backtick either side gives inline code.
Run npm install first.
> quotedStart a line with a greater-than sign and a space to quote it.
Nothing here is uploaded. Check your network tab.
Three or more dashes on a line of their own draw a horizontal rule.
```mermaidMermaid turns a few lines of text into a flowchart, a sequence diagram or a Gantt chart.
$x^2$Markdown has no maths of its own.
The area of a circle is , which follows from the integral.
[^1]A footnote is a marker in the text and a definition somewhere else in the file.
[text](url)A link is the text in square brackets followed immediately by the URL in round brackets.
[text](#a-heading)There is no special syntax for an internal link.
See the installation steps below.
An image is written like a link with an exclamation mark in front of it.
| a | b |A table is rows of cells separated by pipes, with a line of dashes under the header row.
| Element | Support |
|---|---|
| Tables | GitHub-flavoured |
| Task lists | Yes |
__underline__Discord uses its own dialect of markdown.
bold
italic
underline
strikethrough
bold italic
inline code
a quote
*bold*Slack calls its formatting mrkdwn, and the name is the warning.
bold
italic
strikethrough
inline code
a quote
a code block
Double-clicking a .md file opens a text editor full of raw symbols, and the space bar in Finder shows you the same. The Mac app fixes both: it registers as the handler for markdown and adds a Quick Look extension, so the rendered document is one space bar away.
For Mac.
Read in August 2026. If one of these disagrees with the table above, it is right and this page is out of date.