diff --git a/AGENTS.md b/AGENTS.md index 6222a7f..75e7afa 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ This file gives coding agents fast context for working in this repository. ## Project summary -Email-to-RSS is a Cloudflare Worker that ingests newsletters from ForwardEmail and exposes them as RSS feeds. +kill-the-news is a Cloudflare Worker that ingests email newsletters and exposes them as private RSS feeds. Core goals: diff --git a/README.md b/README.md index 063719e..b3781e2 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ -# Email-to-RSS +# kill-the-news -Convert email newsletters into a private RSS feed using Cloudflare Workers. +Convert email newsletters into private RSS feeds using Cloudflare Workers. -This project is self-hosted, uses your own domain, and keeps your data in your own Cloudflare account. +Self-hosted, uses your own domain, and keeps your data in your own Cloudflare account. Live at [kill-the.news](https://kill-the.news). ## Why this exists Many newsletters only support email delivery. RSS readers offer a better reading experience, but getting email-only newsletters into RSS usually means relying on shared third-party infrastructure. -Email-to-RSS keeps the same workflow while avoiding shared domains and shared data stores. +kill-the-news keeps the same workflow while avoiding shared domains and shared data stores. ## Features @@ -91,7 +91,7 @@ No third-party service required. Cloudflare receives the email and hands it dire 1. In the Cloudflare dashboard, go to _Email → Email Routing_ for your zone and click **Enable Email Routing**. Cloudflare will prompt you to add MX and SPF records — accept and it adds them automatically. 2. Under _Email Routing → Routing Rules_, add a **Catch-all** rule: - Action: **Send to Worker** - - Worker: `email-to-rss` (the name from `wrangler.toml`) + - Worker: `kill-the-news` (the name from `wrangler.toml`) That's it. No webhook configuration is needed. @@ -122,7 +122,7 @@ The Worker verifies each webhook request against ForwardEmail's published MX IP 6. Open `https://yourdomain.com/admin` and sign in. -> **Tip:** To verify the Worker is running, check _Workers & Pages → email-to-rss_ in the Cloudflare dashboard. The _Custom Domains_ tab should list your domain once the deploy succeeds. +> **Tip:** To verify the Worker is running, check _Workers & Pages → kill-the-news_ in the Cloudflare dashboard. The _Custom Domains_ tab should list your domain once the deploy succeeds. ## Development diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..7687cb7 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,595 @@ + + + + + + kill-the-news — Private newsletter feeds on Cloudflare Workers + + + + + + + + + + + + +
+
+
+ + Open Source · MIT · Free Tier +
+

Turn email newsletters into private RSS feeds

+

Self-hosted on Cloudflare Workers. Your data stays in your own account, served from your own domain.

+
+ + + View on GitHub + + Quick Start ↓ +
+
+ + +
+
+ +

Everything you need, nothing you don't

+

Built on serverless infrastructure — zero servers to maintain, no subscription fees.

+
+
+ +
+
+ +
+

Self-Hosted & Private

+

Your emails and feeds live exclusively in your own Cloudflare account. No shared infrastructure, no data mining.

+
+ +
+
+ +
+

Free Cloudflare Tier

+

Cloudflare Workers, KV, and Email Routing all fall within the generous free tier. Deploy at zero cost.

+
+ +
+
+ +
+

Your Own Domain

+

Subscribe to newsletters using addresses on your own domain (e.g. apple@yourdomain.com). No lock-in.

+
+ +
+
+ +
+

Two Ingestion Methods

+

Use Cloudflare Email Routing (no third-party) or ForwardEmail webhooks — whichever fits your setup.

+
+ +
+
+ +
+

Attachment Enclosures

+

Email attachments are stored in Cloudflare R2 and exposed as RSS enclosures — no extra hosting needed.

+
+ +
+
+ +
+

External Auth Support

+

Optionally delegate admin authentication to Authelia, Authentik, or any reverse proxy that sets Remote-User.

+
+ +
+
+ + +
+
+
+ +

Three steps, done

+

From email delivery to your RSS reader in milliseconds, with no moving parts.

+
+
+
+
1
+

Subscribe with your address

+

Create a feed in the admin UI and get a unique address like newsletter.42@yourdomain.com. Subscribe to any newsletter with it.

+
+
+
2
+

Worker ingests the email

+

When a newsletter arrives, Cloudflare routes it to your Worker. It parses the content and stores it in KV — attachments go to R2.

+
+
+
3
+

Read in your RSS reader

+

Your feed is live at /rss/:feedId. Add it to any RSS client and never miss an issue.

+
+
+
+
+ + +
+
+ +

Up and running in minutes

+

A single setup script handles KV namespaces, secrets, and wrangler.toml generation.

+
+ +
+
+ + Terminal +
+
# 1. Clone the repo
+$ git clone https://github.com/juherr/kill-the-news.git && cd kill-the-news
+
+# 2. Log in to Cloudflare
+$ npx wrangler login
+
+# 3. Run the interactive setup (creates KV, sets secrets, writes wrangler.toml)
+$ bash setup.sh
+
+# 4. Deploy to the edge
+$ npm run deploy
+
+ +
+

Then choose how emails reach your Worker:

+
+ +
+
Alternative
+

ForwardEmail Webhook

+

Point ForwardEmail MX records at your domain. ForwardEmail parses incoming mail and POSTs a JSON payload to /api/inbound.

+
+
+
+
+ + +
+
+ +

Built on reliable primitives

+

Minimal dependencies, maximum portability — runs entirely on Cloudflare's global network.

+
+
+ + + Cloudflare Workers + + + + Hono + + KV Storage + R2 Object Storage + + + TypeScript + + RSS 2.0 + Atom + postal-mime + Zod + Vitest +
+
+ + + + + + diff --git a/package.json b/package.json index df540a9..b6086e8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "email-to-rss", + "name": "kill-the-news", "version": "0.1.0", - "description": "A service that converts email newsletters to RSS feeds using Cloudflare Workers", + "description": "Convert email newsletters into private RSS feeds using Cloudflare Workers", "main": "dist/worker.js", "scripts": { "build": "wrangler deploy --dry-run --outdir=dist", diff --git a/setup.sh b/setup.sh index 387a0a8..5e73be7 100755 --- a/setup.sh +++ b/setup.sh @@ -2,7 +2,7 @@ set -euo pipefail -echo "🚀 Setting up Email to RSS service..." +echo "🚀 Setting up kill-the-news..." if ! command -v npm >/dev/null 2>&1 || ! command -v npx >/dev/null 2>&1 || ! command -v node >/dev/null 2>&1; then echo "❌ Error: Node.js (with npm and npx) is required but not found." @@ -17,7 +17,7 @@ fi WORKER_NAME="$(grep -E '^name = "' wrangler-example.toml | head -1 | cut -d'"' -f2)" if [ -z "$WORKER_NAME" ]; then - WORKER_NAME="email-to-rss" + WORKER_NAME="kill-the-news" fi echo "📦 Installing dependencies..." diff --git a/wrangler-example.toml b/wrangler-example.toml index 6447cd4..3dfd8b5 100644 --- a/wrangler-example.toml +++ b/wrangler-example.toml @@ -1,4 +1,4 @@ -name = "email-to-rss" +name = "kill-the-news" main = "src/index.ts" compatibility_date = "REPLACE_WITH_COMPATIBILITY_DATE" compatibility_flags = ["nodejs_compat"]