A local Channel plugin that injects external notifications into Claude Code sessions in real-time.
No Discord, no Telegram — just a single HTTP POST to push messages into your conversation.
example2.mp4
Checking your email every time CI fails, then telling the agent "go check the CI result"?
Copying and pasting build error logs into the session manually?
Running a deploy script and opening another terminal to see if it finished?
With Pulse, you don't have to. Background processes send messages directly to your session.
Pulse is an event abstraction layer built on Claude Code's Channels protocol. Any local process that can make an HTTP call can communicate with your Claude Code session directly — no external messengers, no bot tokens, no accounts.
Hooks / Scripts / Cron
↓ HTTP POST localhost:3400/notify
Pulse MCP Server
↓ notifications/claude/channel
Real-time injection into Claude Code session
Pulse leverages Claude Code's Channels protocol. The MCP server registers with the claude/channel capability and forwards HTTP requests to the session via notifications/claude/channel.
/plugins → Add Marketplace → enter chsm04/pulse
Select pulse from the marketplace list → Install
claude --dangerously-load-development-channels plugin:pulse@pulseDeliver a notification to the Claude Code session.
curl -s -X POST localhost:3400/notify \
-H "Content-Type: application/json" \
-d '{"text":"Build failed!","source":"ci","level":"error"}'| Field | Type | Required | Description |
|---|---|---|---|
text |
string | Yes | Notification content |
source |
string | No | Origin identifier (ci, deploy, cron, etc.) |
level |
string | No | info | warn | error (default: info) |
Response: 204 No Content (x-pulse-id header contains the message ID)
curl localhost:3400/health
# {"status":"ok","port":3400,"session":"12345","pid":67890}examples/ci-watcher.sh — a ready-to-use hook script that watches GitHub Actions runs and reports results via Pulse.
Features:
- Finds Pulse port automatically via Claude Code PID
- Deduplicates notifications (no double alerts from
git push+gh pr create) - Supports
.ci-watch-ignorefor skipping specific workflows - Tracks multiple concurrent runs, reports each as it completes
Setup — add to ~/.claude/settings.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash /path/to/ci-watcher.sh",
"statusMessage": "CI watcher started...",
"async": true
}
]
}
]
}
}Requires gh, jq, curl.
example2.mp4
examples/build-notify.sh — a build wrapper that sends error logs to your session on failure.
Add to your build script — on failure, error logs are sent straight to your session:
#!/bin/bash
BUILD_OUTPUT=$(npm run build 2>&1)
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
# Send last 30 lines (trim if too long)
ERROR=$(echo "$BUILD_OUTPUT" | tail -30 | jq -Rsa .)
curl -s -X POST localhost:3400/notify \
-H "Content-Type: application/json" \
-d "{\"text\":$ERROR,\"source\":\"build\",\"level\":\"error\"}"
fiAdd one line at the end of your deploy script:
#!/bin/bash
docker compose up -d --build backend
curl -s -X POST localhost:3400/notify \
-H "Content-Type: application/json" \
-d '{"text":"backend deploy complete","source":"deploy","level":"info"}'# crontab -e
0 * * * * /path/to/backup.sh && curl -s -X POST localhost:3400/notify -H "Content-Type: application/json" -d '{"text":"Backup complete","source":"cron","level":"info"}' || curl -s -X POST localhost:3400/notify -H "Content-Type: application/json" -d '{"text":"Backup failed!","source":"cron","level":"error"}'#!/bin/bash
USAGE=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')
if [ "$USAGE" -gt 90 ]; then
curl -s -X POST localhost:3400/notify \
-H "Content-Type: application/json" \
-d "{\"text\":\"Disk usage ${USAGE}% exceeded!\",\"source\":\"monitor\",\"level\":\"warn\"}"
fi| Env Variable | Default | Description |
|---|---|---|
PULSE_PORT |
3400 |
HTTP server port |
- Localhost only (127.0.0.1)
- In-memory (resets on server restart)
- Requires
--dangerously-load-development-channelsflag to start - No authentication (local environment only)
MIT