$npx -y skills add ccheney/robust-skills --skill slack-mrkdwnProactively apply when generating any Slack text content, chat.postMessage text fields, or text objects with type "mrkdwn". Triggers on mrkdwn, Slack formatting, Slack markdown, Slack bold, Slack italic, Slack link syntax, Slack mentions, Slack date formatting, Slack escaping, Sl
| 1 | # Slack mrkdwn |
| 2 | |
| 3 | Slack's custom text formatting syntax for messages and text objects. Not standard Markdown. |
| 4 | |
| 5 | ## CRITICAL: Two Markup Systems |
| 6 | |
| 7 | Slack has two completely different markup syntaxes. Using the wrong one is the most common formatting mistake. |
| 8 | |
| 9 | | System | Used In | Bold | Link | Heading | |
| 10 | |--------|---------|------|------|---------| |
| 11 | | **Slack mrkdwn** | `text` field, text objects (`type: "mrkdwn"`), section fields, attachment fields via `mrkdwn_in` | `*bold*` | `<url\|text>` | Not supported | |
| 12 | | **Standard Markdown** | `markdown` block, `markdown_text` argument | `**bold**` | `[text](url)` | `# Heading` | |
| 13 | |
| 14 | Standard Markdown syntax (`**bold**`, `[text](url)`, `# Heading`) renders as literal text in mrkdwn contexts. Slack mrkdwn syntax (`*bold*`, `<url|text>`) renders as literal text in markdown blocks. Never mix them. |
| 15 | |
| 16 | Standard Markdown surfaces (both designed for passing LLM output through unmodified): |
| 17 | |
| 18 | - The `markdown` block (`type: "markdown"`) accepts standard Markdown and translates it for Slack rendering. Supports: headings (all render at the same size), bold, italic, strikethrough, lists, links, blockquotes, code blocks with optional syntax highlighting, horizontal rules/dividers, tables, task lists, images (rendered as link text), and backslash escaping. A single input block may expand into multiple output blocks; `block_id` is not retained. Cumulative limit across all `markdown` blocks in one payload: 12,000 characters. |
| 19 | - The `markdown_text` argument on `chat.postMessage` and streaming methods (`chat.startStream`, `chat.appendStream`) accepts standard Markdown directly. It cannot be combined with `blocks` or `text` (error: `markdown_text_conflict`). Limit: 12,000 characters. |
| 20 | |
| 21 | ## mrkdwn Syntax |
| 22 | |
| 23 | | Format | Syntax | Notes | |
| 24 | |--------|--------|-------| |
| 25 | | Bold | `*bold*` | Not `**bold**` | |
| 26 | | Italic | `_italic_` | Not `*italic*` | |
| 27 | | Strikethrough | `~strikethrough~` | Not `~~strikethrough~~` | |
| 28 | | Inline code | `` `code` `` | Same as standard Markdown | |
| 29 | | Code block | ` ```code``` ` | No syntax highlighting in mrkdwn; use a `markdown` block with language-tagged fences for highlighting | |
| 30 | | Blockquote | `> quoted text` | Prefix each line | |
| 31 | | Link | `<https://example.com\|display text>` | Not `[text](url)` | |
| 32 | | Emoji | `:emoji_name:` | Standard or custom. Direct Unicode also works; Slack stores and returns emoji in colon format | |
| 33 | | Newline | `\n` | Literal newline in string | |
| 34 | | Ordered list | `1. item` | Plain text, no special rendering | |
| 35 | | Bullet list | `- item` | Rendered properly in `rich_text` blocks only | |
| 36 | |
| 37 | Inline code disables all other formatting within it — use it to display literal text like `*not bold*`. |
| 38 | |
| 39 | ### Nested Formatting |
| 40 | |
| 41 | Combining adjacent format markers without spaces (e.g., `*bold*_italic_`) is **unreliable** and may not render correctly. Always add a space between differently-formatted segments: |
| 42 | |
| 43 | ``` |
| 44 | *bold* _italic_ ← works reliably |
| 45 | *bold*_italic_ ← may fail to render |
| 46 | ``` |
| 47 | |
| 48 | For reliable combined formatting on a single word, use `rich_text` blocks with explicit style objects (`{"bold": true, "italic": true}`). |
| 49 | |
| 50 | ## Links |
| 51 | |
| 52 | ``` |
| 53 | <https://example.com> Auto-detected URL |
| 54 | <https://example.com|Display Text> URL with custom text |
| 55 | <mailto:user@example.com|Email Link> Email link |
| 56 | ``` |
| 57 | |
| 58 | URLs posted in text are auto-linked by Slack. Use `<url|text>` for custom display text. Spaces in URLs will break parsing — remove them. mrkdwn formatting inside link labels (e.g., `<url|*bold*>`) works for basic styles. |
| 59 | |
| 60 | ### Link Unfurling |
| 61 | |
| 62 | Slack previews ("unfurls") linked content. By default Slack unfurls links in messages posted by users and apps. Control this per message: |
| 63 | |
| 64 | | Parameter | Controls | |
| 65 | |-----------|----------| |
| 66 | | `unfurl_links` | Text-based content previews | |
| 67 | | `unfurl_media` | Media (images, video, audio) previews | |
| 68 | |
| 69 | Set both to `false` to suppress all previews. These are `chat.postMessage` parameters, not mrkdwn syntax. |
| 70 | |
| 71 | ## Mentions and References |
| 72 | |
| 73 | ### User Mentions |
| 74 | |
| 75 | ``` |
| 76 | <@U0123ABC456> |
| 77 | ``` |
| 78 | |
| 79 | Triggers a notification for the mentioned user. Auto-converts to di |