mirror of
https://github.com/tiennm99/claude-status-webhook.git
synced 2026-04-17 15:20:37 +00:00
- /help: detailed guide with examples for all commands - /status: overall indicator, emoji markers, updated time, status page link - /history [count]: recent incidents with impact, dates, links (max 10) - /uptime: component health with last change time - Split info commands into bot-info-commands.js for modularity - Register all 7 commands in bot-setup.js
2.7 KiB
2.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project
Telegram bot that forwards status.claude.com (Atlassian Statuspage) webhook notifications to subscribed users. Hosted on Cloudflare Workers.
Commands
npm run dev— Start local dev server (wrangler dev, emulates KV + Queues locally)npm run deploy— Deploy to Cloudflare Workersnpx wrangler deploy --dry-run --outdir=dist— Verify build without deploying
No test framework configured yet. No linter configured.
Secrets (set via wrangler secret put)
BOT_TOKEN— Telegram bot tokenWEBHOOK_SECRET— Secret token in Statuspage webhook URL path
Architecture
Cloudflare Workers with two entry points exported from src/index.js:
fetch— Hono.js HTTP handler (routes below)queue— CF Queues consumer for fan-out message delivery
Routes
| Method | Path | Handler | Purpose |
|---|---|---|---|
| GET | / |
inline | Health check |
| GET | /webhook/setup/:secret |
bot-setup.js |
One-time: register bot commands + set Telegram webhook |
| POST | /webhook/telegram |
bot-commands.js |
grammY webhookCallback("cloudflare-mod") |
| POST | /webhook/status/:secret |
statuspage-webhook.js |
Receives Statuspage webhooks |
Data Flow
- Statuspage → Worker: Webhook POST → validate secret (timing-safe) → parse incident/component event → filter subscribers by preference →
sendBatchto CF Queue - Queue → Telegram: Consumer processes batches of 30 →
sendMessagevia raw fetch → auto-removes blocked subscribers (403/400), retries on 429 - User → Bot: Telegram webhook → grammY handles
/help,/start,/stop,/status,/subscribe,/history,/uptimecommands → reads/writes KV
KV Storage
Single key subscribers stores a JSON object keyed by composite subscriber ID:
- DM/group:
"chatId"→{ types: ["incident", "component"] } - Supergroup topic:
"chatId:threadId"→{ types: ["incident"] }
kv-store.js handles key building/parsing — threadId can be 0 (General topic), so null checks use != null not truthiness.
Supergroup Topic Support
Bot stores message_thread_id from the topic where /start was sent. Notifications and queue consumer include message_thread_id in sendMessage payload to target the correct topic.
Key Dependencies
- hono — HTTP routing framework
- grammy — Telegram Bot API framework (webhook mode for CF Workers)
- wrangler — CF Workers CLI (dev/deploy)
CF Bindings (wrangler.jsonc)
claude_status— KV namespaceclaude-status— Queue producer/consumer (batch size 30, max retries 3)