Why Discord's Markdown is deliberately small

In short
  • Discord renders a chat-sized subset: emphasis, spoilers, code, quotes, and on current clients headings, lists and subtext.
  • __text__ means underline here rather than bold, and ||text|| hides text behind a spoiler bar.
  • Image syntax, tables, footnotes, horizontal rules and raw HTML never render in a message.
  • Backticks are the fastest escape hatch when you want the symbol instead of the style.

A chat app, not a document tool

Discord keeps the parts of Markdown that make a fast-moving message easier to read. It drops everything that would let one person restructure a channel. There is no image syntax, no table, no footnote, no heading below level three and no raw HTML. What is left is a compact set of inline styles, code blocks, quotes and a few Discord-only extras.

Where Discord sits among Markdown apps

Most tools land on one side of a line. Obsidian keeps Markdown as a file you own, while Notion swallows the characters and stores blocks instead. Discord is its own case. Your asterisks are kept as typed, and editing a message brings them straight back, but that message is a row in Discord's database and the dialect is Discord's own. Treat it as a display language for chat, not as a document format.

Two habits you have to unlearn

In standard Markdown and in GitHub Flavored Markdown, __text__ means bold. On Discord it means underline. And ||text||, which means nothing at all in standard Markdown, is Discord's spoiler tag. If you are unsure which dialect a tool speaks, our page on choosing a Markdown flavor lays out the family tree.

Illustration of a chat message bubble where plain text symbols turn into bold, italic and hidden spoiler formatting

Inline formatting you can type in any message

These work in every text channel, in direct messages, in threads and in forum posts. Between them they cover most of what anyone needs.

**bold text**
*italic text*      (or _italic text_)
***bold italic***
__underlined text__
__*underlined italic*__
~~strikethrough~~
||hidden spoiler||
`inline code`

The rules that trip people up

Markers must hug the text. ** bold **, with spaces inside the asterisks, does nothing at all. That is the most common formatting failure on Discord, by a distance.

Markers also combine, so **__bold underline__** is legal. The pairs have to nest cleanly rather than overlap. Inline code is the loudest marker of the lot: anything inside single backticks shows literally, so `**not bold**` displays the asterisks. That makes backticks the quickest way to protect a whole phrase, a habit our code blocks guide goes into further.

Careful: Discord applies formatting when the message sends, not while you type. The safest place to test an awkward line is a direct message to yourself.

Spoilers

Double pipes hide text behind a grey block that reveals on click or tap. They work anywhere in a message, including inside a quote. Attachments have their own version, and there are two ways to trigger it:

  • Tick the spoiler box in the upload dialog before you send.
  • Rename the file so the name starts with SPOILER_.

Either way the image arrives blurred until someone taps it. Reddit offers the same idea with completely different characters, which the Reddit formatting guide sets out.

Code blocks and syntax highlighting

A fenced code block is three backticks, an optional language name, a newline, your code, and three closing backticks. On Discord the closing fence must sit on its own line. Press Shift+Enter for a newline that does not send the message.

```python
def greet(name):
    return f"Hello, {name}"
```

Which language tags work

Discord colours code with a general-purpose highlighting library, so the tag list is long and forgiving. Reliable, frequently used identifiers include js, ts, python (or py), java, cs, cpp, c, go, rust, ruby, php, swift, kotlin, sql, json, yaml, xml, html, css, bash, sh, powershell, lua, r and md. An unknown tag is not an error. The block simply renders without colours.

Two tricks worth knowing

Tag a block diff and you get red and green lines for free, because lines starting with - and + are styled as removals and additions. It is the standard way to post a before-and-after, or a colour-coded list.

```diff
+ this line is green
- this line is red
```

There is also an ansi tag that reads terminal colour codes, so you can tint arbitrary text. It renders on desktop, on web and on recent mobile builds, and falls back to plain text elsewhere. Treat it as decoration, never as meaning.

Tip: A message caps at 2,000 characters, backticks included. Anything longer belongs in an attached file, which keeps the indentation intact and gives readers something they can download.

Quotes, headings, lists and masked links

A single > plus a space quotes one line. Three of them, >>>, quote everything to the end of the message, which is what you want when pasting someone else's paragraph. Quotes do not nest here: a second > inside a quote shows as a character, unlike the nesting our blockquotes guide describes.

> a single quoted line
back to normal text

>>> everything after this
stays inside the quote
including this line

Headings and lists

Headings and lists arrived in the text formatting update that reached clients during 2023, so they are recent. Only three heading levels exist, and the hashes need a space after them.

# Big heading
## Medium heading
### Small heading

- bullet item
  - nested item
1. numbered item
-# small subtext line

The -# subtext prefix is newer still and renders as small grey text. On an old or third-party client any of these can show up as the literal characters you typed. A message that has to look right for everybody should stick to bold and italics.

A masked link is [readable text](https://example.com). It was an embed-only feature for years, which is why older guides say users cannot use it. Current clients render it in ordinary messages too, with a confirmation dialog before an unfamiliar domain opens. The behaviour has changed more than once, so a bare URL is still safest when the link genuinely matters. Our links guide covers the standard form and its title attribute.

Discord Markdown support matrix

Every element below refers to an ordinary user message in a text channel. "Newer clients" means desktop, web and mobile as shipped since the 2023 formatting update.

FeatureSyntaxWorks?Notes
Bold**text**YesAlso inside embeds and quotes
Italic*text* or _text_YesBoth markers behave identically
Bold italic***text***YesThree asterisks each side
Underline__text__YesDiscord-only meaning; standard Markdown reads this as bold
Strikethrough~~text~~YesSame as GFM
Spoiler||text||YesDiscord extension; click or tap to reveal
Inline code`code`YesSuppresses all other formatting inside
Fenced code blockthree backticksYesLanguage tag enables syntax highlighting
Single-line quote> textYesSpace after the arrow is required
Multi-line quote>>> textYesQuotes the rest of the message; no nesting
Headings#, ##, ###Newer clientsThree levels only; space after the hashes
Bulleted list- itemNewer clientsIndent two spaces to nest
Numbered list1. itemNewer clientsNumbering is re-sequenced for you
Subtext-# textNewest clientsSmall grey line; added after headings and lists
Masked link[text](url)MostlyAlways worked in bot embeds; now in messages too, with a click-through warning
Image by syntax![alt](url)NoUpload the file, or paste a bare image URL and let Discord unfurl it
Tablepipes and dashesNoRenders as literal pipe characters
Footnote[^1]NoShown as plain text
Horizontal rule---NoThree dashes stay three dashes
Raw HTML<b>text</b>NoEscaped and displayed as characters

What breaks, and what to do instead

Images and tables: use the workaround

Neither gap has a syntax fix, so go straight to the substitute. For an image, upload the file or paste the bare URL, because Discord unfurls most direct image links by itself. For a table, use a fenced code block with hand-aligned columns, which keeps a monospace grid, or post a screenshot.

```
Region     Q1     Q2
APAC       412    503
EMEA       288    301
```

If the data genuinely has to be a table, build it somewhere that renders one and post the link. Our Markdown tables guide explains the header row and the alignment row for the platforms that do support them.

Escaping: when you want the symbol, not the style

Put a backslash in front of a formatting character and Discord prints it literally. This matters more than it sounds, because file globs, maths and emoticons are full of asterisks and underscores.

\*literal asterisks\*      shows *literal asterisks*
2 \* 3 \* 4              shows 2 * 3 * 4
snake\_case\_name         keeps both underscores

The characters worth escaping are a short list:

  • * and _, behind almost every accidental italic.
  • ~, which strikes text through in pairs.
  • |, which becomes a spoiler in pairs.
  • > at the start of a line, which becomes a quote.
  • # and - at the start of a line, now that headings and lists exist.

For anything longer than a couple of characters, backticks beat counting backslashes. The same reflex helps in other tools, and the platform hub shows which of them share the habit.

Bots, embeds and the desktop versus mobile difference

What a bot can send that you cannot type

Everything above describes a human typing into the message box. Bots and webhooks can also send embeds: structured cards with a coloured border, a title that can carry a link, a description, up to twenty-five fields, image slots, a footer and a timestamp. That is how bots produce boxed output nobody can reproduce by hand.

Markdown support inside an embed is uneven, so it pays to know the parts:

  • Descriptions and field values render the full message syntax, masked links and code blocks included.
  • Field names accept basic emphasis but are not a place for links.
  • Author names and footer text stay plain text on most clients.
  • Limits are 4,096 characters of description and 6,000 across the whole embed.

Desktop, web and mobile

The core syntax renders the same on all three. The differences sit at the edges. Highlighting inside code blocks reached mobile later and still looks plainer, long lines scroll sideways instead of wrapping, and colour tricks such as ansi fail first on older phone builds.

Careful: Mobile keyboards are a hazard of their own. Smart punctuation swaps straight quotes for curly ones, which breaks the code you pasted rather than the Markdown around it.

Discord is not the only chat dialect with house rules. Markdown on Reddit sits much closer to the original spec and is worth comparing side by side, while Obsidian shows what the same syntax looks like when an app stores it as a file.

For the full standard rather than a subset, keep the complete Markdown guide open, and the printable syntax sheet next to it for the symbols you use daily.

Support data verified

Frequently Asked Questions

Does Discord support all Markdown?

No. Discord supports a chat-sized subset: bold, italic, underline, strikethrough, spoilers, inline code, fenced code blocks, quotes, and - On newer clients - Headings, lists and subtext. Images by Markdown syntax, tables, footnotes, horizontal rules and raw HTML render as literal characters.

How do I make a code block in Discord?

Type three backticks, a language name such as python, press Shift+Enter, paste your code, then close with three more backticks on their own line. The language tag is what turns on syntax highlighting. For one word inside a sentence, single backticks are enough.

Why is my bold text not working on Discord?

Almost always a space between the asterisks and the word: ** text ** does nothing, **text** works. The other causes are a leftover escaping backslash, or the phrase sitting inside backticks, which deliberately disables formatting.

How do I stop Discord formatting my text?

Put a backslash before the character, as in \*asterisk\*, or wrap the whole passage in backticks. Backticks are easier for long strings such as file paths and regular expressions.

Can I post a table in Discord?

Not with Markdown table syntax - The pipes render as pipes. Use a fenced code block with columns aligned by hand, which keeps a monospace grid, or a screenshot. Bots can fake a table with embed fields, which display in columns.

Keep learning

Try the Editor

Try the Editor