Slack Best Practices 💬🐈⬛
🛑 CRITICAL RULE: NEVER USE DOUBLE ASTERISKS (
**)Slack does NOT support Standard Markdown bolding. Using
**will show the literal asterisks to the user. ALWAYS use single asterisks (*) for bold text.FOR AGENTS: You are hard-wired to use
**. You MUST run a post-processing step on your final message string to replace**with*before calling the message tool.
Slack uses a unique flavor of Markdown called mrkdwn. This skill captures the quirks and best practices learned by Yesterday agents to ensure our messages look perfect.
Formatting Rules (mrkdwn)
| Element | mrkdwn Syntax | Standard MD (Avoid!) |
|---|---|---|
| Bold | *text* (single asterisk) |
**text** |
| Italic | _text_ (underscore) |
*text* |
~text~ |
~~text~~ |
|
| Blockquote | > text |
same |
| Inline Code | `code` |
same |
| Code Block | ```code block``` |
same |
| Link | <URL|Label> |
[Label](URL) |
Note: Slack does NOT support # headers or Markdown tables. Use ALL CAPS BOLD to simulate headers. Use bullet lists instead of tables.
Links & URLs
Auto-linking works if you paste a raw URL. To suppress the preview embed, wrap it in angle brackets:
<https://example.com>
To show custom link text:
<https://example.com|Click here>
Email links:
<mailto:alex@example.com|Mail Alex>
Special characters that must be escaped in text strings (not in URLs):
| Character | Use instead |
|---|---|
& |
& |
< |
< |
> |
> |
Mentions
User mention:
<@U012AB3CD>
Slack auto-converts the user ID to their display name. Get user IDs from their Slack profile ("Copy member ID").
Channel mention:
<#C123ABC456>
Slack auto-converts to the channel name. Get channel ID from the URL: https://app.slack.com/client/E.../C123ABC456
User group mention:
<!subteam^SAZ94GDB8>
Special mentions (use sparingly!):
| Mention | Syntax | Who gets notified |
|---|---|---|
| @here | <!here> |
Active members of channel |
| @channel | <!channel> |
All members of channel |
| @everyone | <!everyone> |
Every workspace member (#general only) |
Date & Time Formatting
Slack can auto-localize timestamps to the reader's timezone:
<!date^UNIX_TIMESTAMP^{date_short} at {time}|Fallback text>
Available tokens:
| Token | Example output |
|---|---|
{date_num} |
2026-03-05 |
{date} |
March 5th, 2026 |
{date_short} |
Mar 5, 2026 |
{date_long} |
Thursday, March 5th, 2026 |
{date_pretty} |
today / yesterday / tomorrow |
{time} |
2:00 PM |
{time_secs} |
2:00:00 PM |
Emoji
- Standard Only: Stick to standard Slack emojis (
:feet:,:sparkles:,:rocket:). - No hallucinations: Do not invent emoji names unless sure they exist in the workspace.
- Tone: Use sparingly to soften messages -- one emoji per paragraph max.
- Emoji are stored internally in colon format (
:smile:). When posting, you can use native unicode emoji directly and Slack will convert them.
Cross-Channel Posting (message Tool)
🛑 CRITICAL: Use the Correct Tool Format
The generic
messagetool'schannelparameter does NOT work for cross-channel posting in Slack. It always sends to the current session's DM. Use the Slack skillsendMessageaction instead.
Posting to a different channel from within a DM session:
{
"action": "sendMessage",
"to": "channel:C0EXAMPLE01",
"content": "Hello from another channel"
}
Posting to a user's DM:
{
"action": "sendMessage",
"to": "user:U012AB3CD",
"content": "Hello via DM"
}
The to field format:
| Target | Format | Example |
|---|---|---|
| Channel by ID | channel:C123ABC456 |
channel:C0EXAMPLE01 |
| User by ID | user:U012AB3CD |
user:U0EXAMPLE02 |
Common mistake: Using message(action=send, channel=C123) -- this ignores the channel parameter and posts to the DM of the current session. Always use sendMessage with to: "channel:...".
Prerequisites:
- The target channel must be in
channels.slack.accounts.default.channelswithallow: true - The bot must be invited to the target channel
groupPolicy: "allowlist"means only explicitly listed channels are allowed
Communication Etiquette
- Thread over Flood: Use threads for deep-dives, detailed logs, or long explanations. Keep channels scannable.
- Mentions: Use
@usersparingly. Prefer no mentions for broad updates unless truly urgent. - Headers: Simulate with
*ALL CAPS BOLD*-- Slack has no#header support. - No tables: Slack does not render Markdown tables. Use bullet lists instead.
- Link embeds: Wrap links in
<>to suppress large previews in busy channels.
Troubleshooting & Common Agent Mistakes
- The "Model Reflex" (CRITICAL): LLMs are pre-trained on millions of Standard Markdown examples and WILL reflexively use
**bold**even when they know better. Treat this as a high-risk failure point. - The "Mental Double-Check": Before any message is sent to Slack, perform a final scan of the text string to ensure NO double-asterisks (
**) exist. Convert to*if found. - Formatting Over Content: High-quality content is useless if the formatting is broken. Prioritize correct mrkdwn syntax over speedy replies.
- Self-Correction Loop: Before calling the
messagetool, run a search-and-replace:**→*.
"Clear is kind. Scannable is better." 🐾📡