v0.3.0
Highlights
Native feed detection
Kill-the-news now inspects incoming newsletters for a self-advertised Atom/RSS/JSON feed (rel=alternate links in the email HTML) and stores the discovered feeds per sender on the Feed aggregate. If a newsletter already publishes a real feed, you can subscribe to it directly — surfaced as chips on the feed detail page, a dashboard pill, and (read-only) on the REST Feed schema, with a dismissable notice.
Subscription confirmation surfacing
Confirmation emails ("click to confirm your subscription") are detected at ingestion and flagged on the feed. The admin UI surfaces the confirmation link, a badge, a dashboard pill, and an inline banner so a pending double-opt-in never gets silently stuck — all dismissable. Tightened to cut false positives via a weak-signal heuristic.
Read/write identity decoupling (privacy)
The public read id (FeedId, used in /rss/:feedId) is now fully decoupled from the inbound email address (MailboxId, noun.noun.NN). A feed's read URL never reveals its inbound alias and vice-versa — reading /rss/<noun.noun.NN> 404s.
Reader compatibility
- JSON Feed 1.1 output (
/json/:feedId) - OPML export of all feeds (
/admin/opml) - Conditional GET (ETag / Last-Modified / 304) on the feed routes
Admin & API
- Per-feed Subscribe chips for RSS/Atom/JSON with copy / open / validate actions, reused across dashboard and feed detail page
- Email detail page links to its public entry page
- Land on the feed's emails page right after creation
- Optional per-feed "sender in title" toggle
- Running version shown in the admin/status footer,
/health, and/api/v1/stats
Internal & release
- Sender display name, site URL and parsing now owned by the
EmailAddressvalue object (DDD cleanup) - Release version is derived from the git tag (
maincarries a-developsuffix; CI strips it and guards against tagging the wrong commit)
Full Changelog: v0.2.1...v0.3.0