Slack post from current context
When the user wants to share what just happened in this conversation as a
Slack message, draft it in the format the Slack composer accepts on paste
and put it on the clipboard with pbcopy. The clipboard is the
deliverable — the user pastes the message into Slack themselves.
Two dialects: paste vs. API — this skill is paste
Slack has two formatting dialects, and the rules differ:
- API mrkdwn (used by the Slack API, MCP tools, webhooks): supports
<url|text> links, <@U123> mentions, <#C123|name> channels.
- Composer paste (what
pbcopy + ⌘V hits): the WYSIWYG composer
partially parses mrkdwn — *bold*, _italic_, ~strike~, backticks,
:emoji:, > quotes, and bullets all work. But it does not parse
<url|text>; it treats the whole thing as one URL and percent-encodes
the | to %7C, breaking the link.
This skill targets the paste dialect. If the user wants the message
actually sent (not drafted), use the Slack MCP and the API dialect there.
Formatting cheat-sheet (paste dialect)
| Want |
Regular markdown |
Paste-into-Slack |
| Bold |
**bold** |
*bold* |
| Italic |
*italic* |
_italic_ |
| Strikethrough |
~~text~~ |
~text~ |
| Inline code |
`code` |
`code` |
| Code block |
lang ``` |
``` (no language tag) |
| Link |
[text](url) |
bare URL on its own (Slack auto-linkifies; display = URL) |
| Heading |
# Heading |
none — bold the line: *Heading* |
| Bullet |
- item |
• item (renders nicer than -) |
| Numbered |
1. item |
1. item |
| Quote |
> text |
> text |
| User mention |
n/a |
@name (autocomplete on send turns it into a real ping) |
| Channel |
n/a |
#channel (same — autocomplete) |
| Emoji |
n/a |
:rocket: :white_check_mark: :warning: |
The three that bite hardest:
**bold** renders as the literal characters **bold**. Use *bold*.
<url|text> is API format — when pasted into the composer, the |
becomes %7C and the link breaks. Paste a bare URL; Slack
auto-linkifies it. Custom display text via [text](url) only works for
recipients who have "Format messages with markup" enabled — don't rely
on it.
# Heading renders as a literal #. Bold the line instead.
Composing the message
Read the conversation. Pick out:
- The headline — what was achieved, decided, broken, or shipped. One
line, bolded. Lead with it.
- Concrete artifacts — file paths, PR/ticket numbers, commands, URLs,
numbers. Bullet them.
- Anything the audience needs to act on or react to — questions,
blockers, asks. Call them out (
:warning: or :question: helps).
Keep it tight. Slack messages over ~10 lines lose readers; condense.
Strip narrative ("First I tried X, then Y…") — Slack wants the result.
Putting it on the clipboard
Use a heredoc with single-quoted 'EOF' so $variables, backticks, and
backslashes pass through verbatim:
pbcopy <<'EOF'
*Shipped: KGM-3330 banner mismatch fix*
• Root cause: home carousel banner cached past TTL on app cold start
• PR: https://github.com/org/repo/pull/4711
• Verified on iOS 18.7.2 (iPhone 12 Pro Max) and Android 14 (Pixel 5a)
• cc @felix — please review before mobile release cut on 2026-05-01
EOF
Note the bare URL on its own — <url|PR #4711> would paste as a broken
URL with %7C in it.
After running, reply to the user with one short line:
Copied — paste into Slack.
Do not also dump the message body into the chat reply. The user will
read it when they paste; echoing it just makes them read it twice.
When NOT to use this skill
- The user wants the message posted (not drafted) — that's the Slack MCP
(
slack_send_message / slack_send_message_draft), not pbcopy
- They want an email, PR description, commit message, or doc — different
format
- Non-macOS shell —
pbcopy is macOS-only. On Linux use xclip -selection clipboard or wl-copy; on Windows, clip.exe. If you
detect a non-mac platform, tell the user and skip the copy step
Common mistakes
| Mistake |
Fix |
**bold** |
Slack shows literal **. Use *bold*. |
# Heading |
Renders as #. Bold the line instead: *Heading*. |
<url|text> in pasted text |
API mrkdwn, not composer-paste — the | becomes %7C and the link breaks. Paste a bare URL; Slack auto-linkifies. |
[text](url) to get custom display text |
Only works for recipients with "Format messages with markup" enabled — unreliable. Use a bare URL. |
| Triple-backtick with language tag |
Slack ignores the tag and shows it as code. Drop the language. |
| Echo the message body in the chat after pbcopy |
The clipboard is the deliverable; don't make the user re-read it. |
Use echo "…" | pbcopy for multi-line |
Quoting breaks on *, backticks, <>. Use a 'EOF'-quoted heredoc. |
| Pipe markdown straight from a tool |
Convert it to paste-format first. Don't copy-paste GitHub-style markdown. |
1---2name: slack-post-from-context3description: Use when the user asks to draft, share, or post something to Slack about the current conversation — phrasings like "post this to slack", "make a slack message about this", "share this on slack", "slack-format this", "draft a slack update". Composes the message in the *paste-into-composer* dialect of Slack formatting (single-asterisk bold, bare URLs, no headings, `:emoji:`) and pipes it to `pbcopy` so the user pastes it directly. macOS only.4---56# Slack post from current context78When the user wants to share what just happened in this conversation as a9Slack message, draft it in the format the Slack composer accepts on paste10and put it on the clipboard with `pbcopy`. The clipboard is the11deliverable — the user pastes the message into Slack themselves.1213## Two dialects: paste vs. API — this skill is *paste*1415Slack has two formatting dialects, and the rules differ:1617- **API mrkdwn** (used by the Slack API, MCP tools, webhooks): supports18 `<url|text>` links, `<@U123>` mentions, `<#C123|name>` channels.19- **Composer paste** (what `pbcopy` + ⌘V hits): the WYSIWYG composer20 *partially* parses mrkdwn — `*bold*`, `_italic_`, `~strike~`, backticks,21 `:emoji:`, `>` quotes, and bullets all work. But it does **not** parse22 `<url|text>`; it treats the whole thing as one URL and percent-encodes23 the `|` to `%7C`, breaking the link.2425This skill targets the *paste* dialect. If the user wants the message26actually sent (not drafted), use the Slack MCP and the API dialect there.2728## Formatting cheat-sheet (paste dialect)2930| Want | Regular markdown | Paste-into-Slack |31|------|------------------|------------------|32| Bold | `**bold**` | `*bold*` |33| Italic | `*italic*` | `_italic_` |34| Strikethrough | `~~text~~` | `~text~` |35| Inline code | `` `code` `` | `` `code` `` |36| Code block | ``` ```lang ``` | ``` ``` ``` (no language tag) |37| Link | `[text](url)` | bare URL on its own (Slack auto-linkifies; display = URL) |38| Heading | `# Heading` | none — bold the line: `*Heading*` |39| Bullet | `- item` | `• item` (renders nicer than `-`) |40| Numbered | `1. item` | `1. item` |41| Quote | `> text` | `> text` |42| User mention | n/a | `@name` (autocomplete on send turns it into a real ping) |43| Channel | n/a | `#channel` (same — autocomplete) |44| Emoji | n/a | `:rocket:` `:white_check_mark:` `:warning:` |4546The three that bite hardest:4748- `**bold**` renders as the literal characters `**bold**`. Use `*bold*`.49- `<url|text>` is *API* format — when pasted into the composer, the `|`50 becomes `%7C` and the link breaks. Paste a **bare URL**; Slack51 auto-linkifies it. Custom display text via `[text](url)` only works for52 recipients who have "Format messages with markup" enabled — don't rely53 on it.54- `# Heading` renders as a literal `#`. Bold the line instead.5556## Composing the message5758Read the conversation. Pick out:59601. **The headline** — what was achieved, decided, broken, or shipped. One61 line, bolded. Lead with it.622. **Concrete artifacts** — file paths, PR/ticket numbers, commands, URLs,63 numbers. Bullet them.643. **Anything the audience needs to act on or react to** — questions,65 blockers, asks. Call them out (`:warning:` or `:question:` helps).6667Keep it tight. Slack messages over ~10 lines lose readers; condense.68Strip narrative ("First I tried X, then Y…") — Slack wants the result.6970## Putting it on the clipboard7172Use a heredoc with single-quoted `'EOF'` so `$variables`, backticks, and73backslashes pass through verbatim:7475```bash76pbcopy <<'EOF'77*Shipped: KGM-3330 banner mismatch fix*7879• Root cause: home carousel banner cached past TTL on app cold start80• PR: https://github.com/org/repo/pull/471181• Verified on iOS 18.7.2 (iPhone 12 Pro Max) and Android 14 (Pixel 5a)82• cc @felix — please review before mobile release cut on 2026-05-0183EOF84```8586Note the bare URL on its own — `<url|PR #4711>` would paste as a broken87URL with `%7C` in it.8889After running, reply to the user with **one short line**:9091> Copied — paste into Slack.9293Do **not** also dump the message body into the chat reply. The user will94read it when they paste; echoing it just makes them read it twice.9596## When NOT to use this skill9798- The user wants the message *posted* (not drafted) — that's the Slack MCP99 (`slack_send_message` / `slack_send_message_draft`), not `pbcopy`100- They want an email, PR description, commit message, or doc — different101 format102- Non-macOS shell — `pbcopy` is macOS-only. On Linux use `xclip103 -selection clipboard` or `wl-copy`; on Windows, `clip.exe`. If you104 detect a non-mac platform, tell the user and skip the copy step105106## Common mistakes107108| Mistake | Fix |109|---------|-----|110| `**bold**` | Slack shows literal `**`. Use `*bold*`. |111| `# Heading` | Renders as `#`. Bold the line instead: `*Heading*`. |112| `<url\|text>` in pasted text | API mrkdwn, not composer-paste — the `\|` becomes `%7C` and the link breaks. Paste a bare URL; Slack auto-linkifies. |113| `[text](url)` to get custom display text | Only works for recipients with "Format messages with markup" enabled — unreliable. Use a bare URL. |114| Triple-backtick with language tag | Slack ignores the tag and shows it as code. Drop the language. |115| Echo the message body in the chat after pbcopy | The clipboard is the deliverable; don't make the user re-read it. |116| Use `echo "…" \| pbcopy` for multi-line | Quoting breaks on `*`, backticks, `<>`. Use a `'EOF'`-quoted heredoc. |117| Pipe markdown straight from a tool | Convert it to paste-format first. Don't copy-paste GitHub-style markdown. |