Skip to content
100% local

Slack Block Kit builder

Turn a plain text outline into ready-to-send Slack Block Kit JSON.

Input

Slack Block Kit builder

Write a message the way you'd write a document and this tool turns it into the JSON payload Slack's Block Kit expects. Headings starting with # become header blocks, plain paragraphs become section blocks with mrkdwn text, and a line of three or more dashes becomes a divider — no need to hand-write nested block objects or look up the schema for each type.

Bullet lines (starting with - or *) render as one combined section or as a separate block per item, controlled by the "Bullet lists" option — useful when items should wrap independently in a narrow Slack pane. Lines shaped like "Label: value" become a fields section, chunked into groups of ten since that's Slack's limit per section. Markdown links such as [label](url) convert to Slack's <url|label> syntax, and **bold** becomes Slack's single-asterisk bold. A line starting with "context:" adds a footer context block, and one starting with "buttons:" (labels separated by a pipe, with an optional URL in parentheses) adds an actions block with real buttons.

Switch "Payload for" between an incoming webhook and a chat.postMessage call — the second adds a channel field you can edit directly. If any single section's text passes Slack's 3000-character limit, the tool keeps building valid JSON but flags exactly which block is too long, both in the live tally and by highlighting the offending lines in the output, so you catch it before Slack's API rejects the message.

Everything runs in your browser. The outline you type and the JSON it produces never leave your device — nothing is uploaded to any server, including to Slack itself. When the payload looks right, copy it, download it as a .txt file to paste into your code, or send it to another tool's input to keep working.

FAQ

Does it validate against Slack's exact Block Kit schema?
It builds structurally correct JSON for the block types it supports (header, section, divider, context, actions) and enforces the 3000-character section limit, but it does not call Slack's API to validate the full payload.
How do I add buttons?
Write a line starting with "buttons:" followed by labels separated by "|", e.g. "buttons: Approve | Deny". Add "(https://...)" after a label to make it a link-style button.
What is the difference between the webhook and chat.postMessage payload?
An incoming webhook payload is just { text, blocks }. A chat.postMessage call also needs a "channel" field, which the tool adds when you switch the "Payload for" option.
Why did my key-value lines turn into "fields" instead of a paragraph?
Any short line shaped like "Label: value" is treated as a field. If you meant it as prose, add a colon-free sentence or rephrase the line.
Is my message text uploaded anywhere?
No. The outline and the JSON it produces are built entirely in your browser and are never sent to a server, including Slack's.