Anthropic Statuspage webhook → ntfy forwarder + dashboard (bunko.me/claude-status)
  • Python 98.4%
  • Dockerfile 1.6%
Find a file
bunko 89fad90b3e Group component-update webhooks into one push per status
A single outage fans out to one component webhook per affected service (~4
within seconds), which meant ~4 separate ntfy notifications. Now component
updates are debounced into per-new_status groups: GROUP_WINDOW seconds (default
10) after the first update of a status arrives, one combined push is sent, e.g.
"4 components — degraded performance" listing the services + overall status. A
group of one falls back to the normal single-component format; different
statuses in the same window flush as separate groups. Set GROUP_WINDOW=0 to
disable.

- grouper.py: in-memory debounce buffer keyed by new_status; flush task detaches
  from its registry before the publish await so a late update starts a fresh
  group rather than being dropped; strong refs held so the loop can't GC a flush
  mid-await.
- notify.py: format_component_batch() builds the combined message (reuses the
  single formatter for batches of one).
- main.py: webhook routes component payloads through grouper.add() (incidents
  and everything else still push instantly); /health + dashboard show the window.
- .env.example: GROUP_WINDOW.

Verified live: 3 component webhooks within the window produced exactly one flush
and one ntfy publish; single + mixed-status cases behave correctly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:41:07 -05:00
app Group component-update webhooks into one push per status 2026-06-22 14:41:07 -05:00
.env.example Group component-update webhooks into one push per status 2026-06-22 14:41:07 -05:00
.gitignore Initial commit: claude-status webhook receiver 2026-06-21 22:06:07 -05:00
docker-compose.yml Persist received webhooks to SQLite 2026-06-21 22:23:10 -05:00