Add notification channels and a provider abstraction

Users get a notification_channels table (replacing users.ntfy_topic); pages fan
out to every enabled channel through a notify.Provider registry, with ntfy as
the first provider. Fallbacks are typed {type, address}. Schema edited in place:
existing databases must be recreated.

Claude-Session: https://claude.ai/code/session_016mBLURvJoMuUEr9cB2RpUN
This commit is contained in:
Niklas Ye
2026-10-12 21:00:40 +02:00
parent 6292ad6708
commit b114251f45
42 changed files with 2200 additions and 611 deletions
+10
View File
@@ -826,6 +826,16 @@ details[open] > summary { margin-bottom: 8px; }
.pw-form { display: grid; gap: 12px; padding: 16px; }
.account-fold { border-top: 1px solid var(--border); padding-top: 12px; }
.account-fold .stacked-form { margin-top: 8px; }
/* Notification channels on the Account page: a row per channel, the kind and
address on the left and its actions under or beside them. Wrapping rather
than a fixed grid, because an address can be as long as a topic is secret. */
.channels { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; }
.channel { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; }
.channel.off .channel-main { opacity: 0.6; }
.channel-main { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; min-width: 0; }
.channel-main code { overflow-wrap: anywhere; }
.channel .row-actions { margin-top: 0; gap: 6px; }
.form-ok {
margin: 0; padding: 10px 12px;
background: var(--ok-soft); color: var(--ok);