Free tool · no signup · runs in your browser

Slack Message Formatter

Paste Markdown or an AI answer and get Slack mrkdwn that renders the way you meant, ready-made Block Kit sections inside every limit, and a check that finds the block behind invalid_blocks before Slack does.

Paste a ChatGPT answer, README text or any Markdown. Slack mentions you have already typed are kept as they are.

What Slack cannot show as written
  • Slack mrkdwn has no headings, so headings became bold lines. Use a header block or a markdown block if you need a real heading.
  • Slack mrkdwn has no tables, so each table became a monospaced code block. A markdown block renders real tables in messages.

Mentions and dates

<@U012AB3CD>
*Deploy summary*

The *v2.4 release* is live. Here is what changed:

• Faster search (_about twice as fast_ on large workspaces)
• New <https://example.com/billing|billing page>
• Fixed the login loop on Safari

```
Service   Status
--------  --------
API       Healthy
Webhooks  Degraded
```

Run `npm run migrate` before Friday. Questions? Ask in the release channel.

mrkdwn is not Markdown

Slack's text fields read their own dialect, mrkdwn. It looks close enough to Markdown to mislead you and differs on almost every rule that matters. Bold is one asterisk, not two. Italic is an underscore. Links are written <https://example.com|label>. There is no heading syntax, no table syntax and no real list syntax, so lists are just lines that start with a bullet character. And the three characters&, < and > are reserved for links and mentions, so literal text has to carry them as &amp;, &lt; and &gt;.

The converter applies those rules line by line: emphasis is rewritten, links and images become angle-bracket links, headings turn into bold lines, nested lists get indented bullets, task lists get check boxes, tables become a monospaced block, and code stays literal. Anything Slack cannot display as written is listed under the input so nothing changes silently.

Slack's message limits that cause most failures

Text and blocks have separate budgets, and the errors for each are different. For text, Slack's guidance is 4,000 characters; chat.postMessage truncates beyond 40,000, while chat.update refuses anything over 4,000 with msg_too_long. For blocks, the counts that bite are 50 blocks per message (100 in a modal or the Home tab), 3,000 characters of section text, 10 fields of 2,000 each, 150 for a header, 25 elements in an actions block, 10 in a context block, and 75 characters of button text. A markdown block shares one 12,000-character allowance across the whole payload.

The full list, including rate limits and file sizes, is on the Slack limits page. When you build sections here, long text is split at paragraph and line boundaries so every block stays under 3,000, and a code block that has to be cut is closed and reopened so both halves still render.

Reading invalid_blocks before Slack sends it back

Slack has two block errors. invalid_blocks_format means the value is not a usable JSON array at all, most often because it was encoded twice and arrived as a string. invalid_blocks means the JSON is fine and a block broke a rule. The second one is slow to debug because the reply rarely names the block, so a payload that worked for weeks fails the first time a customer name or an AI answer runs long.

Check Block Kit reports every problem with its JSON path, so /blocks/0/text/type tells you the first block's text needs plain_text. It also flags a missing top-level text, the fallback that notifications and screen readers use. The safest habit is to clamp every dynamic string to its budget before it enters a block, which is what a hosted Slack chatbot does for you.

Frequently asked questions

How do I make text bold in a Slack message?

Wrap it in single asterisks: *bold*. Slack's mrkdwn is not standard Markdown, so the double asterisks most editors and AI tools write show up as literal stars. Italic is _underscores_, strikethrough is ~tildes~ and inline code uses backticks. Paste Markdown into the converter above and it rewrites every style for you.

What is the character limit for a Slack message?

Slack asks you to keep chat.postMessage text to 4,000 characters and truncates anything over 40,000. chat.update is stricter and rejects text over 4,000 with msg_too_long. In blocks, a section's text is capped at 3,000 characters, a header at 150, and a message holds 50 blocks. The meter above checks the 4,000 and 40,000 thresholds as you type.

Why does ChatGPT or AI output look broken in Slack?

Language models write standard Markdown: double-asterisk bold, # headings, [text](url) links and pipe tables. Slack's text fields read mrkdwn instead, so those show as raw symbols. Convert the reply before posting, or send it in a markdown block, which Slack added for AI apps and which renders headings, lists and tables in messages up to 12,000 characters per payload.

How do I fix invalid_blocks in Slack?

invalid_blocks means the JSON parsed but a block broke a Block Kit rule: text over its limit, mrkdwn where plain_text is required, a missing alt_text, or more than 50 blocks. Slack's reply rarely says which. Paste the payload into Check Block Kit above and it names the exact path, such as /blocks/0/text/type, with the fix.

Can a Slack message contain a table?

Not in mrkdwn: section text has no table syntax, so the converter turns a table into an aligned code block that stays readable in a monospace font. In messages you can also use a markdown block, which does render tables. For many rows of structured data, a file or a link to a spreadsheet usually reads better than either.

How do I mention a user, channel or @here from a bot?

Use the ID, not the name: <@U012AB3CD> for a person, <#C123ABC456> for a channel, <!subteam^S0614TZR7> for a user group, and <!here>, <!channel> or <!everyone> for the broadcast mentions. Names will not resolve. The builder above writes each token and a date token that shows in every reader's own time zone.

Does this tool send my message to Slack?

No. Conversion, the preview, the length check and the Block Kit validation all run in your browser, and nothing you paste is sent to Conferbot or to Slack. The curl and code samples contain placeholders for the bot token and channel ID, which you add yourself when you run them.

Related

Posting AI answers into Slack?

A Conferbot Slack bot answers from your knowledge base in mrkdwn that renders properly, and hands off to a person when it should. Free plan, no card.