feat: reader-rendering correctness + privacy hardening (P1·S batch)
Close the five open P1·S items from TODO.md: - X-Robots-Tag: noindex on rss/atom/entries/files + a /robots.txt - absolutize relative content URLs against the sender's site - promote lazy-loaded images (data-src → src, strip loading="lazy") - strip XML-illegal control chars from generated feeds (keep emoji) - plain-text feed <title> (strip HTML, decode entities) Sender-base derivation lives on the EmailAddress value object (siteBaseUrl) instead of a misplaced favicon helper. Bump to 0.2.1 and document the changes in README + CLAUDE.md. Co-Authored-By: Claude Opus 4.7 <[email protected]>
This commit is contained in:
1 parent
81e46c9026
commit
97ce9a62b4
20 files changed
+414
-29
No files matched your search
@@ -22,6 +22,7 @@ kill-the-news keeps the same workflow while avoiding shared domains and shared d
|
||||
- Optional per-feed sender allowlist (`[email protected]` or `domain.com`)
|
||||
- RSS generation on demand (`/rss/:feedId`)
|
||||
- Atom feed at `/atom/:feedId`
|
||||
- Reader-friendly output: relative links/images absolutized to the sender's site, lazy-loaded images promoted (`data-src` → `src`), plain-text feed titles, and XML-illegal control characters stripped so feeds parse in strict readers
|
||||
- Per-feed favicon derived from the last sender's domain (`/favicon/:feedId`), cached and shown in feeds + admin
|
||||
- Automatic RFC 8058 one-click unsubscribe when a feed is deleted — stops newsletters from mailing the now-dead address
|
||||
- Email attachments stored in Cloudflare R2 and exposed as RSS enclosures (optional)
|
||||
@@ -131,6 +132,7 @@ Then enable email ingestion (Cloudflare Email Workers or ForwardEmail) and open
|
||||
- When using Option B (ForwardEmail), inbound webhook access is IP-restricted to ForwardEmail MX sources.
|
||||
- Admin auth uses a signed, `HttpOnly`, `Secure`, `SameSite=Strict` cookie.
|
||||
- Admin responses are `no-store` to avoid cache leakage.
|
||||
- Feed, entry, and attachment responses send `X-Robots-Tag: noindex`, and `/robots.txt` disallows `/rss`, `/atom`, `/entries`, `/files`, and `/admin`, so private feeds and emails are kept out of search engines.
|
||||
- For high-value feeds, set `Allowed senders` so only known sender addresses/domains are accepted.
|
||||
- You should use a strong admin password and rotate periodically.
|
||||
- All secret comparisons (admin password, proxy secret) use constant-time comparison to prevent timing attacks.
|
||||
|
||||
Reference in new issue
Block a user