Markdown to Slack mrkdwn: what changes and what's lost
Paste standard Markdown into a Slack message and you'll get literal asterisks where you wanted bold, and raw brackets where you wanted links. Slack uses its own markup โ officially called mrkdwn โ that looks like Markdown but disagrees with it on almost every detail. This guide covers the full translation.
Convert Markdown to mrkdwn now โ
The core differences
The trap is that the two formats use the same characters for different meanings. A single asterisk is italic in Markdown but bold in Slack; an underscore is italic in both, but Slack has no second bold syntax. Getting one character wrong flips the formatting rather than breaking it โ which is why hand-translating is so error-prone.
Syntax mapping
| Element | Markdown | Slack mrkdwn |
|---|---|---|
| Bold | **text** | *text* |
| Italic | *text* or _text_ | _text_ |
| Strikethrough | ~~text~~ | ~text~ |
| Inline code | `code` | `code` (same) |
| Code block | ``` fence | ``` (no language tag) |
| Link | [text](url) | <url|text> |
| Heading | # Title | none โ bold line by convention |
| Bullet list | - item | โข character by convention |
| Numbered list | 1. item | literal numbers, no auto-numbering |
| Blockquote | > quote | > quote (same) |
| Image |  | none โ attach or let the URL unfurl |
| Table | GFM pipe table | none |
Worked example
## Deploy status **Production** deploy of *v2.4.1* is done. - API: healthy - [Dashboard](https://grafana.example.com)
becomes:
Deploy status *Production* deploy of _v2.4.1_ is done. โข API: healthy โข <https://grafana.example.com|Dashboard>
What simply doesn't exist in mrkdwn
- Headings. There is no heading syntax in messages. The convention is a bold line, so Converticle turns
# H1into bold and strips the markers from lower levels. - Real lists. Slack doesn't auto-format
-into bullets in API messages; the bullet characterโขis a visual convention, not markup. Nesting is whitespace-only. - Tables and images. No syntax at all. Tables need a code block to keep their alignment; images have to be uploaded or posted as URLs that unfurl.
- Syntax highlighting. Code fences work, but the language tag after
```is ignored in messages.
Where mrkdwn applies (and where it doesn't)
mrkdwn is what the Slack API expects in the text field of chat.postMessage and in Block Kit section/context text objects marked "type": "mrkdwn" โ the main places you'd paste converted
output. Two caveats: the message composer in the Slack app has its own WYSIWYG
shortcuts that partially overlap with this syntax, and Slack Posts / canvases are a
different format entirely. If a bot, webhook, or workflow sends the message, mrkdwn
is the right target.
Formatting needs word boundaries
Slack only applies formatting when the markers sit at word boundaries: *bold* works, but compound*bold*word renders literally. Slack also doesn't reliably
render nested combinations like bold-inside-italic โ keep emphasis simple.
Escape the angle brackets
In mrkdwn, < and > delimit links, user mentions
(<@U123>), and channel references. If your text contains literal angle
brackets (HTML snippets, generics like List<String>), wrap them in code
spans or escape them as </>, or Slack will try to
parse them.
Emoji, mentions, and Slack's special tokens
Beyond formatting, Slack messages carry tokens that have no Markdown counterpart, and they're worth knowing when you're assembling messages programmatically:
- Emoji codes like
:rocket:pass through both formats unchanged โ Slack renders them, Markdown renderers usually don't. - Mentions are encoded, not typed:
<@U024BE7LH>for a user,<#C024BE7LR>for a channel, and<!here>/<!channel>for the broadcast keywords. Typing@hereas plain text in an API message does not notify anyone. - Date formatting uses the
<!date^timestamp^format|fallback>token so each reader sees their local time.
Converticle passes these tokens through untouched in both directions, since they're meaningful only inside Slack.
FAQ
Can I convert mrkdwn back to Markdown?
Yes โ Converticle converts both directions. Round-trips are clean for emphasis, links, and lists, but headings can't come back (they were flattened to bold on the way in โ the information is gone).
Why does my bold text show literal asterisks in Slack?
You almost certainly sent Markdown's **double asterisks**. Slack renders single
asterisks as bold and shows the extra pair literally.
Do code blocks support syntax highlighting in Slack?
Not in messages. Triple-backtick blocks render in monospace with a gray background, but the language tag is ignored and no colors are applied. If highlighting matters, post the code as a text-file snippet instead โ Slack highlights uploaded snippets based on their file type.
Does mrkdwn work in Slack's Block Kit?
Yes, in text objects declared with "type": "mrkdwn" โ that's the main reason to
convert. But note that some surfaces (plain-text elements, button labels, titles) only
accept plain_text, where all markup shows literally. Check which type the field
accepts before sending formatted text.