Paste a Markdown Note Into Slack, Teams, or Telegram and Your Italics Turn Bold
Your note is correct. The chat app is not reading it the way you wrote it.
Paste *meeting agenda* into Slack and it comes out meeting agenda — bold, not italic. Paste __due Friday__ into Discord and it appears underlined; paste the same string into Telegram's bot API and it renders as underline there too, while the Telegram desktop app would interpret it as italic. The formatting tokens you used are standard Markdown. The rendering engines that received them are not. Each chat app ships its own dialect, and those dialects collide in ways that are non-obvious until a message goes wrong in front of your team.
Eight Stack Overflow questions on this exact axis — why Markdown looks wrong in Slack, Teams, Telegram, and Discord — have accumulated 881,571 views.1 That is not a niche confusion. It is a persistent, recurring pain for anyone who writes in one place and communicates in another.
This reference map shows what happens to every common Markdown token across four platforms, with escape rules, the portable subset, and the two dialects inside both Slack and Telegram that most guides collapse into one.
Why the Same Token Renders Differently in Every App
Each chat app built its formatting parser before CommonMark — the standard Markdown specification — was widely ratified. John Gruber's original spec, cited in CommonMark 0.31.2, stated that "text wrapped with one * or _ will be wrapped with an HTML <em> tag; double *'s or _'s will be wrapped with an HTML <strong> tag."2 The chat apps made different choices before that existed, and changing them now would break every message that relied on the old behavior.
Slack's developer documentation describes its own format, mrkdwn, as: "It is inspired by markdown, but uses different rules."3 Teams was similarly candid: "Teams uses a Markdown-style syntax. While we refer to it as 'Markdown,' it doesn't fully match standard Markdown, and some formatting may behave differently."4 These are vendor acknowledgments, not bugs — the dialects are deliberate.
The result: your note's tokens carry different semantic weight depending on which parser receives them. *x* means italic in a CommonMark renderer, bold in Slack's default surface, bold in Teams, and bold in Telegram's bot API. No parser is wrong within its own specification. They simply do not agree on what the tokens mean.
A parser receipt confirms the collision. Running 11 common chat-app syntax forms through a standard CommonMark engine (markdown-it-py 3.0.0) finds that 4 of 11 render as literal text rather than markup — meaning the tokens a Slack user types as formatting are invisible to any renderer that follows the standard.5
The Dialect Map: Every Token Across Four Platforms
This table covers the tokens most likely to appear in a standard Markdown note. "Your note (CommonMark)" shows what a standard renderer produces. The chat-app columns show what that same string of characters actually produces when pasted.
| Syntax | Your note (CommonMark) | Slack (mrkdwn, opt-in) | Teams | Telegram Bot API MarkdownV2 | Telegram app (parseMarkdown) | Discord |
|---|---|---|---|---|---|---|
*x* | italic | bold | bold | bold | literal * | italic |
_x_ | italic | italic | italic | italic | italic | italic |
**x** | bold | literal ** | literal ** | literal ** | bold | bold |
__x__ | bold | literal __ | literal __ | underline | italic | underline6 |
~~x~~ | literal ~~ | literal ~~ | ||||
~x~ | literal ~ | literal ~ | literal ~ | |||
[t](url) | link | literal | link | link | link | link (masked) |
<url|text> | literal | Slack API link | literal | literal | literal | literal |
||x|| | literal | literal | literal | spoiler | spoiler | spoiler |
`code` | inline code | inline code | inline code | inline code | inline code | inline code |
``` | code fence | code fence | code fence | code fence | code fence | code fence |
Reading the table: a "literal" cell means the delimiter characters appear in the message unchanged — users see the asterisks, underscores, or tildes as text, not formatting. Code and code fences are the safest portable tokens: every platform here renders them consistently.
The single most common collision: *italic* from your note becomes bold in Slack, Teams, and Telegram bots. An earlier overview of chat-app formatting7 noted that *italic* reads as italic in most apps — which holds for Discord and the Telegram desktop app, but not for Slack, Teams, or the Telegram bot API. The dialect map shows the full picture.
Inside the Dialects: Slack Runs Two Parsers, Telegram Runs Two Parsers
Most guides treat each app as a single system. Both Slack and Telegram actually ship two distinct formatting dialects — and confusing them explains many edge cases in the table above.
Slack: mrkdwn vs. Block Kit markdown block
The Slack surface a person types into uses mrkdwn — *bold*, _italic_, ~strike~, and <url|text> for links. When you paste from a Markdown note, the standard tokens (**bold**, *italic*) either miss the mrkdwn pattern or produce unintended results.
Slack also ships a separate surface: the Block Kit markdown block. This block uses standard Markdown (**bold**, *italic*) and was designed, in Slack's words, for "markdown response from an LLM that can get lost in translation rendering in Slack."8 The character limit is 12,000 characters per block.9 If you are sending LLM-generated Markdown programmatically, the Block Kit markdown block is the correct surface — it reads standard tokens correctly.
For human paste into the standard Slack composer: the default is a toolbar — no Markdown at all. An opt-in markup mode does accept mrkdwn characters, but copying and pasting strips markup per Slack's own documentation: "Messages that you copy and paste will appear in plain text."10 In practice, most human paste scenarios in Slack produce plain text, not scrambled formatting — the scrambled-formatting failure is more common in bot or API contexts.
Telegram: Bot API MarkdownV2 vs. the desktop app
The Telegram column in most references describes the Bot API MarkdownV2, which bots use when sending formatted messages. Its tokens: *bold*, _italic_, __underline__, ~strikethrough~, ||spoiler||. The Bot API also ships an older "Markdown" mode described in Telegram's documentation as "a legacy mode, retained for backward compatibility."11
The Telegram Desktop app and TDLib — the library that powers it — use an entirely different set: **bold**, __italic__, ~~strikethrough~~, with a note in the source code that "kTagUnderline is not used for Markdown."12 TDLib's parseMarkdown function handles this internally, described as parsing "Markdown entities in a human-friendly format, ignoring markup characters that are not part of Markdown entities."13
The key collision for pasted notes: your __word__ turns italic in the Telegram desktop app (matching the __italic__ pattern), while the same string becomes underline via the Bot API MarkdownV2. Your *word* appears as literal asterisks in the app, while it renders bold via the bot API. The two parsers are not compatible with each other.
The Escape Rules: Telegram MarkdownV2 Is the Hardest
If you generate text for Telegram's bot API, MarkdownV2 has a reservation rule that surprises developers coming from CommonMark. Telegram Bot API version 10.3 specifies that MarkdownV2 reserves 18 characters — _, *, [, ], (, ), ~, `, >, #, +, -, =, |, {, }, ., ! — that must be \-escaped outside entity markers.13
A note containing a URL with parentheses, a bulleted list (hyphens), or a sentence ending in a period can trigger unexpected formatting or an API error when sent through the bot API. CommonMark does not reserve these characters for escaping; standard Markdown notes will almost always contain several of them unescaped.
For the Telegram desktop app, you do not type MarkdownV2 — the formatting toolbar handles that. The escape rule applies only to bot API usage.
The Portable Subset
If you want text to reach Slack, Teams, Telegram, and Discord intact — without conditional formatting — use only these tokens:
- Inline code:
`code`— renders correctly everywhere. - Code fences:
```— renders correctly everywhere. _italic_: renders italic in Slack (opt-in), Teams, Telegram bot API, Telegram app, and Discord. The one safe italics token.- Plain URL: paste a bare URL — every platform auto-links it.
- Blank line between paragraphs: survives all five parsers as a structural break.
Avoid *x*, **x**, __x__, ~~x~~, ~x~, ||x||, and <url|text> if you need the text to read identically everywhere. Those tokens produce different output — or literal characters — on at least one platform in this table.
LLM Output and the Standard Markdown Problem
A second case where this map matters: LLM output. When an AI assistant writes a formatted response, it defaults to CommonMark — **bold**, *italic*, ## Heading. That output pastes cleanly into a note app that follows the standard. It does not paste cleanly into Slack's default composer or into Telegram's bot API.
Slack recognized the problem explicitly in its Block Kit markdown block documentation, designing a surface specifically for LLM-generated Markdown that would otherwise get "lost in translation."8 The practical implication for tooling: if you are building a workflow that takes LLM output and routes it to chat, check which Slack or Telegram surface you are targeting before the formatting ships.
FAQ
Why do my asterisks disappear when I paste into Slack?
Slack's default composer is a toolbar — it does not parse Markdown characters on paste. Text arrives as plain text. The opt-in markup mode does parse mrkdwn characters, but **bold** (standard Markdown) is not a mrkdwn pattern and appears as literal characters.
Why does *word* become bold in Slack instead of italic?
Slack's mrkdwn dialect maps *text* to bold. Standard Markdown and Discord map it to italic. This is the core dialect collision — the token means different things to different parsers.
How do I make italic text in Slack?
Use _text_. This renders italic consistently across Slack (opt-in), Teams, Telegram bot API, Telegram app, and Discord. It is the safest italics token across all platforms.
Why does Telegram have two different formatting systems?
Telegram ships two dialects. The bot API uses MarkdownV2 (*bold*, __underline__). The Telegram Desktop app and TDLib use a different parser where **bold** and __italic__ apply. For bot API usage, escape all 18 reserved MarkdownV2 characters. For the app, use the toolbar or the **/__ patterns.
Does Discord support standard Markdown?
Discord is the closest to CommonMark among the four platforms here. *italic*, **bold**, and ~~strike~~ all match the standard. The one consistent divergence: __underline__ renders as underline rather than bold — a Discord extension.6
Can I paste a Markdown note into Microsoft Teams?
Teams accepts its own dialect: *bold text*, _italic text_, ~strikethrough~, and [Text](URL). Standard Markdown tokens like **bold** or GFM tables appear as literal characters in Teams.
What is the safest formatting for text that will go to multiple platforms?
Inline code (`) and code fences work everywhere in this table. _italic_ works across all five surfaces. For bold, there is no portable token that works consistently across Slack, Teams, Telegram, and Discord.
What about WhatsApp formatting? WhatsApp's formatting documentation is not accessible from a verifiable, non-login-walled source. It is excluded from this map rather than speculated.
The note-writing problem the table describes — writing in one place, communicating in another — is structural, not accidental. Each chat platform built its parser before CommonMark existed, and each has millions of messages that depend on its current behavior. No platform is likely to change its default dialect. The portable subset is small, the escape rules are strict, and the two-dialect situation inside both Slack and Telegram is not going away.
Your note is standard. The receiving apps are dialects.
Knowing which tokens survive which parser is the kind of reference that belongs in a note — somewhere you can find it the next time formatting breaks in a message you thought was correct.
mnmnote.com stores notes in standard Markdown, so the file you keep the reference in reads the same way every time you open it.
References
Footnotes
-
Stack Overflow API v2.3, 8 questions (IDs: 36294962; 55816333; 50770235; 52495614; 40626896; 330391; 55014770; 52637567). 881,571 total views, re-measured 2026-11-05. https://api.stackexchange.com/2.3/questions/50770235;52495614;40626896;36294962;55816333;55014770;52637567;330391?site=stackoverflow ↩
-
CommonMark Spec 0.31.2, §6.2 Emphasis and strong emphasis, citing John Gruber. https://spec.commonmark.org/0.31.2/#emphasis-and-strong-emphasis ↩
-
Slack Platform Docs, "Formatting message text." https://docs.slack.dev/messaging/formatting-message-text ↩
-
Microsoft Support, "Use Markdown formatting in Microsoft Teams." https://support.microsoft.com/en-us/teams/chat/use-markdown-formatting-in-microsoft-teams ↩
-
Own parser receipt, markdown-it-py 3.0.0 CommonMark preset, 2026-11-05. 11 chat-app syntax forms tested; 4 of 11 render as literal text. ↩
-
Discord Help Center, "Markdown Text 101," article 210298617. https://support.discord.com/api/v2/help_center/en-us/articles/210298617.json. Discord
__underline__behavior also documented in MNMNOTE post #531. ↩ ↩2 -
Slack Block Kit Reference, Markdown block. https://docs.slack.dev/reference/block-kit/blocks/markdown-block ↩
-
Slack Block Kit Reference, Markdown block, character limit. https://docs.slack.dev/reference/block-kit/blocks/markdown-block ↩ ↩2
-
Slack Help Center, "Format your messages in Slack with markup," article 360039953113. https://slack.com/help/articles/360039953113-Format-your-messages-in-Slack-with-markup ↩
-
Telegram Bot API 10.3, §Formatting options. https://core.telegram.org/bots/api#formatting-options ↩
-
Telegram Desktop /
desktop-app/lib_ui,ui/widgets/fields/input_field.cppl.1626, pinned commitc3f7343. https://github.com/desktop-app/lib_ui/blob/c3f7343fdf16d212fcb31962bf267970481e00fc/ui/widgets/fields/input_field.cpp#L1626 ↩ -
TDLib
td/generate/scheme/td_api.tll.13834, pinned commit4c6377a. https://github.com/tdlib/td/blob/4c6377aa7386c39217878a9a56d581922ad37ca4/td/generate/scheme/td_api.tl#L13834 ↩ -
Telegram Bot API 10.3, §Formatting options, MarkdownV2 style: 18 reserved characters. https://core.telegram.org/bots/api#formatting-options ↩ ↩2