Message Push
0xranx/golembot
Send proactive messages to IM groups or individual users via the gateway Send API.
Configure notification integrations (Telegram, Discord, Slack) via natural language
The automated check flagged lines worth reading first. See the safety section below.
$ npx skills add Yeachan-Heo/oh-my-claudecode --skill configure-notifications -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Yeachan-Heo/oh-my-claudecode configure-notifications --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Yeachan-Heo/oh-my-claudecode.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/configure-notifications .claude/skills/configure-notifications && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "configure-notifications" agent skill from https://github.com/Yeachan-Heo/oh-my-claudecode/tree/main/skills/configure-notifications into .claude/skills/configure-notifications/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configure-notifications", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Yeachan-Heo/oh-my-claudecode/tree/main/skills/configure-notificationsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Yeachan-Heo/oh-my-claudecode --skill configure-notifications -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Yeachan-Heo/oh-my-claudecode configure-notifications --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yeachan-Heo/oh-my-claudecode.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/configure-notifications .agents/skills/configure-notifications && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "configure-notifications" agent skill from https://github.com/Yeachan-Heo/oh-my-claudecode/tree/main/skills/configure-notifications into .agents/skills/configure-notifications/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configure-notifications", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Yeachan-Heo/oh-my-claudecode --skill configure-notifications -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Yeachan-Heo/oh-my-claudecode configure-notifications --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yeachan-Heo/oh-my-claudecode.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/configure-notifications .cursor/skills/configure-notifications && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "configure-notifications" agent skill from https://github.com/Yeachan-Heo/oh-my-claudecode/tree/main/skills/configure-notifications into .cursor/skills/configure-notifications/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configure-notifications", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Yeachan-Heo/oh-my-claudecode.git --path skills/configure-notifications--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Yeachan-Heo/oh-my-claudecode --skill configure-notifications -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Yeachan-Heo/oh-my-claudecode configure-notifications --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yeachan-Heo/oh-my-claudecode.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/configure-notifications .gemini/skills/configure-notifications && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "configure-notifications" agent skill from https://github.com/Yeachan-Heo/oh-my-claudecode/tree/main/skills/configure-notifications into .gemini/skills/configure-notifications/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configure-notifications", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Yeachan-Heo/oh-my-claudecode configure-notificationsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Yeachan-Heo/oh-my-claudecode --skill configure-notifications -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Yeachan-Heo/oh-my-claudecode.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/configure-notifications .github/skills/configure-notifications && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "configure-notifications" agent skill from https://github.com/Yeachan-Heo/oh-my-claudecode/tree/main/skills/configure-notifications into .github/skills/configure-notifications/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configure-notifications", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Yeachan-Heo/oh-my-claudecode --skill configure-notifications -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Yeachan-Heo/oh-my-claudecode configure-notifications --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yeachan-Heo/oh-my-claudecode.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/configure-notifications .opencode/skills/configure-notifications && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "configure-notifications" agent skill from https://github.com/Yeachan-Heo/oh-my-claudecode/tree/main/skills/configure-notifications into .opencode/skills/configure-notifications/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configure-notifications", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
configure-notificationsConfigure notification integrations (Telegram, Discord, Slack) via natural language
Configure Notifications is an agent skill from Yeachan-Heo/oh-my-claudecode. Configure notification integrations (Telegram, Discord, Slack) via natural language
Its SKILL.md is about 9.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Productivity & Automation. It works with Telegram, Discord and Slack. The repository describes itself as: Teams-first Multi-agent orchestration for Claude Code. The licence is MIT.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 454bae0. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jqcurlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
hooks.slack.comdiscord.comapi.telegram.orgdiscordapp.comapi.slack.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
BOT_TOKENUSER_PROVIDED_TOKENOMC_TELEGRAM_BOT_TOKENOMC_DISCORD_NOTIFIER_BOT_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Configure Notifications loads about 9.1k tokens when it runs. Until then it costs about 27 tokens; SKILL.md has 2,667 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found patterns that need a careful read before installing.
- Must start with `https://discord.com/api/webhooks/` or `https://discordapp.com/api/webhooks/`OMC_DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...export OMC_DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/..."Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Yeachan-Heo/oh-my-claudecode at commit 454bae0, republished under its MIT licence (© Yeachan-Heo). 2,667 words, ~9,085 tokens.
.claude/skills/configure-notifications/SKILL.md (or your agent's skills folder).Set up OMC notification integrations so you're alerted when sessions end, need input, or complete background tasks.
Detect which provider the user wants based on their request or argument:
Question: "Which notification service would you like to configure?"
Options:
Set up Telegram notifications so OMC can message you when sessions end, need input, or complete background tasks.
This is an interactive, natural-language configuration skill. Walk the user through setup by asking questions with AskUserQuestion. Write the result to ${CLAUDE_CONFIG_DIR:-~/.claude}/.omc-config.json.
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
if [ -f "$CONFIG_FILE" ]; then
HAS_TELEGRAM=$(jq -r '.notifications.telegram.enabled // false' "$CONFIG_FILE" 2>/dev/null)
CHAT_ID=$(jq -r '.notifications.telegram.chatId // empty' "$CONFIG_FILE" 2>/dev/null)
PARSE_MODE=$(jq -r '.notifications.telegram.parseMode // "Markdown"' "$CONFIG_FILE" 2>/dev/null)
if [ "$HAS_TELEGRAM" = "true" ]; then
echo "EXISTING_CONFIG=true"
echo "CHAT_ID=$CHAT_ID"
echo "PARSE_MODE=$PARSE_MODE"
else
echo "EXISTING_CONFIG=false"
fi
else
echo "NO_CONFIG_FILE"
fiIf existing config is found, show the user what's currently configured and ask if they want to update or reconfigure.
Guide the user through creating a bot if they don't have one:
To set up Telegram notifications, you need a Telegram bot token and your chat ID.
CREATE A BOT (if you don't have one):
1. Open Telegram and search for @BotFather
2. Send /newbot
3. Choose a name (e.g., "My OMC Notifier")
4. Choose a username (e.g., "my_omc_bot")
5. BotFather will give you a token like: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz
GET YOUR CHAT ID:
1. Start a chat with your new bot (send /start)
2. Visit: https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates
3. Look for "chat":{"id":YOUR_CHAT_ID}
- Personal chat IDs are positive numbers (e.g., 123456789)
- Group chat IDs are negative numbers (e.g., -1001234567890)Use AskUserQuestion:
Question: "Paste your Telegram bot token (from @BotFather)"
The user will type their token in the "Other" field.
Validate the token:
digits:alphanumeric (e.g., 123456789:ABCdefGHI...)Use AskUserQuestion:
Question: "Paste your Telegram chat ID (the number from getUpdates API)"
The user will type their chat ID in the "Other" field.
Validate the chat ID:
# Help user find their chat ID
BOT_TOKEN="USER_PROVIDED_TOKEN"
echo "Fetching recent messages to find your chat ID..."
curl -s "https://api.telegram.org/bot${BOT_TOKEN}/getUpdates" | jq '.result[-1].message.chat.id // .result[-1].message.from.id // "No messages found - send /start to your bot first"'Use AskUserQuestion:
Question: "Which message format do you prefer?"
Options:
Use AskUserQuestion with multiSelect:
Question: "Which events should trigger Telegram notifications?"
Options (multiSelect: true):
Default selection: session-end + ask-user-question.
Read the existing config, merge the new Telegram settings, and write back:
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
mkdir -p "$(dirname "$CONFIG_FILE")"
if [ -f "$CONFIG_FILE" ]; then
EXISTING=$(cat "$CONFIG_FILE")
else
EXISTING='{}'
fi
# BOT_TOKEN, CHAT_ID, PARSE_MODE are collected from user
echo "$EXISTING" | jq \
--arg token "$BOT_TOKEN" \
--arg chatId "$CHAT_ID" \
--arg parseMode "$PARSE_MODE" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications.telegram = {
enabled: true,
botToken: $token,
chatId: $chatId,
parseMode: $parseMode
}' > "$CONFIG_FILE"For each event NOT selected, disable it:
# Example: disable session-start if not selected
echo "$(cat "$CONFIG_FILE")" | jq \
'.notifications.events = (.notifications.events // {}) |
.notifications.events["session-start"] = {enabled: false}' > "$CONFIG_FILE"After writing config, offer to send a test notification:
Use AskUserQuestion:
Question: "Send a test notification to verify the setup?"
Options:
BOT_TOKEN="USER_PROVIDED_TOKEN"
CHAT_ID="USER_PROVIDED_CHAT_ID"
PARSE_MODE="Markdown"
RESPONSE=$(curl -s -w "\n%{http_code}" \
"https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}" \
-d "parse_mode=${PARSE_MODE}" \
-d "text=OMC test notification - Telegram is configured!")
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
BODY=$(echo "$RESPONSE" | head -1)
if [ "$HTTP_CODE" = "200" ]; then
echo "Test notification sent successfully!"
else
echo "Failed (HTTP $HTTP_CODE):"
echo "$BODY" | jq -r '.description // "Unknown error"' 2>/dev/null || echo "$BODY"
fiReport success or failure. Common issues:
/start to the botDisplay the final configuration summary:
Telegram Notifications Configured!
Bot: @your_bot_username
Chat ID: 123456789
Format: Markdown
Events: session-end, ask-user-question
Config saved to: ~/.claude/.omc-config.json
You can also set these via environment variables:
OMC_TELEGRAM_BOT_TOKEN=123456789:ABCdefGHI...
OMC_TELEGRAM_CHAT_ID=123456789
To reconfigure: /oh-my-claudecode:configure-notifications telegram
To configure Discord: /oh-my-claudecode:configure-notifications discord
To configure Slack: /oh-my-claudecode:configure-notifications slackUsers can skip this wizard entirely by setting env vars in their shell profile:
export OMC_TELEGRAM_BOT_TOKEN="123456789:ABCdefGHIjklMNOpqrsTUVwxyz"
export OMC_TELEGRAM_CHAT_ID="123456789"Env vars are auto-detected by the notification system without needing .omc-config.json.
Set up Discord notifications so OMC can ping you when sessions end, need input, or complete background tasks.
This is an interactive, natural-language configuration skill. Walk the user through setup by asking questions with AskUserQuestion. Write the result to ${CLAUDE_CONFIG_DIR:-~/.claude}/.omc-config.json.
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
if [ -f "$CONFIG_FILE" ]; then
# Check for existing discord config
HAS_DISCORD=$(jq -r '.notifications.discord.enabled // false' "$CONFIG_FILE" 2>/dev/null)
HAS_DISCORD_BOT=$(jq -r '.notifications["discord-bot"].enabled // false' "$CONFIG_FILE" 2>/dev/null)
WEBHOOK_URL=$(jq -r '.notifications.discord.webhookUrl // empty' "$CONFIG_FILE" 2>/dev/null)
MENTION=$(jq -r '.notifications.discord.mention // empty' "$CONFIG_FILE" 2>/dev/null)
if [ "$HAS_DISCORD" = "true" ] || [ "$HAS_DISCORD_BOT" = "true" ]; then
echo "EXISTING_CONFIG=true"
echo "WEBHOOK_CONFIGURED=$HAS_DISCORD"
echo "BOT_CONFIGURED=$HAS_DISCORD_BOT"
[ -n "$WEBHOOK_URL" ] && echo "WEBHOOK_URL=$WEBHOOK_URL"
[ -n "$MENTION" ] && echo "MENTION=$MENTION"
else
echo "EXISTING_CONFIG=false"
fi
else
echo "NO_CONFIG_FILE"
fiIf existing config is found, show the user what's currently configured and ask if they want to update or reconfigure.
Use AskUserQuestion:
Question: "How would you like to send Discord notifications?"
Options:
If user chose Webhook:
Use AskUserQuestion:
Question: "Paste your Discord webhook URL. To create one: Server Settings > Integrations > Webhooks > New Webhook > Copy URL"
The user will type their webhook URL in the "Other" field.
Validate the URL:
https://discord.com/api/webhooks/ or https://discordapp.com/api/webhooks/If user chose Bot API:
Ask two questions:
Use AskUserQuestion:
Question: "Would you like notifications to mention (ping) someone?"
Options:
Ask: "What is the Discord user ID to mention? (Right-click user > Copy User ID, requires Developer Mode)"
The mention format is: <@USER_ID> (e.g., <@1465264645320474637>)
Ask: "What is the Discord role ID to mention? (Server Settings > Roles > right-click role > Copy Role ID)"
The mention format is: <@&ROLE_ID> (e.g., <@&123456789>)
Use AskUserQuestion with multiSelect:
Question: "Which events should trigger Discord notifications?"
Options (multiSelect: true):
Default selection: session-end + ask-user-question.
Use AskUserQuestion:
Question: "Custom bot display name? (Shows as the webhook sender name in Discord)"
Options:
Read the existing config, merge the new Discord settings, and write back:
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
mkdir -p "$(dirname "$CONFIG_FILE")"
if [ -f "$CONFIG_FILE" ]; then
EXISTING=$(cat "$CONFIG_FILE")
else
EXISTING='{}'
fiBuild the notifications object with the collected values and merge into .omc-config.json using jq:
# WEBHOOK_URL, MENTION, USERNAME are collected from user
# EVENTS is the list of enabled events
echo "$EXISTING" | jq \
--arg url "$WEBHOOK_URL" \
--arg mention "$MENTION" \
--arg username "$USERNAME" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications.discord = {
enabled: true,
webhookUrl: $url,
mention: (if $mention == "" then null else $mention end),
username: (if $username == "" then null else $username end)
}' > "$CONFIG_FILE"echo "$EXISTING" | jq \
--arg token "$BOT_TOKEN" \
--arg channel "$CHANNEL_ID" \
--arg mention "$MENTION" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications["discord-bot"] = {
enabled: true,
botToken: $token,
channelId: $channel,
mention: (if $mention == "" then null else $mention end)
}' > "$CONFIG_FILE"For each event NOT selected, disable it:
# Example: disable session-start if not selected
echo "$(cat "$CONFIG_FILE")" | jq \
'.notifications.events = (.notifications.events // {}) |
.notifications.events["session-start"] = {enabled: false}' > "$CONFIG_FILE"After writing config, offer to send a test notification:
Use AskUserQuestion:
Question: "Send a test notification to verify the setup?"
Options:
# For webhook:
curl -s -o /dev/null -w "%{http_code}" \
-H "Content-Type: application/json" \
-d "{\"content\": \"${MENTION:+$MENTION\\n}OMC test notification - Discord is configured!\"}" \
"$WEBHOOK_URL"Report success or failure. If it fails, help the user debug (check URL, permissions, etc.).
Display the final configuration summary:
Discord Notifications Configured!
Method: Webhook / Bot API
Mention: <@1465264645320474637> (or "none")
Events: session-end, ask-user-question
Username: OMC
Config saved to: ~/.claude/.omc-config.json
You can also set these via environment variables:
OMC_DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
OMC_DISCORD_MENTION=<@1465264645320474637>
To reconfigure: /oh-my-claudecode:configure-notifications discord
To configure Telegram: /oh-my-claudecode:configure-notifications telegram
To configure Slack: /oh-my-claudecode:configure-notifications slackUsers can skip this wizard entirely by setting env vars in their shell profile:
Webhook method:
export OMC_DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/..."
export OMC_DISCORD_MENTION="<@1465264645320474637>" # optionalBot API method:
export OMC_DISCORD_NOTIFIER_BOT_TOKEN="your-bot-token"
export OMC_DISCORD_NOTIFIER_CHANNEL="your-channel-id"
export OMC_DISCORD_MENTION="<@1465264645320474637>" # optionalEnv vars are auto-detected by the notification system without needing .omc-config.json.
Set up Slack notifications so OMC can message you when sessions end, need input, or complete background tasks.
This is an interactive, natural-language configuration skill. Walk the user through setup by asking questions with AskUserQuestion. Write the result to ${CLAUDE_CONFIG_DIR:-~/.claude}/.omc-config.json.
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
if [ -f "$CONFIG_FILE" ]; then
HAS_SLACK=$(jq -r '.notifications.slack.enabled // false' "$CONFIG_FILE" 2>/dev/null)
WEBHOOK_URL=$(jq -r '.notifications.slack.webhookUrl // empty' "$CONFIG_FILE" 2>/dev/null)
MENTION=$(jq -r '.notifications.slack.mention // empty' "$CONFIG_FILE" 2>/dev/null)
CHANNEL=$(jq -r '.notifications.slack.channel // empty' "$CONFIG_FILE" 2>/dev/null)
if [ "$HAS_SLACK" = "true" ]; then
echo "EXISTING_CONFIG=true"
[ -n "$WEBHOOK_URL" ] && echo "WEBHOOK_URL=$WEBHOOK_URL"
[ -n "$MENTION" ] && echo "MENTION=$MENTION"
[ -n "$CHANNEL" ] && echo "CHANNEL=$CHANNEL"
else
echo "EXISTING_CONFIG=false"
fi
else
echo "NO_CONFIG_FILE"
fiIf existing config is found, show the user what's currently configured and ask if they want to update or reconfigure.
Guide the user through creating a webhook if they don't have one:
To set up Slack notifications, you need a Slack incoming webhook URL.
CREATE A WEBHOOK:
1. Go to https://api.slack.com/apps
2. Click "Create New App" > "From scratch"
3. Name your app (e.g., "OMC Notifier") and select your workspace
4. Go to "Incoming Webhooks" in the left sidebar
5. Toggle "Activate Incoming Webhooks" to ON
6. Click "Add New Webhook to Workspace"
7. Select the channel where notifications should be posted
8. Copy the webhook URL (starts with https://hooks.slack.com/services/...)Use AskUserQuestion:
Question: "Paste your Slack incoming webhook URL (starts with https://hooks.slack.com/services/...)"
The user will type their webhook URL in the "Other" field.
Validate the URL:
https://hooks.slack.com/services/Use AskUserQuestion:
Question: "Would you like notifications to mention (ping) someone?"
Options:
Ask: "What is the Slack member ID to mention? (Click on a user's profile > More (⋯) > Copy member ID)"
The mention format is: <@MEMBER_ID> (e.g., <@U1234567890>)
The mention format is: <!channel>
The mention format is: <!here>
Use AskUserQuestion with multiSelect:
Question: "Which events should trigger Slack notifications?"
Options (multiSelect: true):
Default selection: session-end + ask-user-question.
Use AskUserQuestion:
Question: "Override the default notification channel? (The webhook already has a default channel)"
Options:
If override, ask for the channel name (e.g., #alerts).
Use AskUserQuestion:
Question: "Custom bot display name? (Shows as the webhook sender name in Slack)"
Options:
Read the existing config, merge the new Slack settings, and write back:
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
mkdir -p "$(dirname "$CONFIG_FILE")"
if [ -f "$CONFIG_FILE" ]; then
EXISTING=$(cat "$CONFIG_FILE")
else
EXISTING='{}'
fi
# WEBHOOK_URL, MENTION, USERNAME, CHANNEL are collected from user
echo "$EXISTING" | jq \
--arg url "$WEBHOOK_URL" \
--arg mention "$MENTION" \
--arg username "$USERNAME" \
--arg channel "$CHANNEL" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications.slack = {
enabled: true,
webhookUrl: $url,
mention: (if $mention == "" then null else $mention end),
username: (if $username == "" then null else $username end),
channel: (if $channel == "" then null else $channel end)
}' > "$CONFIG_FILE"For each event NOT selected, disable it:
# Example: disable session-start if not selected
echo "$(cat "$CONFIG_FILE")" | jq \
'.notifications.events = (.notifications.events // {}) |
.notifications.events["session-start"] = {enabled: false}' > "$CONFIG_FILE"After writing config, offer to send a test notification:
Use AskUserQuestion:
Question: "Send a test notification to verify the setup?"
Options:
# For webhook:
MENTION_PREFIX=""
if [ -n "$MENTION" ]; then
MENTION_PREFIX="${MENTION}\n"
fi
curl -s -o /dev/null -w "%{http_code}" \
-H "Content-Type: application/json" \
-d "{\"text\": \"${MENTION_PREFIX}OMC test notification - Slack is configured!\"}" \
"$WEBHOOK_URL"Report success or failure. Common issues:
Display the final configuration summary:
Slack Notifications Configured!
Webhook: https://hooks.slack.com/services/T00/B00/xxx...
Mention: <@U1234567890> (or "none")
Channel: #alerts (or "webhook default")
Events: session-end, ask-user-question
Username: OMC
Config saved to: ~/.claude/.omc-config.json
You can also set these via environment variables:
OMC_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
OMC_SLACK_MENTION=<@U1234567890>
To reconfigure: /oh-my-claudecode:configure-notifications slack
To configure Discord: /oh-my-claudecode:configure-notifications discord
To configure Telegram: /oh-my-claudecode:configure-notifications telegramUsers can skip this wizard entirely by setting env vars in their shell profile:
export OMC_SLACK_WEBHOOK_URL="https://hooks.slack.com/services/T00/B00/xxx"
export OMC_SLACK_MENTION="<@U1234567890>" # optionalEnv vars are auto-detected by the notification system without needing .omc-config.json.
| Type | Format | Example |
|---|---|---|
| User | <@MEMBER_ID> | <@U1234567890> |
| Channel | <!channel> | <!channel> |
| Here | <!here> | <!here> |
| Everyone | <!everyone> | <!everyone> |
| User Group | <!subteam^GROUP_ID> | <!subteam^S1234567890> |
All notification platforms require activation via CLI flags per session:
omc --telegram — Activates Telegram notifications (sets OMC_TELEGRAM=1)omc --discord — Activates Discord notifications (sets OMC_DISCORD=1)omc --slack — Activates Slack notifications (sets OMC_SLACK=1)omc --webhook — Activates webhook notifications (sets OMC_WEBHOOK=1)omc --openclaw — Activates OpenClaw gateway integration (sets OMC_OPENCLAW=1)Without these flags, configured platforms remain dormant. This prevents unwanted notifications during development while keeping configuration persistent.
Examples:
omc --telegram --discord — Telegram + Discord activeomc --telegram --slack --webhook — Telegram + Slack + Webhook activeomc --telegram --openclaw — Telegram + OpenClaw activeomc — No notifications sent (all platforms require explicit activation)Customize notification messages per event and per platform using omc_config.hook.json.
If the trigger or argument contains "hook", "template", or "customize messages" → follow this section.
Check if ${CLAUDE_CONFIG_DIR:-~/.claude}/omc_config.hook.json exists. If it does, show the current configuration. If not, explain what it does.
Hook event templates let you customize the notification messages sent to each platform.
You can set different messages for Discord vs Telegram vs Slack, and control which
events fire on which platform.
Config file: ~/.claude/omc_config.hook.jsonUse AskUserQuestion:
Question: "Which event would you like to configure templates for?"
Options:
Display the template variables available for the chosen event:
Available template variables:
RAW FIELDS:
{{sessionId}} - Session identifier
{{timestamp}} - ISO timestamp
{{tmuxSession}} - tmux session name
{{projectPath}} - Full project directory path
{{projectName}} - Project directory basename
{{reason}} - Stop/end reason
{{activeMode}} - Active OMC mode name
{{question}} - Question text (ask-user-question only)
{{agentName}} - Agent name (agent-call only)
{{agentType}} - Agent type (agent-call only)
COMPUTED (smart formatting):
{{duration}} - Human-readable duration (e.g., "5m 23s")
{{time}} - Locale time string
{{modesDisplay}} - Comma-separated modes or empty
{{iterationDisplay}} - "3/10" format or empty
{{agentDisplay}} - "2/5 completed" or empty
{{projectDisplay}} - Project name with fallbacks
{{footer}} - tmux + project info line
{{tmuxTailBlock}} - Recent output in code fence or empty
{{reasonDisplay}} - Reason with "unknown" fallback
CONDITIONALS:
{{#if variableName}}content shown when truthy{{/if}}Use AskUserQuestion:
Question: "Enter the message template for this event (use {{variables}} for dynamic content)"
Options:
If "Simple summary", use a pre-built compact template:
{{projectDisplay}} session ended ({{duration}}) — {{reasonDisplay}}Input needed on {{projectDisplay}}: {{question}}{{projectDisplay}} is idle. {{#if reason}}Reason: {{reason}}{{/if}}Session started: {{projectDisplay}} at {{time}}Use AskUserQuestion:
Question: "Do you want different messages for specific platforms?"
Options:
If per-platform: ask for each enabled platform's template separately.
Read or create ${CLAUDE_CONFIG_DIR:-~/.claude}/omc_config.hook.json and merge the new settings:
{
"version": 1,
"enabled": true,
"events": {
"<event-name>": {
"enabled": true,
"template": "<user-provided-template>",
"platforms": {
"discord": { "template": "<discord-specific>" },
"telegram": { "template": "<telegram-specific>" }
}
}
}
}Validate the template using validateTemplate() to check for unknown variables. If any are found, warn the user and offer to correct.
Offer to send a test notification with the new template.
{
"version": 1,
"enabled": true,
"events": {
"session-end": {
"enabled": true,
"template": "Session {{sessionId}} ended after {{duration}}. Reason: {{reasonDisplay}}",
"platforms": {
"discord": {
"template": "**Session Complete** | `{{projectDisplay}}` | {{duration}} | {{reasonDisplay}}"
},
"telegram": {
"template": "Done: {{projectDisplay}} ({{duration}})\n{{#if contextSummary}}Summary: {{contextSummary}}{{/if}}"
}
}
},
"ask-user-question": {
"enabled": true,
"template": "{{#if question}}{{question}}{{/if}}\nWaiting for input on {{projectDisplay}}"
}
}
}/oh-my-claudecode:configure-openclaw — Configure OpenClaw gateway integrationConfigure custom webhooks and CLI commands for services beyond the native Discord/Telegram/Slack integrations.
If the user says "custom integration", "openclaw", "n8n", "webhook", "cli command", or similar → follow this section.
If ~/.claude/omc_config.openclaw.json exists, detect and offer migration:
Step 1: Detect Legacy Config
LEGACY_CONFIG="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/omc_config.openclaw.json"
if [ -f "$LEGACY_CONFIG" ]; then
echo "LEGACY_FOUND=true"
# Check if already migrated
if jq -e '.customIntegrations.integrations[] | select(.preset == "openclaw")' "$CONFIG_FILE" >/dev/null 2>&1; then
echo "ALREADY_MIGRATED=true"
else
echo "ALREADY_MIGRATED=false"
fi
else
echo "LEGACY_FOUND=false"
fiStep 2: Offer Migration If legacy found and not migrated:
Question: "Existing OpenClaw configuration detected. Would you like to migrate it to the new format?"
Options:
If migrate:
omc_config.openclaw.json.omc-config.jsonomc_config.openclaw.json.bakStep 1: Select Integration Type
Question: "Which type of custom integration would you like to configure?"
Options:
Step 2: Gateway URL
Question: "What is your gateway/webhook URL?"
Validation:
Step 3: Authentication (Optional)
Question: "Does your gateway require authentication?"
Options:
<token>If Bearer: ask for token If Custom: ask for header name and value
Step 4: Events
Use AskUserQuestion with multiSelect:
Question: "Which events should trigger this integration?"
Options (with defaults from preset):
Default for OpenClaw: session-start, session-end, stop Default for n8n: session-end, ask-user-question
Step 5: Test
Question: "Send a test notification to verify the configuration?"
Options:
If test:
# For webhook integrations
curl -X POST \
-H "Content-Type: application/json" \
${AUTH_HEADER:+"-H \"$AUTH_HEADER\""} \
-d '{"event":"test","instruction":"OMC test notification","timestamp":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"}' \
"$WEBHOOK_URL"Show result (HTTP status, any error).
Step 6: Write Configuration
Merge into .omc-config.json:
{
"notifications": { /* existing native configs */ },
"customIntegrations": {
"enabled": true,
"integrations": [
{
"id": "my-openclaw",
"type": "webhook",
"preset": "openclaw",
"enabled": true,
"config": {
"url": "https://my-gateway.example.com/wake",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer ..."
},
"bodyTemplate": "{\\"event\\":\\"{{event}}\\",\\"instruction\\":\\"Session {{sessionId}} {{event}}\\",\\"timestamp\\":\\"{{timestamp}}\\"}",
"timeout": 10000
},
"events": ["session-start", "session-end"]
}
]
}
}Step 2: URL Ask for webhook URL (HTTPS required).
Step 3: Method Ask for HTTP method (GET, POST, PUT, PATCH, DELETE). Default: POST.
Step 4: Headers Ask for headers in "Name: Value" format, one per line. Default: Content-Type: application/json
Step 5: Body Template Show available template variables and ask for body template (JSON or other format).
Default:
{
"event": "{{event}}",
"sessionId": "{{sessionId}}",
"projectName": "{{projectName}}",
"timestamp": "{{timestamp}}"
}Step 6: Timeout Ask for timeout in milliseconds (1000-60000). Default: 10000.
Step 7: Events Multi-select events.
Step 8: Test and Save Same as preset flow.
Step 2: Command
Question: "What command should be executed? (single executable, no arguments)"
Example: curl, /usr/local/bin/my-script, notify-send
Validation:
Step 3: Arguments
Question: "Command arguments (use {{variable}} for dynamic values). Enter one per line."
Example:
-X
POST
-d
{"event":"{{event}}","session":"{{sessionId}}"}
https://my-api.com/notifyShow available template variables reference.
Step 4: Timeout Ask for timeout (1000-60000ms). Default: 5000.
Step 5: Events Multi-select events.
Step 6: Test and Save
For test, execute command with test values:
$COMMAND "${ARGS[@]//{{event}}/test}"Show stdout/stderr and exit code.
List existing:
jq '.customIntegrations.integrations[] | {id, type, preset, enabled, events}' "$CONFIG_FILE"Disable/Enable:
# Disable
jq '.customIntegrations.integrations = [.customIntegrations.integrations[] | if .id == "my-integration" then .enabled = false else . end]' "$CONFIG_FILE"
# Enable
jq '.customIntegrations.integrations = [.customIntegrations.integrations[] | if .id == "my-integration" then .enabled = true else . end]' "$CONFIG_FILE"Remove:
jq '.customIntegrations.integrations = [.customIntegrations.integrations[] | select(.id != "my-integration")]' "$CONFIG_FILE"All custom integrations support these template variables:
| Variable | Description | Example |
|---|---|---|
{{sessionId}} | Unique session ID | sess_abc123 |
{{projectPath}} | Full project path | /home/user/my-project |
{{projectName}} | Project directory name | my-project |
{{timestamp}} | ISO 8601 timestamp | 2026-03-05T14:30:00Z |
{{event}} | Event name | session-end |
{{duration}} | Human-readable duration | 45s |
{{durationMs}} | Duration in milliseconds | 45000 |
{{reason}} | Stop/end reason | completed |
{{tmuxSession}} | tmux session name | claude:my-project |
Session-end only:
{{agentsSpawned}}, {{agentsCompleted}}, {{modesUsed}}, {{contextSummary}}Ask-user-question only:
{{question}}src/notifications/template-variables.tssrc/notifications/validation.tssrc/notifications/presets.ts© Yeachan-Heo, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/configure-notifications of Yeachan-Heo/oh-my-claudecode.
Open the folder on GitHubat commit 454bae0
Configure Notifications next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Configure Notifications this skillYeachan-Heo/oh-my-claudecode | 40k | — | ~9.1k | Automated safety check: Warn | MIT | |
| Message Push0xranx/golembot | 322 | — | ~984 | Automated safety check: Pass | MIT | |
| n8n Binary Data Handlingczlonkowski/n8n-skills | 6.4k | — | ~3.9k | Automated safety check: Pass | MIT | |
| OpenClaw to NanoClaw Migrationnanocoai/nanoclaw | 31k | — | ~6k | Automated safety check: Notes | MIT | |
| Traul Message Searchdandaka/traul | 112 | — | ~3.9k | Automated safety check: Notes | AGPL-3.0 | |
| Lettabotletta-ai/lettabot | 327 | — | ~3.4k | Automated safety check: Pass | Apache-2.0 |
0xranx/golembot
Send proactive messages to IM groups or individual users via the gateway Send API.
czlonkowski/n8n-skills
Explains how n8n keeps file bytes in $binary apart from structured $json data, and how to read, write and preserve binary across nodes, agent tools and chat.
nanocoai/nanoclaw
Guides a conversational migration from an OpenClaw install to NanoClaw v2, carrying over identity, channel credentials, scheduled tasks and workspace files.
dandaka/traul
Drives the traul CLI to sync, search and monitor messages from Slack, Telegram, Discord, Linear, Gmail, WhatsApp, Claude Code sessions and Markdown files.
letta-ai/lettabot
Set up and run LettaBot - a multi-channel AI assistant for Telegram, Slack, Discord, WhatsApp, and Signal.
nanocoai/nanoclaw
Connects the first NanoClaw agent to a chat channel and proves delivery by having it send the operator a welcome direct message.
Yeachan-Heo/oh-my-claudecode
Sends a question or task to another locally installed agent CLI, such as Codex or Gemini, through omc ask and saves the answer as a file.
Yeachan-Heo/oh-my-claudecode
Charts a foggy effort into a map of decision tickets on the repo's issue tracker and works through them one per session, producing decisions rather than deliverables.
Yeachan-Heo/oh-my-claudecode
Runs an autonomous improvement loop on a repository: agents propose and execute plans, a tournament picks the winner by benchmark, and each round is recorded and plotted.
Yeachan-Heo/oh-my-claudecode
Takes a short product idea through requirements, design, planning, parallel implementation, QA cycles and multi-reviewer validation to produce working code.
Yeachan-Heo/oh-my-claudecode
Detects and gracefully cancels whichever OMC mode, autopilot, ralph, swarm, pipeline, or team, is currently active, then clears its state.
Yeachan-Heo/oh-my-claudecode
Maps a codebase directory by directory and writes linked AGENTS.md files, each pointing to its parent, to document what each area contains.
Categories
Configure notification integrations (Telegram, Discord, Slack) via natural language. Configure Notifications is an agent skill from Yeachan-Heo/oh-my-claudecode.
Configure Notifications fits situations like: productivity & Automation work in your project.
Run `npx skills add Yeachan-Heo/oh-my-claudecode --skill configure-notifications -a claude-code`. Or copy the skill folder (skills/configure-notifications in Yeachan-Heo/oh-my-claudecode) into .claude/skills/configure-notifications in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Yeachan-Heo/oh-my-claudecode --skill configure-notifications -a codex`. Or copy the skill folder (skills/configure-notifications in Yeachan-Heo/oh-my-claudecode) into .agents/skills/configure-notifications in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Yeachan-Heo/oh-my-claudecode --skill configure-notifications -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/configure-notifications, .gemini/skills/configure-notifications, .github/skills/configure-notifications and .opencode/skills/configure-notifications in your project.
Going by SKILL.md and its folder, Configure Notifications needs the command-line tools its instructions call (jq and curl) and credentials named BOT_TOKEN, USER_PROVIDED_TOKEN, OMC_TELEGRAM_BOT_TOKEN and OMC_DISCORD_NOTIFIER_BOT_TOKEN. Our summary lists: A credential in YOUR_TOKEN; A credential in BOT_TOKEN.
SKILL.md names 5 domains. In commands or code: hooks.slack.com, discord.com, api.telegram.org, discordapp.com and api.slack.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md flagged 3 warning(s): mentions a paste, webhook or tunnelling service often used to send data out. Read the flagged lines before installing; the check is not a guarantee either way.
Configure Notifications is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 9.1k tokens (SKILL.md is roughly 36k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Configure Notifications: Message Push (0xranx/golembot, 322 stars), n8n Binary Data Handling (czlonkowski/n8n-skills, 6.4k stars), OpenClaw to NanoClaw Migration (nanocoai/nanoclaw, 31k stars) and Traul Message Search (dandaka/traul, 112 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Yeachan-Heo (a GitHub user) maintains it in Yeachan-Heo/oh-my-claudecode, which has 39,751 GitHub stars. The repository holds 47 skills in this directory. The repository was last updated on October 8, 2026.
Source: Yeachan-Heo/oh-my-claudecode on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.