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.
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
- A numbered item
- Another numbered item
inline code and a masked link
Event starts ()
A code block — **markdown** stays literal in here466 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
| Syntax | Result | Notes |
|---|---|---|
| **text** | Bold | Also combines: ***bold italic*** |
| *text* or _text_ | Italic | See the quirks below — they are not interchangeable |
| __text__ | Underline | Nest with italics: __*text*__ |
| ~~text~~ | Strikethrough | Works inline anywhere |
| ||text|| | Spoiler | Hidden until the reader clicks it |
| `code` | Inline code | Use ``double backticks`` to contain a backtick |
| ```lang``` | Code block | Multi-line; an ansi block colours text with escape codes — make them with the colored text generator |
| > text | Quote | >>> quotes every following line |
| # / ## / ### text | Heading 1–3 | Must start the line |
| -# text | Subtext | Small, muted line — good for captions and footnotes |
| - text or 1. text | Bullet / numbered list | Indent two spaces for a nested level |
| [label](https://…) | Masked link | Supported 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.
| Token | Renders as | Where the ID comes from |
|---|---|---|
| <@user_id> | @user mention | Copy ID with Developer Mode enabled |
| <@&role_id> | @role mention | Server settings → Roles → Copy ID |
| <#channel_id> | #channel link | Right-click the channel → Copy ID |
| <:name:emoji_id> | Custom emoji | The bot/webhook needs no membership for unicode; custom emoji must resolve |
| <a:name:emoji_id> | Animated custom emoji | Same as custom emoji, with the a: prefix |
| <t:unix:style> | Dynamic timestamp | Shown 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 Guide | No 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 →