Skip to content

Post: Monitor the delivery path, not just the alarm (ntfy 401 silent-failure health check)#25

Draft
clarkbw wants to merge 1 commit into
mainfrom
post/ntfy-401-delivery-path-health-check
Draft

Post: Monitor the delivery path, not just the alarm (ntfy 401 silent-failure health check)#25
clarkbw wants to merge 1 commit into
mainfrom
post/ntfy-401-delivery-path-health-check

Conversation

@clarkbw

@clarkbw clarkbw commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Draft blog post for review — do not merge until Bryan approves (merge = publish).

What it covers

The signalk-ntfy-relay v0.2.0 delivery-path health check. An expired ntfy access token made every SignalK alarm the relay published return 401 and silently vanish — the whole alarm-to-phone chain went dark, discovered only by accident while smoke-testing an unrelated plugin. Root-caused to the token via a read-only GET /v1/account (401), fixed with a proactive heartbeat + reactive consecutive-failure counting that raises notifications.ntfyRelay.deliveryFailed on a channel independent of the down phone (dashboard/voice), excluded from being forwarded back through the failing path.

Angle

Generalized beyond marine: the "who watches the watcher" / dead-man's-switch blind spot in any self-hosted alert pipeline (ntfy, Gotify, Pushover, HA, PagerDuty webhooks) — you monitor the thing but not the pipe that tells you about the thing. Applies the well-known Prometheus/Alertmanager Watchdog pattern to the outbound leg, done inside the relay rather than with a second service.

SEO

  • Slug packs the error strings: ntfy-401-silent-push-failure-delivery-path-health-check-heartbeat-dead-mans-switch
  • Real hooks in headings/body: ntfy responded 401, 401 Unauthorized, GET /v1/account, notifications.ntfyRelay.deliveryFailed
  • Tags: signalk, ntfy, notifications, push-notifications, monitoring, dead-mans-switch, self-hosted, marine
  • Links back to the earlier zero-dependency-relay post

Checks

  • bundle exec jekyll build succeeds (the one Liquid warning is a pre-existing issue in an unrelated 2026-06-05 post)
  • Code snippets are verbatim from committed signalk-ntfy-relay source (commits 66890b9 / 650796f, v0.2.0); all 29 plugin tests pass incl. the 4 new health-check tests
  • No canonical set (matches newest post convention; jekyll-seo-tag derives it)
  • No private-infra leakage (hostnames/addresses/paths generalized or omitted)

🤖 Generated with Claude Code

https://claude.ai/code/session_01Gs2y7PwtAtP63KXzcyNYrc

…failure health check)

Draft write-up of the signalk-ntfy-relay v0.2.0 delivery-path health check:
an expired ntfy token silently 401'd every alarm to nowhere; the fix is a
proactive /v1/account heartbeat + reactive consecutive-failure counting that
raises notifications.ntfyRelay.deliveryFailed on a channel independent of the
down phone. Generalized to any self-hosted alert pipeline (who-watches-the-
watcher / dead-man's-switch).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Gs2y7PwtAtP63KXzcyNYrc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant