Converter

Markdown to Slack, instantly.

Paste markdown on the left, copy Slack mrkdwn on the right. **bold** becomes *bold*, links become <url|text>, and headings become bold lines. Runs entirely in your browser.

  • No signup
  • No upload
  • mrkdwn output
  • Live output

Posting to a forum instead? Markdown to BBCode → Formatting a LinkedIn post instead? LinkedIn text formatter →

Live converter·
markdown673 chars
Drop a Markdown file or
mrkdwn693 chars
*Release note*

Ship notes for the team. Markdown is *portable* and _readable_, but a Slack message wants mrkdwn: single asterisks, not doubles.

*What changed*

- Headings become bold lines
- <https://markdownwriter.com|Markdown Writer> becomes a labeled link
- ~Old syntax~ is struck with one tilde

> Paste your own markdown on the left. The mrkdwn updates as you type.

*Checklist*

1. Paste the source
2. Copy the output
3. Send it as mrkdwn

```
const greet = (name: string) => `Hello, ${name}!`;
```

```
| Step  | Where it goes       |
| ----- | ------------------- |
| Paste | Left pane           |
| Copy  | Webhook or composer |
```

<https://markdownwriter.com/og/home.png|Diagram>

Why this converter

Markdown in, Slack mrkdwn out.

Slack markdown is the formatting a channel actually parses, and it is not the Markdown you write everywhere else. mrkdwn borrows the idea and changes the characters. This converter parses with the same engine as the editor, then emits the markers Slack's API actually reads.

  • Local-first conversion

    Your markdown is parsed and converted in the browser. Nothing is uploaded, logged, or analyzed.

  • mrkdwn, not a guess

    Bold, italic, strike, links, quotes, and code follow Slack's formatting reference for text objects.

  • Honest about the gaps

    Tables become a monospace block. Images become links. Headings become bold lines, because mrkdwn has no other way to say them.

  • Instant output

    No Convert button. The mrkdwn refreshes as you type, so you can fix a line without a round trip.

How it works

Three steps, no friction.

  1. 01

    Paste your markdown

    Drop in CommonMark or GFM. The sample shows a heading, a link, a list, a quote, code, a table, and an image.

  2. 02

    Read the mrkdwn

    Emphasis, links, and code are rewritten. Anything Slack cannot render is kept as text you can still post.

  3. 03

    Copy and send

    Copy into a webhook or a mrkdwn text object, or download a .txt file. The composer needs markup mode — see below.

Slack vs Markdown

Three formatters, one message box.

The message composer is rich text. The toolbar (bold, italic, strike, lists, quotes) stores a structured message. With that toolbar on, pasting **bold** does not format anything. Turn on Preferences → Advanced → Format messages with markup and Slack applies *bold*, _italic_, ~strike~, backticks, and > quotes after you send. Slack's Help Center documents links in that mode as [text](url).

mrkdwn is the syntax the Web API and Block Kit text objects parse — chat.postMessage, incoming webhooks, and a section block with "type": "mrkdwn". Emphasis matches the composer markup. A labeled link does not: it is <url|text>. There are no heading levels, no tables, and no inline images. Slack's formatting guide says lists are not a real construct in app-published text; a line that starts with - only mimics one. In an API payload, a literal ampersand or angle bracket has to be the entity &amp;, &lt;, or &gt;, or Slack treats it as a control character. This page leaves the characters as themselves so a composer paste does not show those entities.

Block Kit also has a markdown block, added in February 2025 for apps on Slack's AI features. That block takes standard Markdown, including headings and tables, and Slack translates it. Do not pre-convert text you are about to put there. The syntax rules for the Markdown side live on the cheatsheet. Need HTML instead of a message? Use Markdown to HTML.

MarkdownmrkdwnWhat happens
**bold** or __bold__*bold*One asterisk. **bold** is not bold.
*italic* or _italic__italic_A single asterisk is bold, not italic.
~~strike~~~strike~One tilde. Two leave a literal tilde beside the strike.
`code``code`Same characters. Formatting inside code is ignored.
``` lang```mrkdwn has no language tag, so the hint is omitted.
# Heading*Heading*No heading sizes. Every level is a bold line.
[label](url)<url|label>Composer markup mode documents [label](url) instead.
- item / 1. item- item / 1. itemmrkdwn has no list object. These lines only mimic one.
- [ ] task- ☐ taskNo checkbox syntax. A ballot glyph keeps the state.
> quote> quoteEach line is prefixed, including blanks, so the quote holds.
GFM tablecode blockColumns stay aligned in monospace. The grid is not rendered.
![alt](url)<url|alt>Not inlined. The URL can still unfurl as a preview.
------Literal characters, not a Block Kit divider block.
==highlight==plain textNo mrkdwn equivalent. Underline is dropped for the same reason.

FAQ

Common questions

Why doesn't **bold** show up as bold in Slack?
Slack's mrkdwn uses a single asterisk for bold and a single underscore for italic. **bold** is CommonMark, not mrkdwn, so Slack leaves the extra asterisks in place (or bolds only the inner word). This converter rewrites **bold** and __bold__ to *bold*, *italic* and _italic_ to _italic_, and ~~strike~~ to ~strike~.
How is the message composer different from mrkdwn?
The composer is rich text. With the formatting toolbar on, you click Bold or type a list and Slack stores a structured message, not markdown characters. Preferences → Advanced → Format messages with markup hides the toolbar and applies *bold*, _italic_, ~strike~, backticks, and > quotes after you send. Slack's Help Center documents links in that mode as [text](url). mrkdwn, which this page emits, is what chat.postMessage, incoming webhooks, and Block Kit text objects with type mrkdwn parse. A labeled link there is <url|text>. The emphasis characters match; the link syntax does not.
How do I paste this into a channel?
For a webhook or chat.postMessage, put the output in the text field, or in a section block whose text object has type mrkdwn. For the desktop composer, turn on Format messages with markup, paste, and send — bold, italic, strike, code, and quotes use the same characters. Labeled links in this output use <url|text>. If the composer shows the angle brackets, select the label and paste the URL (Slack's markup preference documents [text](url) for links). With the formatting toolbar left on, pasted mrkdwn usually stays literal. When you send the string through the API, encode a literal &, <, or > as &amp;, &lt;, and &gt; unless it is part of a link or mention. Those entities are left alone here so a paste into the composer does not show the word amp.
Why did my table become a code block?
mrkdwn has no table. Slack's own formatting guide says app-published text should mimic structure with ordinary lines, and a grid of pipes would collapse. The converter puts the table in a fenced code block so the columns stay aligned in monospace. Emphasis inside cells is flattened for the same reason: code fences are literal. Block Kit's markdown block can render a real table, but only from standard Markdown, not from this mrkdwn output.
What happens to images?
mrkdwn cannot inline an image. ![alt](url) becomes <url|alt>, and an image with no alt becomes <url>. Posting that URL is what lets Slack unfurl a preview; the text format itself has no image tag. Block Kit's markdown block does the same thing with standard Markdown images: Slack turns them into a link.
Should I run this before sending a Block Kit markdown block?
No. The markdown block (added in February 2025 for apps using Slack's AI features) accepts standard Markdown — **bold**, headings, lists, tables, task lists — and Slack translates it. Converting to mrkdwn first would show the asterisks and angle brackets as source. Send the original Markdown in that block. Use this converter for mrkdwn text objects, webhooks, and the message composer.
Is my markdown uploaded anywhere?
No. Parsing and mrkdwn emission both happen in your browser. Nothing is uploaded, logged, or stored. Close the tab and the text is gone. The editor is local-first too, if you want to keep drafting with a preview.

Writing more than a message? Use the editor.

Markdown Writer is the same parser, with synced scrolling, an outline, PDF export, and local autosave.

Open the editor