A Parser, Not a Font Setting
When Discord sends a message, it scans the content for a small set of delimiter characters and renders the text between them differently. The characters you typed are still there in the stored message; the app simply interprets them. That is why the same markup works for everyone without any setup, and why copying a formatted message into another app leaves the asterisks visible.
The parser runs on message content and a handful of profile text fields. It never runs on a display name, a nickname or a channel title. Those fields are plain strings, which is the gap that Unicode letter substitution fills.
Syntax Reference
| Result | Delimiters | Typical use |
|---|---|---|
| Bold | **text** | Stressing a word or key term |
| Italic | *text* or _text_ | A softer tone or a work title |
| Bold italic | ***text*** | Layering weight and slant |
| Underline | __text__ | Marking a passage; stacks with other delimiters |
| Strikethrough | ~~text~~ | Retractions and deadpan asides |
| Spoiler | ||text|| | Concealing a reveal behind a tap |
| Inline code | `text` | One-line snippets and CLI arguments |
| Code block | ```text``` | Aligned blocks, logs and text art |
| Quote | > text | A single quoted line |
| Multi-line quote | >>> text | A quote spanning the rest of the message |
| Headers | # / ## / ### text | Three levels of section heading |
| Subtext | -# text | Muted notes beneath a post |
| List | - item or 1. item | Bullet points or an ordered sequence |
| Masked link | [label](https://example.com) | A label that opens a URL |
Dates use a separate tag rather than a delimiter: <t:1793740800:R> renders as a live countdown adjusted to each reader’s clock. Build one with the Discord timestamp generator.
Line-Prefix Rules
Headers and subtext are the only constructs here that depend on position. One to three # characters followed by a space at the very start of a line produce the three header sizes; -# plus a space produces small, muted text. Both stop working if anything precedes them on the line, including a space. Headers give long rule posts and event announcements a legible structure; subtext suits footnotes, credits and editorial notes.
Colour Through ANSI Code Blocks
Ordinary messages have no colour control, but a fenced block tagged ansi is treated as terminal output and honours escape sequences. The tool above assembles one for you: choose a foreground, optionally a background, and any weight or underline options. The generated block looks like this, where each colour code begins with an invisible escape byte:
```ansi [ESC][0;34mYour blue text[ESC][0m ```
Desktop and browser clients render the colours; mobile clients currently show the same text in an unstyled code block. Never let colour be the only signal that distinguishes two pieces of information.
Fenced Blocks and Highlighting
Three backticks open a block that preserves whitespace exactly as typed, which makes it useful for aligned tables, logs and text art. A language identifier immediately after the opening fence — ```js, ```py, ```css — enables syntax highlighting for that language. A single backtick pair does the same job inline and, usefully, displays markup characters literally instead of letting the parser consume them.
Stacking and Suppressing Markup
Delimiters nest as long as they are balanced: __***text***__ combines underline, bold and italic, while ||**text**|| conceals bold text behind a spoiler. To show a delimiter rather than activate it, prefix a backslash — \*not italic\* — or wrap the fragment in inline code. Escaping is the cleanest fix when a literal asterisk or underscore keeps triggering unexpected formatting in the middle of a sentence.
Two Tools, Two Jobs
Markdown is presentation applied to unchanged characters. Substitution replaces the characters. The first is readable, accessible and searchable but confined to messages; the second travels with the text and is the only option for a name or a channel heading. Use the main converter for names, or open a focused family such as bold or cursive.
Habits That Keep Posts Readable
- Structure long posts with headers instead of emphasising every line.
- Wrap plot points, puzzle answers and sensitive details in spoiler delimiters.
- Treat colour as decoration, since a large share of readers are on mobile.
- Prefer markdown for information: assistive technology parses it far better than substituted letters.