No reviewers
Labels
No labels
area:ai
area:ci-cd
area:notifications
area:observability
area:public-pages
backlog
bug
duplicate
enhancement
help wanted
invalid
question
type:decision
type:feature
type:infra
type:maintenance
type:security
v1.0.1
v1.1.0
v1.2.0
v1.3.0
v2.0.0
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
rbrooks/WeatherBot!112
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/v1.5.0-phase2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Two independent "notification reach" features.
#72 — ntfy channel
Self-hosted push via ntfy, following the one-file-per-channel notifier pattern.
ChannelType.ntfy+ migration 0025 (ALTER TYPE ADD VALUE, per the 0021 pattern).notifiers/ntfy.py:send_alert/send_alert_liftedPOST the shared-formatter body to{server_url}/{topic}withTitle/Priority/Tagsheaders; Bearer-token or Basic auth; severity→priority default. Raises Transient/Permanent delivery errors per the outbox contract (5xx/429/network → transient; other 4xx / missing topic → permanent). Non-ASCII header values are RFC-2047 encoded.NtfyConfigschema (topic required,server_urlhttp(s), priority 1-5) in the per-type validation; secret config keys redacted.channels.html(type option, config fieldset, payload builder, card icon 📣).#75 — per-location alert feeds (JSON / RSS / iCal)
GET /p/{location_id}.json|.rss|.ics, defined before the/p/{token}catch-all (PublicToken alphabet has no dots → no collision). Gated byLocation.public_enabled+public_rate_limit, mirroring the existing per-location public page and exposing the same active alert set.services/feeds.py: stdlib-only RSS 2.0 + RFC-5545 iCal builders (XML escaping; iCal escaping + 75-char folding). No new dependencies.SentAlerthas noonset/area_desc(those live onNWSAlertSnapshot), so those are null /DTSTARTfalls back tosent_at— a snapshot-join backfill is a possible follow-up (also relevant to the upcoming #84).Testing (dev server)
ruff clean; 30 new feature tests pass; bulk suite 700 passed; migration 0025 applied on a restored copy of the real dev DB (ntfy enum value present).
Closes #72, #75
🤖 Generated with Claude Code
Self-hosted push via ntfy, following the one-file-per-channel notifier pattern. - New ChannelType.ntfy + migration 0025 (ALTER TYPE ADD VALUE, per the 0021 pattern / env.py single-transaction note). - app/services/notifiers/ntfy.py: send_alert / send_alert_lifted POST the shared- formatter message body to {server_url}/{topic} with Title/Priority/Tags headers; Bearer-token or Basic auth; severity→priority default (advisory 3/watch 4/warn 5). Raises Transient/Permanent delivery errors per the outbox contract (5xx/429/network → transient, other 4xx / missing topic → permanent). Non-ASCII header values are RFC-2047 encoded. - NtfyConfig schema (topic required, server_url http(s), priority 1-5) wired into the per-type config validation; topic/token/credentials treated as secret config. - Wired into both dispatch chains (send_alert, send_alert_lifted). Like email/ pushover/sms, ntfy carries NWS alerts + all-clears (the SPC/forecast/AI chains are discord+webhook-only by design). - channels.html: type option, #config-ntfy fieldset, payload builder, card icon. Web Push (VAPID + service worker + subscription mgmt) remains a separate larger follow-on. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>Public locations are now consumable by homelab automations (Home Assistant, etc.). - GET /p/{location_id}.json|.rss|.ics in public.py, defined before the /p/{token} catch-all so the extensions resolve first (PublicToken alphabet has no dots, so no collision). Gated by Location.public_enabled + the public_rate_limit dependency, mirroring the existing /api/locations/{id}/public page and exposing the same active dashboard-record alert set. - app/services/feeds.py: stdlib-only RSS 2.0 and RFC-5545 iCal builders (proper XML escaping; iCal text escaping + 75-char line folding). No new dependencies. Note: SentAlert has no onset/area_desc columns (those live on NWSAlertSnapshot), so those fields are null / DTSTART falls back to sent_at — a snapshot-join backfill is a possible follow-up. Full suite green on the dev server: 700 passed; migration 0025 verified on a real-DB copy. Closes #72, #75 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>