Converticle

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

ElementMarkdownSlack 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# Titlenone โ€” bold line by convention
Bullet list- itemโ€ข character by convention
Numbered list1. itemliteral numbers, no auto-numbering
Blockquote> quote> quote (same)
Image![alt](src)none โ€” attach or let the URL unfurl
TableGFM pipe tablenone

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 # H1 into 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 &lt;/&gt;, 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 @here as 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.

Try the Markdown to Slack converter โ†’