-
Record notification delivery on the incident timeline
Release / test (push) Failing after 8sRelease / build (amd64, darwin) (push) Has been skippedRelease / build (amd64, linux) (push) Has been skippedRelease / build (arm64, darwin) (push) Has been skippedRelease / build (arm64, linux) (push) Has been skippedRelease / docker (push) Has been skippedRelease / chart (push) Has been skippedRelease / release (push) Has been skippedreleased this
2026-08-07 11:31:03 +00:00 | 101 commits to main since this releaseAn incident's history went quiet after "Incident opened": nothing said
that anybody had been paged, reminded, or told it resolved. Delivery
lived only in the notifications outbox, which no API exposes, so when a
page failed to arrive there was nothing in the product that said whether
it had been sent.The notifier now writes two event types. A notified event once ntfy
accepts the publish, carrying the kind in detail and the paged user in
user_id — absent when the page went to the shared fallback topic, which
belongs to nobody. And a notify_failed event when a notification
exhausts its retries, which is the one worth having: without it a page
that never landed leaves the timeline identical to one that did.Both are written from the delivery result rather than at enqueue. A
queued notification is an intention, and the timeline is append-only, so
claiming somebody was told before ntfy accepted it would be a lie that
stays there. A failed timeline write is logged rather than returned, so
it cannot make a delivered row look unsent and send the page twice.The topic is deliberately in neither: it is a shared secret with the
ntfy server, and every API key can read the timeline.No migration — incident_events.type is free text, unlike
notifications.kind.Downloads