Om meldingen van Claude Code naar Telegram, Slack of Discord te sturen, maak je in die app een bot of een incoming webhook aan en voeg je een Claude Code-hook toe die er met curl een kort bericht naartoe stuurt. Een Notification-hook dekt "Claude heeft je toestemming nodig" en "Claude wacht op je", en een Stop-hook dekt "Claude is klaar". Voor Telegram heb je een bottoken en je chat-ID nodig, voor Slack en Discord alleen een webhook-URL. Hetzelfde script werkt op Mac en Linux, en een korte PowerShell-versie dekt Windows.
01Voordat je begint: het bericht en het geheim
Elke hook krijgt JSON binnen via standard input. De nuttige velden zijn hook_event_name, cwd (de projectmap), message bij Notification-events en last_assistant_message bij Stop-events. De voorbeelden hieronder maken daar één regel van, zoals Claude needs you in my-app: Claude needs your permission to use Bash.
Bottokens en webhook-URL's zijn wachtwoorden: wie er een heeft, kan berichten plaatsen als jouw bot. De documentatie van Slack zegt duidelijk dat je webhook-URL's niet moet delen of in versiebeheer moet committen. Bewaar ze in een apart bestand dat alleen jij kunt lezen:
mkdir -p ~/.claude
touch ~/.claude/chat-notify.env
chmod 600 ~/.claude/chat-notify.env
02Telegram: een bot die je berichten stuurt
- Open in Telegram een chat met @BotFather, stuur
/newboten volg de stappen. Je krijgt een token terug zoals123456789:AA.... - Open een chat met je nieuwe bot en stuur hem een willekeurig bericht, zodat hij jou terug mag berichten.
- Zoek je chat-ID op. Open deze URL met je token en zoek naar
"chat":{"id":in het antwoord:
curl "https://api.telegram.org/bot<TOKEN>/getUpdates"
- Zet beide waarden in
~/.claude/chat-notify.env:
SERVICE=telegram
TELEGRAM_TOKEN=123456789:AA...
TELEGRAM_CHAT_ID=987654321
De sendMessage-methode van Telegram neemt chat_id en text (1 tot 4.096 tekens). Hij accepteert ook disable_notification=true, waarmee het bericht zonder geluid binnenkomt. Het script gebruikt dat voor "klaar"-berichten en houdt het geluid aan voor toestemmingsverzoeken.
03Slack: een incoming webhook
- Maak een Slack-app aan op api.slack.com/apps (of open een bestaande).
- Zet onder Incoming Webhooks de optie Activate Incoming Webhooks aan.
- Klik op Add New Webhook to Workspace, kies een kanaal en selecteer Authorize.
- Kopieer de URL die begint met
https://hooks.slack.com/services/.
SERVICE=slack
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T000/B000/XXXX
Elke webhook post naar één kanaal, dat je kiest bij het aanmaken, en je kunt de naam of het icoon niet per bericht aanpassen. Een klein privékanaal voor jezelf werkt het best, zodat de melding niet ondersneeuwt in een druk kanaal.
04Discord: een kanaalwebhook
- Open in je server Server Settings, dan Integrations en dan Webhooks.
- Maak een webhook aan, kies het kanaal en kopieer de URL.
SERVICE=discord
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/1234/abcd
Het execute-webhook-endpoint van Discord verwacht een JSON-body met content (maximaal 2.000 tekens) en optioneel username om de naam van de webhook te overschrijven.
05Het hookscript (Mac en Linux)
Sla dit op als ~/.claude/chat-notify.sh en voer chmod +x ~/.claude/chat-notify.sh uit. Je hebt curl en jq nodig (brew install jq of apt install jq).
#!/bin/sh
. "$HOME/.claude/chat-notify.env"
input=$(cat)
event=$(printf '%s' "$input" | jq -r '.hook_event_name')
project=$(basename "$(printf '%s' "$input" | jq -r '.cwd')")
if [ "$event" = "Stop" ]; then
detail=$(printf '%s' "$input" | jq -r '(.last_assistant_message // "") | .[0:300]')
text="Claude finished in $project. $detail"
quiet=true
else
detail=$(printf '%s' "$input" | jq -r '.message // "Needs your attention"')
text="Claude needs you in $project: $detail"
quiet=false
fi
case "$SERVICE" in
telegram)
curl -s "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
--data-urlencode "chat_id=$TELEGRAM_CHAT_ID" \
--data-urlencode "text=$text" \
--data-urlencode "disable_notification=$quiet" > /dev/null ;;
slack)
jq -n --arg t "$text" '{text: $t}' | curl -s -X POST \
-H 'Content-Type: application/json' --data @- "$SLACK_WEBHOOK_URL" > /dev/null ;;
discord)
jq -n --arg t "$text" '{content: $t, username: "Claude Code"}' | curl -s -X POST \
-H 'Content-Type: application/json' --data @- "$DISCORD_WEBHOOK_URL" > /dev/null ;;
esac
exit 0
De JSON opbouwen met jq -n --arg is belangrijk: de antwoorden van Claude bevatten aanhalingstekens, backslashes en regeleinden, en als je die met de hand in een JSON-string plakt, breekt het request.
Test het voordat je het koppelt:
echo '{"hook_event_name":"Notification","cwd":"/tmp/demo","message":"Test"}' | ~/.claude/chat-notify.sh
06Voeg de hooks toe
In ~/.claude/settings.json, binnen het bestaande hooks-object als dat er al is:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt|idle_prompt",
"hooks": [{ "type": "command", "command": "~/.claude/chat-notify.sh" }]
}
],
"Stop": [
{
"hooks": [{ "type": "command", "command": "~/.claude/chat-notify.sh", "async": true }]
}
]
}
}
Start een nieuwe Claude Code-sessie zodat de hooks geladen worden. idle_prompt en Stop overlappen: Stop gaat af zodra Claude klaar is, en idle_prompt zo'n minuut later als je niets hebt getypt. Houd ze allebei, of laat er een weg; de ntfy-gids legt de afweging uit.
07Windows (PowerShell)
Sla op als %USERPROFILE%\.claude\chat-notify.ps1. Deze versie post naar Discord; verander voor Slack de body in @{ text = $text } en pas de URL aan.
$url = 'https://discord.com/api/webhooks/1234/abcd'
$in = [Console]::In.ReadToEnd() | ConvertFrom-Json
$project = Split-Path $in.cwd -Leaf
if ($in.hook_event_name -eq 'Stop') { $text = "Claude finished in $project." }
else { $text = "Claude needs you in ${project}: $($in.message)" }
$json = @{ content = $text; username = 'Claude Code' } | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri $url -ContentType 'application/json; charset=utf-8' `
-Body ([Text.Encoding]::UTF8.GetBytes($json)) | Out-Null
Hook-entry:
{
"type": "command",
"shell": "powershell",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File \"$HOME\\.claude\\chat-notify.ps1\""
}
Gebruik binnen WSL het script voor Mac en Linux.
08Goed om te weten over chatapps als notifier
- Wat je verstuurt, verlaat je computer. Het "klaar"-bericht bevat het begin van het antwoord van Claude. In een gedeeld Slack- of Discord-kanaal kan iedereen dat lezen. Laat
$detailweg als je code privé is. - Chatapps bundelen en dempen. Een drukke workspace of een gedempte server kan de melding verbergen. Een speciale push-app zoals ntfy (zie de ntfy-gids) raakt minder snel iets kwijt.
- Hooks weten niet of je achter je bureau zit.
Stoppost elke keer.idle_promptenpermission_promptkomen het dichtst bij een ingebouwd "afwezig"-filter.
09Waar Claude Code Notifier in past
Een webhook is een prima manier om bij te houden wat Claude heeft gedaan, en voor een team kan het precies het juiste middel zijn. Voor iemand die op de melding wil reageren, schiet het tekort: je leest dat Claude toestemming nodig heeft en loopt dan terug naar de terminal om die te geven. Een Telegram-bot kan in principe antwoorden ontvangen, maar dan moet je zelf de hook schrijven die erop wacht en een beslissing teruggeeft.
Claude Code Notifier regelt dat deel. Met een gekoppelde telefoon sta je een toestemmingsverzoek eenmalig of voor de hele sessie toe of weiger je het, beantwoord je de meerkeuzevragen van Claude en stuur je een vervolginstructie als Claude klaar is, allemaal vanaf je telefoon. Heb je in de laatste 30 seconden getypt, dan vraagt de terminal het gewoon en wacht er niets op je telefoon. Het is onafhankelijk, niet gemaakt door Anthropic, en ccn draait op Mac, Windows en Linux. Bekijk hoe het zich verhoudt tot alternatieven, de ccn-pagina en de prijzen.
10FAQ
Kan Claude Code zonder script naar Slack posten?
Claude Code heeft http-hooks die de JSON van de hook naar een URL POSTen, maar webhooks van Slack en Discord verwachten hun eigen body-formaat (text of content), dus een directe http-hook naar die diensten werkt niet. Je hebt een klein script of een relay ertussen nodig.
Hoe vind ik mijn Telegram-chat-ID?
Stuur je bot een bericht en open dan https://api.telegram.org/bot<TOKEN>/getUpdates. Het getal na "chat":{"id": is je chat-ID. Voor een groep voeg je de bot eerst aan de groep toe en stuur je daar een bericht.
Kun je Claude Code beantwoorden vanuit Slack of Discord?
Niet met een incoming webhook, want die kan alleen berichten plaatsen. Om te antwoorden heb je een hook nodig die op je reactie wacht en een beslissing teruggeeft, en daar zijn remote-approval-tools juist voor gemaakt.
Maakt de hook Claude Code trager?
De Stop-entry gebruikt "async": true, dus die verstuurt op de achtergrond. Notification-hooks draaien al naast Claude zonder het te blokkeren.