Converter
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.
Posting to a forum instead? Markdown to BBCode → Formatting a LinkedIn post instead? LinkedIn text formatter →
*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
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.
Your markdown is parsed and converted in the browser. Nothing is uploaded, logged, or analyzed.
Bold, italic, strike, links, quotes, and code follow Slack's formatting reference for text objects.
Tables become a monospace block. Images become links. Headings become bold lines, because mrkdwn has no other way to say them.
No Convert button. The mrkdwn refreshes as you type, so you can fix a line without a round trip.
How it works
Drop in CommonMark or GFM. The sample shows a heading, a link, a list, a quote, code, a table, and an image.
Emphasis, links, and code are rewritten. Anything Slack cannot render is kept as text you can still post.
Copy into a webhook or a mrkdwn text object, or download a .txt file. The composer needs markup mode — see below.
Slack vs Markdown
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 &, <, or >, 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.
| Markdown | mrkdwn | What 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. item | mrkdwn has no list object. These lines only mimic one. |
| - [ ] task | - ☐ task | No checkbox syntax. A ballot glyph keeps the state. |
| > quote | > quote | Each line is prefixed, including blanks, so the quote holds. |
| GFM table | code block | Columns stay aligned in monospace. The grid is not rendered. |
|  | <url|alt> | Not inlined. The URL can still unfurl as a preview. |
| --- | --- | Literal characters, not a Block Kit divider block. |
| ==highlight== | plain text | No mrkdwn equivalent. Underline is dropped for the same reason. |
FAQ
Markdown Writer is the same parser, with synced scrolling, an outline, PDF export, and local autosave.
Open the editor