How to convert markdown to slack mrkdwn format
- Step 1Open the converter and choose an input mode — The tool offers two input modes: Paste text (a textarea) and Upload file (accepts
.md,.mdx,.markdown,.txt). For a quick message, paste; for a saved draft, upload the file. - Step 2Paste or drop your Markdown — Paste the Markdown draft into the textarea, or upload a single Markdown file — this tool processes one file at a time (it does not accept multiple files). The character counter shows how close you are to the tier limit.
- Step 3Run the conversion — Click Run MD → Slack. The engine applies the mrkdwn rules —
**and*and_for emphasis,<url|text>for links, bold for headings, plain triple-backticks for code — and shows the converted text in the result panel. - Step 4Review the emphasis output — Check bold-heavy lines: because of the rule ordering,
**bold**is rendered as_italic_in the output, and*single-asterisk*is also_italic_. If you specifically need Slack bold (*text*), wrap that phrase with a single asterisk in your source first, then re-run. - Step 5Copy or download the result — Click Copy to put the mrkdwn on your clipboard, or Download to save it as a
-slack.txtfile. Both preserve the exact converted text. - Step 6Paste into Slack and confirm rendering — Paste into the channel or DM message box. If your Slack client auto-formats the paste and drops the mrkdwn, use paste-as-plaintext (Ctrl/Cmd+Shift+V) so Slack interprets the
*,_, and<url|text>markers itself.
Markdown to Slack mrkdwn mapping
Exactly what each Markdown construct becomes after conversion. The output column shows the literal text produced by the engine — this is what lands in your Slack message box.
| Markdown input | Slack mrkdwn output | Renders in Slack as | Notes |
|---|---|---|---|
**bold** | _bold_ | italic | Doubled asterisks are first reduced to *bold*, then the italic pass converts that single-asterisk run to _bold_ — so doubled-asterisk text comes out italic |
*italic* | _italic_ | italic | Single-asterisk emphasis maps to Slack's underscore italic |
_italic_ | _italic_ | italic | Underscore emphasis passes through unchanged — Slack already uses it |
~~strike~~ | ~strike~ | strikethrough | GFM double-tilde reduced to Slack's single tilde |
# Heading | *Heading* | bold line | All ATX levels #–###### become a bold line; Slack has no heading element |
[label](https://x.com) | <https://x.com|label> | clickable label | Angle-bracket link form; the visible text is the label |
| a fenced code block with a language tag | the same block with the language tag removed | monospace block | A fence like js after the opening backticks is stripped — Slack renders the block monospace regardless |
--- / *** / ___ | a line of 40 ─ characters | a horizontal rule of box-drawing chars | Slack has no divider in message text, so the rule becomes a literal line of ─ |
What passes through unchanged
Constructs the converter does NOT touch. Slack's mrkdwn already understands these, so they are left verbatim.
| Construct | Behaviour | Why |
|---|---|---|
- item / * item bullets | Left as-is | The converter does not rewrite list markers; Slack shows -/* bulleted lines acceptably |
> quote blockquotes | Left as-is | Slack uses the same > blockquote syntax, so it already renders correctly |
inline code | Left as-is | Slack supports single-backtick inline code identically |
@mentions, :emoji:, #channel | Left as-is (plain text) | The converter performs no entity resolution — type real mentions/emoji directly in Slack to ping or render them |
GFM tables (| a | b |) | Left as-is (raw pipes) | Slack has no table element, so pipe rows show as literal text — pre-flatten tables to a list |
Cookbook
Before/after pairs showing the literal mrkdwn the converter emits for common message constructs. Run any of these to confirm what lands in your Slack box.
A standup message with mixed emphasis
A typical Slack standup uses bold labels and a bulleted list. Note that the **Done:** bold label comes out italic, not bold, because of the emphasis rule ordering — wrap it in a single asterisk if you need true Slack bold.
Input (Markdown): **Done:** shipped the cache fix **Next:** load-test the *new* endpoint - review PR #482 - pair with _Sam_ on retries Output (Slack mrkdwn): _Done:_ shipped the cache fix _Next:_ load-test the _new_ endpoint - review PR #482 - pair with _Sam_ on retries
Heading + link in one message
Markdown headings have no Slack equivalent, so they convert to a bold line. Inline links become Slack's angle-bracket form with the label preserved.
Input (Markdown): ## Deploy summary See the [run log](https://ci.example.com/runs/9001) for details. Output (Slack mrkdwn): *Deploy summary* See the <https://ci.example.com/runs/9001|run log> for details.
Fenced code block loses its language tag
Slack ignores the language hint on a fence, so the converter strips it. The block content is untouched and renders as a monospace box.
Input (Markdown): ```bash curl -sS https://api.example.com/health ``` Output (Slack mrkdwn): ``` curl -sS https://api.example.com/health ```
Horizontal rule becomes a box-drawing line
A thematic break has no message-text equivalent in Slack, so the converter substitutes a line of 40 box-drawing characters. Use it as a visual separator between sections of a long message.
Input (Markdown): Intro paragraph. --- Next section. Output (Slack mrkdwn): Intro paragraph. ──────────────────────────────────────── Next section.
An image reference leaves a stray exclamation mark
The converter has no image rule — it only sees the [alt](url) part inside  and rewrites that to a link, leaving the ! dangling. Remove image syntax before converting, or upload the image to Slack separately.
Input (Markdown):  Output (Slack mrkdwn): !<https://cdn.example.com/arch.png|architecture diagram>
Edge cases and what actually happens
Bold text comes out italic
By designBecause the bold pass reduces **bold** to *bold* and the italic pass then converts any single-asterisk run to _bold_, doubled-asterisk text ends up italic in Slack, not bold. To get true Slack bold (*text*), use a single asterisk around the phrase in your source Markdown — the converter leaves a single * that is not further reduced only if it is not matched by the italic pass, so verify the output and adjust as needed before posting.
Image syntax produces a stray `!`
UnsupportedThere is no image transform.  is matched only by the link rule on its [alt](url) portion, yielding !<url|alt> with a leftover exclamation mark. Slack does not inline-render Markdown images in message text anyway — strip image syntax first, or attach/upload the image to the message separately.
GFM tables stay as raw pipes
UnsupportedSlack message text has no table element, and the converter does not flatten pipe tables. A | col | col | block passes through as literal text and looks like raw pipes in the channel. Convert tables to a bulleted list in your source first, or post the data as a snippet/code block.
Bullets and numbered lists are not renumbered or rebulleted
PreservedThe converter does not touch list markers. -, *, and 1. lines pass through verbatim. Slack renders - bullets reasonably; if you want consistent bullet glyphs first, run the source through a list normaliser before converting (see md-list-fixer at /markdown-tools/md-list-fixer).
`@mentions` and `:emoji:` are not resolved
ExpectedThe tool performs no Slack entity resolution. A literal @alice stays as the text @alice and will not ping the user; :rocket: stays as text unless Slack itself renders it on paste. To reliably ping someone, type the @-mention directly in Slack's composer so it resolves to a user ID.
Underscores inside identifiers get italicised
Watch outThe italic rule matches _text_, so a snippet like user_id_field written in prose (outside inline code) can be partially turned into italics. Wrap such tokens in backticks (` user_id_field `) in your source so they are treated as inline code and left alone.
Message exceeds the free-tier character limit
400 over limitThe free tier caps Markdown input at 1 MB and 500,000 characters. A draft over either limit is blocked before conversion. Pro raises this to 10 MB / 5,000,000 characters. Separately, Slack itself truncates messages around 40,000 characters at post time — split long content into a thread or a canvas.
Slack client strips formatting on paste
WorkaroundSome desktop Slack clients auto-format pasted rich text and discard the literal */_/<url|text> markers. Paste as plain text (Ctrl/Cmd+Shift+V) so Slack interprets the mrkdwn characters itself instead of treating the paste as styled content.
Multiple files at once
Not supportedThis converter processes a single input — it does not accept multiple files in one run. Convert message drafts one at a time. If you need to break one long Markdown document into postable chunks, split it first with md-splitter at /markdown-tools/md-splitter.
Frequently asked questions
Why does my bold text show up as italic in Slack?
It is a consequence of how the converter applies emphasis: the bold pass turns **bold** into *bold*, then the italic pass turns any single-asterisk run into _bold_, which Slack renders as italic. To get Slack bold, use a single asterisk around the phrase in your source Markdown and verify the output before posting.
Are Markdown headings preserved?
Slack message text has no heading element, so #–###### headings are converted to a bold line (*Heading*) for visual hierarchy. For documents that need real heading semantics, post a canvas, or convert to another format with md-to-github-html at /markdown-tools/md-to-github-html.
Will Slack render my code blocks?
Yes. Triple-backtick fences are preserved and render as monospace code blocks in Slack. The converter strips the language tag (a js hint after the opening backticks is removed) because Slack ignores fence languages and does not syntax-highlight message code.
What happens to links?
Inline links [label](https://url) become Slack's angle-bracket form <https://url|label>, which renders as a clickable label. Bare URLs in the text are left as-is and Slack auto-links them on display.
Does it handle images?
No. There is no image rule, so  comes out as !<url|alt> with a stray exclamation mark. Slack does not inline Markdown images in message text — remove image syntax first and upload the image to the message separately.
Are bullet lists converted?
Bullets pass through unchanged. The converter does not rewrite -, *, or numbered list markers, so Slack renders them as-is. If you want consistent bullet glyphs, normalise the list first with md-list-fixer at /markdown-tools/md-list-fixer.
Will @-mentions and emoji work?
Not automatically. The converter treats @alice and :rocket: as plain text — it does not resolve Slack users or emoji. Type real @-mentions directly in Slack's composer so they resolve to user IDs and actually notify people.
Can I use the output in Block Kit messages?
The tool outputs plain mrkdwn text, which fits Slack message text fields and the text of a section block. It does not generate Block Kit JSON — use a dedicated Block Kit builder if you need structured blocks.
Is my message content uploaded anywhere?
No. The conversion runs entirely in your browser via the markdown engine. The message text is never sent to a server; only an anonymous processed-count metric is recorded for signed-in dashboard stats.
What input formats and sizes are accepted?
Paste text directly, or upload a single .md, .mdx, .markdown, or .txt file. The free tier allows up to 1 MB and 500,000 characters per input; Pro raises that to 10 MB / 5,000,000 characters.
What does the downloaded file look like?
Clicking Download saves the converted mrkdwn as a plain-text file named <yourfile>-slack.txt. Clicking Copy puts the same text on your clipboard for an immediate paste.
I want Jira or HTML instead of Slack — is there a sibling tool?
Yes. For Jira wiki markup use md-to-jira at /markdown-tools/md-to-jira; for GitHub-style HTML use md-to-github-html at /markdown-tools/md-to-github-html; for a polished web document use md-to-html at /markdown-tools/md-to-html.
Privacy first
All Markdown processing runs locally in your browser using JavaScript. No file is ever uploaded to JAD Apps servers — only metadata counters are saved for signed-in dashboard stats.