Free Slack Mrkdwn Previewer
Write a Slack message in mrkdwn to see how it will look, get a Block Kit payload, and find Markdown Slack won’t format.
What is a Slack Mrkdwn Previewer?
Slack formats messages with mrkdwn, its own markup that looks like Markdown but isn’t: bold is *single asterisks*, links are written in angle brackets, and mentions use IDs. This previewer shows a message as Slack formats it and builds the Block Kit payload a bot or webhook sends.
It reads every mrkdwn element: bold, italic, strikethrough, inline code, code blocks, quotes, links, user and channel mentions, user groups, @here and @channel, dates and emoji names. The Block Kit view escapes &, < and > the way the API expects and splits text over 3,000 characters into sections.
Key Features
Message Preview
Formatting, mention pills, quotes and code blocks, close to Slack’s own look.
Block Kit Payload
A ready-to-send blocks array with mrkdwn text, escaped for the API.
Mentions and Links
Users, channels, groups, broadcasts and dates read from their angle-bracket tokens.
Markdown Check
Double asterisks, [label](url) links, headings and lists that Slack won’t format.
Safe Preview
Text is escaped and the preview is sanitised, so nothing in a message runs.
Perfect for everyone
- Slack app and bot developers
- People writing webhook alerts
- Anyone formatting announcements
How to Use the Slack Mrkdwn Previewer
Write the message you want to send, or paste text from a bot, a webhook or a template. The preview, Block Kit payload and check all read the same text, so you can fix it in one place and copy the result.
Write the Message
Use *bold*, _italic_ and <url|label> links as Slack expects.
Preview It
See mentions, quotes and code blocks formatted.
Check It
Fix Markdown habits and unknown tokens the check lists.
Copy Block Kit
Send the payload from your app, webhook or workflow.
Slack Messages, Previewed and Checked
Each row is a message of the kind teams post every day, from deploy notices to incident updates and Markdown pasted from a doc. Each answer is this tool’s output in the mode on the chip: HTML, a Block Kit payload or the check.
“:rocket: *Deploy finished* for <https://status.example.com/releases/412|release 412> <@U024BE7LH> please check _checkout_ on staging before <!date^1793174400^{date_short} at {time}|Oct 28 at 9:00>. > Rollback plan: ~revert~ redeploy 411 from <#C0123ABCD|deploys> ``` make deploy ENV=prod VERSION=412 ``` <!here> thanks for the patience & quick reviews!”
“:rocket: *Deploy finished* for <https://status.example.com/releases/412|release 412> <@U024BE7LH> please check _checkout_ on staging before <!date^1793174400^{date_short} at {time}|Oct 28 at 9:00>. > Rollback plan: ~revert~ redeploy 411 from <#C0123ABCD|deploys> ``` make deploy ENV=prod VERSION=412 ``` <!here> thanks for the patience & quick reviews!”
“*Release notes* for _v2.4_: > ~Dark mode~ shipped in v2.3 `npm i app@2.4`”
“<@U024BE7LH> and <!subteam^SAZ94GDB8|@oncall>, the <#C0123ABCD|incidents> channel has the timeline.”
“## Weekly update **Shipped:** the new [billing page](https://example.com/billing) - faster exports - fewer bugs <b>”
“Q3 revenue: 4 < 5 & growing > 10%”
“Meet at <!date^1793174400^{date_short_pretty} at {time}|Oct 28 at 9:00 UTC> in <https://meet.example.com/standup|the standup room>”
“<!channel> :warning: *Outage* in eu-west-1. Updates in thread :thread:”
“Use `snake_case_names` and *not* __this__ or **that**”
“``` SELECT * FROM orders WHERE total > 100; ``` Results in <https://bi.example.com/q/88|the dashboard>”
Slack Mrkdwn Syntax
Slack’s formatting looks familiar but differs from Markdown in small, important ways. These are the pieces of mrkdwn that work in message text and in Block Kit text objects, with what to type for each one.
Bold
Wrap text in single asterisks: *bold*.
“How do you write bold?”
Italic
Wrap text in underscores: _italic_.
“How do you write italic?”
Strikethrough
Wrap text in tildes: ~struck~.
“How do you strike text?”
Code
Backticks for inline code, three backticks for a block.
“What starts a code block?”
Quote
Start a line with > to quote it.
“How do you quote a line?”
Link
<https://example.com|label> shows the label as a link.
“Where does the label go?”
User Mention
<@U024BE7LH> mentions a user by ID, not by name.
“What goes after @?”
Channel Link
<#C0123ABCD|general> links a channel by ID.
“What does # take?”
Broadcasts
<!here>, <!channel> and <!everyone> notify a whole channel.
“Which notifies active members?”
Dates
<!date^unix^format|fallback> shows a date in each reader’s time zone.
“What is the fallback for?”
Escaping for the Slack API
Slack uses angle brackets for its own tokens, so text sent through the API has to escape three characters to show them literally. The Block Kit output does this for you, but it helps to know why a message comes back looking different.
Ampersand
Send & as & so it isn’t read as the start of an entity.
Less Than
Send < as < so it isn’t read as the start of a token.
Greater Than
Send > as >, except at the start of a line, where it makes a quote.
Leave Tokens Alone
Links, mentions and dates keep their angle brackets.
Don’t Escape Twice
Text that already contains & shouldn’t be escaped again.
Mrkdwn in Block Kit
Block Kit is the layout system for Slack app messages. Its text objects take a type of mrkdwn or plain_text, and the mrkdwn ones support the same syntax as message text, with limits that matter once messages get long or automated.
Section Limit
A section’s text can be up to 3,000 characters. Longer text needs more sections.
Fallback Text
Send top-level text too, for notifications and clients that can’t show blocks.
Mentions Notify
Mentions in blocks notify people just as they do in plain messages.
Verbatim Off
By default Slack also links bare URLs and names; verbatim true turns that off.
Test in Builder
Slack’s Block Kit Builder previews full layouts with buttons and images.
Slack Mrkdwn Versus Markdown
Most people learn Markdown first, from GitHub, Notion or documentation sites, and then find that Slack reads some of it differently. These are the differences that cause the most confusion when text moves from a doc or a README into a Slack message.
Bold and Italic
Markdown uses **bold** and *italic*; Slack uses *bold* and _italic_, so Markdown italic turns bold in Slack.
Links
Markdown writes [label](url); Slack wraps the address and label in angle brackets with a pipe between them.
Headings
Markdown headings start with #; Slack messages have no headings, so use bold on its own line instead.
Lists
Markdown lists render with bullets; in Slack messages, hyphens and numbers show exactly as typed.
Line Breaks
Markdown joins lines into paragraphs; Slack keeps every line break you type.
Mentions
Markdown has no mentions; Slack needs IDs in angle brackets for people, channels and groups.
Who a Mention Notifies
Mentions are the part of a Slack message with real consequences, because each kind reaches a different set of people. Choosing the narrowest one that does the job keeps channels quiet and makes urgent alerts stand out when they matter.
A Person
A user mention notifies that one person, wherever they are in the workspace.
A User Group
A group mention such as @oncall notifies everyone in the group.
Here
The here broadcast notifies channel members who are currently active.
Channel
The channel broadcast notifies every member of the channel, active or not.
Everyone
The everyone broadcast only works in the workspace’s default channel and reaches every member.
When to Use a Mrkdwn Previewer
Whenever a message will be sent by code rather than typed into Slack, or when text written elsewhere needs to look right once it lands in a channel and reaches the people it mentions.
Bot Messages
Check formatting before your app sends it to thousands of people.
Webhook Alerts
Make monitoring and CI alerts readable at a glance.
Announcements
Draft a long post and check quotes, links and mentions.
Templates
Test message templates with real placeholder values.
Moving From Markdown
Convert habits from GitHub or Notion into Slack’s syntax.
Mrkdwn Pitfalls
Mistakes that make a Slack message arrive with stray symbols or broken links, most of which come from writing Markdown out of habit or from building text in code without escaping it first.
Double Asterisks
**text** shows extra asterisks in many clients. Use *text*.
Markdown Links
[label](url) stays as typed. Use <url|label>.
Names Instead of IDs
@jane isn’t a mention from the API. Use <@USERID>.
Underscores in Words
file_name_here can turn italic in some cases. Wrap it in backticks.
Unescaped Brackets
An unescaped < can swallow the text after it.
Overusing @channel
Broadcasts notify everyone. Use @here or a group mention when you can.