NanoFile
Menu

Which markdown works where

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.

SupportedNot supportedWorks differentlyNot documented
Markdown constructs and whether each platform supports them
ConstructGitHubGitLabObsidianVS CodeNotionDiscordSlack
Bold**bold**SupportedSupportedSupportedSupportedSupportedSupportedWorks differentlyOne asterisk: *bold*. Two show as literal asterisks.
Italic*italic*SupportedSupportedSupportedSupportedSupportedSupportedWorks differentlyUnderscores only: _italic_.
Strikethrough~~struck~~SupportedSupportedSupportedSupportedWorks differentlyOne tilde: ~struck~.SupportedWorks differentlyOne tilde: ~struck~.
Underline<ins>text</ins>Works differentlyOnly as HTML: <ins>text</ins>.Works differentlyOnly as HTML, which GitLab sanitises but allows.Not supportedNot supportedNot supportedWorks differently__text__, which is bold everywhere else. The single most confusing difference in this table.Not supported
Highlight==highlighted==Not supportedNot supportedSupportedNot supportedNot supportedNot supportedNot supported
Headings# HeadingSupportedSupportedSupportedSupportedWorks 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> quotedSupportedSupportedSupportedSupportedWorks 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 spacesSupportedSupportedNot documentedSupportedWorks 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- itemSupportedSupportedSupportedSupportedSupportedSupportedWorks differentlySlack documents no list syntax. Typing - and a space makes the composer build one, but the message is not markdown.
Numbered list- itemSupportedSupportedSupportedSupportedSupportedSupportedWorks differentlySame as bulleted: the composer builds it, the syntax is not documented.
Task list- [ ] to doSupportedWorks differentlyAlso - [~] for an inapplicable item, which is GitLab's own.SupportedSupportedWorks differentlyType [] and it becomes a to-do block, not a markdown checkbox.Not supportedNot supported
Inline code`code` or ```SupportedSupportedSupportedSupportedSupportedSupportedSupported
Code block`code` or ```SupportedSupportedSupportedSupportedSupportedSupportedSupported
Syntax highlighting`code` or ```SupportedSupportedSupportedSupportedSupportedSupportedWorks differentlyThe language is accepted and ignored. Slack does not highlight.
Table| a | b |SupportedSupportedSupportedSupportedNot supportedNot supportedNot supported
Link[text](url)SupportedSupportedWorks differentlyAlso [[Note name]] for a link to another note, which is Obsidian's own.SupportedSupportedSupportedWorks differentlyAngle brackets and a pipe: <https://example.com|text>.
Link to a heading[text](#a-heading)SupportedSupportedWorks differentlyAlso [[Note#Heading]], which links to a heading in another note.SupportedNot supportedNot supportedNot supported
Image![alt](url)SupportedSupportedWorks differentlyAlso takes a size: ![[photo.png|300]].SupportedNot supportedNot supportedNot supported
Footnotes[^1]SupportedSupportedSupportedNot documentedNot supportedNot supportedNot supported
Math$x^2$Works differently$...$ and $$...$$, and also $ ... $ and a ``` `math ``` fence. Rendered with MathJax.SupportedSupportedSupportedNot documentedNot supportedNot supported
Mermaid diagrams```mermaidSupportedSupportedSupportedSupportedSupportedNot supportedNot supported
Hidden comment<!-- hidden -->SupportedSupportedWorks differentlyAlso %% its own comment syntax %%.SupportedNot supportedNot supportedNot supported
Callouts> quotedSupportedSupportedWorks differentlyIts own form: > [!note] with a title on the same line.Not documentedNot supportedNot supportedNot supported
Front matter--- ... ---Not documentedWorks differentlyYAML, TOML or JSON, and GitLab hides it rather than rendering it.SupportedNot documentedNot supportedNot supportedNot supported
Horizontal rule---SupportedSupportedSupportedSupportedSupportedNot documentedNot documented
Escaping\*literal\*SupportedSupportedNot documentedSupportedNot documentedNot documentedNot documented
Spoiler||hidden||Not supportedNot supportedNot supportedNot supportedNot supportedSupportedNot supported

How to read a difference

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.

Every construct, and what it is for

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.

The basics

Headings

# Heading

A heading is a line that starts with one to six hash signs and a space.

Example

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
Heading 6

Line breaks

two trailing spaces

Pressing Enter once does nothing visible: markdown joins the two lines into one paragraph.

Example

first line
second line

Escaping

\*literal\*

Put a backslash in front of a markdown character to show it rather than act on it.

Example

*not italic*

# not a heading

2 * 3 * 4

Comments

<!-- hidden -->

Markdown has no comment syntax.

Example

Front matter

--- ... ---

Front matter is metadata at the very top of a markdown file, fenced by three dashes above and below.

Example

title: Opening .md files date: 2026-08-27 tags: - markdown - tools draft: false

The document starts here

Text formatting

Bold

**bold**

Wrap text in two asterisks to make it bold.

Example

bold text

also bold

Italics

*italic*

One asterisk either side gives italic text.

Example

italic text

also italic

Strikethrough

~~struck~~

Two tildes either side of the text draw a line through it.

Example

struck through

Underline

<ins>text</ins>

There is no markdown syntax for underlining, and that is deliberate.

Example

underlined text

Lists

Lists

- item

A dash and a space makes a bullet.

Example
  • first
  • second
  • third

Checkboxes

- [ ] to do

A task list is a bulleted list where each item starts with a pair of brackets.

Example
  • not done yet
  • done
  • also done

Blocks

Code

`code` or ```

One backtick either side gives inline code.

Example

Run npm install first.

Blockquotes

> quoted

Start a line with a greater-than sign and a space to quote it.

Example

Nothing here is uploaded. Check your network tab.

Three or more dashes on a line of their own draw a horizontal rule.

Example



Mermaid

```mermaid

Mermaid turns a few lines of text into a flowchart, a sequence diagram or a Gantt chart.

Example

Math

$x^2$

Markdown has no maths of its own.

Example

The area of a circle is A=πr2A = \pi r^2, which follows from the integral.

A footnote is a marker in the text and a definition somewhere else in the file.

Example

Markdown was designed in 2004.1

Footnotes

  1. By John Gruber, with Aaron Swartz on the syntax. ↩

Links and images

Links

[text](url)

A link is the text in square brackets followed immediately by the URL in round brackets.

Example

Internal links

[text](#a-heading)

There is no special syntax for an internal link.

Example

See the installation steps below.

Installation steps

Images

![alt](url)

An image is written like a link with an exclamation mark in front of it.

Example

A blue heron in flight

Tables

Tables

| a | b |

A table is rows of cells separated by pipes, with a line of dashes under the header row.

Example
Element Support
Tables GitHub-flavoured
Task lists Yes

Platform differences

Discord

__underline__

Discord uses its own dialect of markdown.

Example

bold italic underline strikethrough bold italic inline code

a quote

Heading 1

Heading 2

Heading 3

  • a bullet
  1. a numbered item a link

Slack

*bold*

Slack calls its formatting mrkdwn, and the name is the warning.

Example

bold italic strikethrough inline code

a quote

  • a bullet
  1. a numbered item
a code block

On a Mac, this should not need a browser

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.