Format messages for Slack with pixel-perfect accuracy. Converts Markdown to rich HTML (for copy-paste into Slack) or Slack mrkdwn (for API/webhook). Use when the user asks to write a Slack message, announcement, or notification, format something "for Slack", preview how content looks in Slack, or send a message via Slack webhook. Also trigger when user mentions Slack formatting, mrkdwn, or wants to share Markdown content in Slack channels.
How this skill is triggered — by the user, by Claude, or both
Slash command
/slack-message-formatter:slack-message-formatterThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Format messages for Slack with pixel-perfect accuracy. Converts Markdown to Slack-compatible output with two delivery paths:
Format messages for Slack with pixel-perfect accuracy. Converts Markdown to Slack-compatible output with two delivery paths:
Always generate the message content in standard Markdown. This is your native format and you produce it reliably. Use all Markdown features freely — the converter handles everything:
**bold**, *italic*, ~~strikethrough~~, `code`[text](url) links# Headings (converted to bold in Slack)- [ ] / - [x] task lists (converted to emoji checkboxes)--- horizontal rules (converted to unicode separator)Run the converter script to transform the Markdown:
# Generate preview page + copy to clipboard
node skills/slack-message-formatter/src/run.mjs preview <<'MARKDOWN'
<paste the markdown here>
MARKDOWN
This will:
/tmp/slack-formatter/Tell the user:
✅ Copied to clipboard + preview opened.
Preview: /tmp/slack-formatter/preview-2026-03-18-141532.html
Paste in Slack with Cmd+V.
If clipboard was disabled or failed:
✅ Preview opened.
Preview: /tmp/slack-formatter/preview-2026-03-18-141532.html
Copy from the browser page, then paste in Slack.
If the user wants to send directly to Slack via webhook:
node skills/slack-message-formatter/src/run.mjs send <<'MARKDOWN'
<paste the markdown here>
MARKDOWN
This uses the CCH_SLA_WEBHOOK environment variable (or any webhook URL the user provides). The message is converted to mrkdwn format and sent via curl.
Slack uses mrkdwn (not Markdown). Key differences:
| Markdown | Slack mrkdwn |
|---|---|
**bold** | *bold* |
*italic* | _italic_ |
~~strike~~ | ~strike~ |
[text](url) | <url|text> |
# heading | *heading* (bold) |
| Tables | Not supported (use code block) |
- [ ] task | :black_square_button: task |
- [x] done | :white_check_mark: done |
--- | ━━━━━━━━━━ (unicode) |
& | & |
< | < |
> (not blockquote) | > |
| Env Variable | Default | Description |
|---|---|---|
SLACK_FORMATTER_CLIPBOARD | true | Set to false to disable auto-clipboard copy |
SLACK_FORMATTER_PREVIEW_DIR | /tmp/slack-formatter | Directory for preview HTML files |
CCH_SLA_WEBHOOK | (none) | Slack webhook URL for sending messages |
ENG-12345
or #123 — always use [ENG-12345](https://armorcodeinc.atlassian.net/browse/ENG-12345)
or [PR #123](url). This applies to every occurrence, not just the first.Slack mention tokens (<@U012AB3CD>, <#C012AB3CD>, <!here>, <!channel>,
<!everyone>) only resolve via the API/webhook path. They do NOT resolve
when pasted into Slack's compose box — Slack renders them as literal text.
@DisplayName (e.g., @Shakti).
Tell the user they'll need to re-type the @ after pasting so Slack's
autocomplete kicks in and links the user. Never emit <@U...> syntax on this
path.send): use <@U012AB3CD> / <#C012AB3CD> / <!here>
as-is. The converter preserves them and Slack resolves them server-side.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub karanb192/slack-message-formatter --plugin slack-message-formatter