DWEEB
Reference · Markdown & formatting

Discord Text Formatting: Markdown Guide and Live Preview

Discord's markdown looks familiar but behaves like no other dialect: italics care about spaces, ordered lists silently merge into bullet lists, and links trim their own punctuation. Try any message in the live preview below, then use the reference after it for the full syntax and the edge cases DWEEB's preview parser is tested against real Discord clients for.

Live Discord markdown preview

Type or paste a message on the left and see how Discord formats it on the right — headers, subtext, lists, spoilers, code blocks, masked links and timestamps included. It uses the same parser as DWEEB's message preview, which is tested against the live Discord client.

How Discord shows it
Big header
Medium header
Small header

bold, italic, underline, strikethrough and a spoiler
bold italic and underlined italic

Subtext: small, muted footnote text

A quote block

  • A bullet point
    • A nested bullet

  1. A numbered item
  2. Another numbered item

inline code and a masked link
Event starts ()

A code block — **markdown** stays literal in here
Open in DWEEB

466 characters · a normal message allows 2,000 (4,000 with Nitro); a webhook's Components V2 message allows 4,000 across all its text.

The complete formatting cheat sheet

The complete formatting cheat sheet
SyntaxResultNotes
**text**BoldAlso combines: ***bold italic***
*text* or _text_ItalicSee the quirks below — they are not interchangeable
__text__UnderlineNest with italics: __*text*__
~~text~~StrikethroughWorks inline anywhere
||text||SpoilerHidden until the reader clicks it
`code`Inline codeUse ``double backticks`` to contain a backtick
```lang```Code blockMulti-line; an ansi block colours text with escape codes — make them with the colored text generator
> textQuote>>> quotes every following line
# / ## / ### textHeading 1–3Must start the line
-# textSubtextSmall, muted line — good for captions and footnotes
- text or 1. textBullet / numbered listIndent two spaces for a nested level
[label](https://…)Masked linkSupported in regular chat, webhook text and embed descriptions

Quirks Discord actually enforces

These are the rules that make a message render differently in Discord than in a generic markdown previewer. DWEEB's preview parser has regression tests based on live Discord checks. The preview still has documented differences such as native emoji artwork, font fallbacks and no syntax highlighting beyond ansi colors; review the final message in its destination channel.

  • *italics* needs a non-space character right after the opening asterisk: `* text*` stays literal, which keeps math like 3 * 4 * 5 intact.
  • _underscore italics_ needs word boundaries — snake_case_names stay literal, while a space-padded _phrase_ formats.
  • Inline styles keep going across a line break: an unclosed **bold can format the next line.
  • Numbered items directly after a bullet list merge into that bullet list; separate them with a blank line to keep the numbers.
  • Bare URLs auto-link, but Discord drops trailing punctuation like .,:;"')] from the link.
  • In Components V2 text, unicode emoji render slightly enlarged but never as jumbo emoji — an emoji-only message does not blow up the way it does in normal chat.

Mentions, emoji and other tokens

A custom emoji whose ID does not resolve renders as plain :name: text, so test custom emoji in the destination server before a big announcement.

A mention's appearance and its notification are separate. Use allowed_mentions to control webhook pings, especially when importing text that contains user or role tokens.

Mentions, emoji and other tokens
TokenRenders asWhere the ID comes from
<@user_id>@user mentionCopy ID with Developer Mode enabled
<@&role_id>@role mentionServer settings → Roles → Copy ID
<#channel_id>#channel linkRight-click the channel → Copy ID
<:name:emoji_id>Custom emojiThe bot/webhook needs no membership for unicode; custom emoji must resolve
<a:name:emoji_id>Animated custom emojiSame as custom emoji, with the a: prefix
<t:unix:style>Dynamic timestampShown in each reader's own timezone — make one with the timestamp generator
<id:customize>, <id:browse>, <id:guide>Links to Channels & Roles, Browse Channels and the Server GuideNo ID needed; they lead somewhere only on a Community server with Onboarding

Where each rule works

Regular user chat supports masked links as well as the core styles. Webhook and bot messages can use the same link syntax in plain content and Components V2 Text Displays. Legacy embed descriptions and fields support many inline styles and masked links, but a legacy embed's title, footer and other named fields have their own rendering rules; do not assume every field is a full chat message.

Components V2 Text Displays are the most capable text surface: headings, subtext, lists, quotes, code, mentions and timestamps all render, and DWEEB counts every character against the message-wide budget as you type.

The classic use of all of this at once is a pinned rules post — a heading, bold rule names, a quote block for consequences and a subtext footer. The server rules templates are written in exactly that markdown and can be pasted as they are, and the copy-and-paste welcome messages use the same pieces plus channel links.

Escaping and plain text

Prefix a formatting character with a backslash to show it literally: \*not italic\*. For a block that must never format — a config sample, a token pattern, ASCII art — use a code block, which suppresses all markdown inside it.

Frequently asked questions

How do I make text bigger in Discord?

Start the line with # and a space for a large header, ## for a medium one or ### for a small one. Headers only work at the very start of a line, and the space after the hashes is required.

How do I make small text in Discord?

Start the line with -# and a space. Discord calls it subtext: a smaller, muted line that suits footnotes, captions and last-updated lines. Like headers, it only works at the start of a line.

Does Discord markdown support tables?

No. Discord has no table syntax, so pipes and dashes show up as plain characters. Line columns up inside a code block, where a monospace font keeps them aligned, or use one line per row with bold labels.

Can I write coloured text or math in Discord?

Ordinary text has no colour syntax, but a code block tagged ansi colours the text inside it with escape codes, which the colored text generator guide makes for you; a diff block also tints lines starting with + green and - red. The desktop and browser apps show the colours, while the phone apps have long shown plain code. There is no LaTeX: math stays plain text or goes in a code block.

Why is my Discord formatting not working?

The most common causes are a missing space after #, -# or a list marker, an asterisk followed by a space (Discord leaves * text* alone), underscores inside a word, and text sitting inside a code block, which shows everything literally. Paste the message into the preview above to see which rule it trips.

Does this preview match Discord exactly?

It uses the same parser as DWEEB's message preview, which has regression tests from live Discord checks. Fonts, emoji artwork and code colouring differ slightly, and user, role and channel mentions show placeholder names, so check an important message in its real channel.

Put the guide into practice

Open the exact workflow in DWEEB. Nothing posts until you review and confirm it.

Try the formatting live →

Primary sources

Keep learning