I didn't want to pay for a newsletter email service so I built my own

matt building a treehouse
If you want something done right...

I wrote a whole post about setting up free newsletters for your website but it was all a lie. Sure, after your free trial runs out, you can still technically send newsletters for free. Manually. Painfully.

All these newsletter-management companies paywall the one vital feature I need: RSS updates. Sure, I could pay $100 a year for a service like MailerLite or MailChimp to automate the campaign I had already created, but I have less than ten subscribers, and most of them I coerced into signing up I know personally. Not worth it.

So I built my own

It runs on my Raspberry Pi. You can use it too if you want. I'm unreasonably proud of that name!

What is RSS? It's just an XML file that changes when websites update. You can see mine at https://mattsayar.com/feed.xml. Not every site has one, and RSS isn't cool anymore, which is why newsletters are more popular now. RIP Aaron Swartz

How?

I've been wanting an excuse to use Harper Reed's codegen workflow, and figured this was the perfect use case for it. It was! I started by spitballing with Claude 3.7 Sonnet, then used the aider workflow to watch it dance  ♪┏(・o・)┛♪

And dance it did. It really impressed the hell out of me. Just look at this slick architecture diagram it made! (RIP on mobile screens though)

┌─────────────┐     ┌───────────────┐     ┌───────────────┐
│  Website    │     │  Cloudflare   │     │    ntfy.sh    │
│  Form       │────▶│  Worker       │────▶│  (Subscribe)  │
└─────────────┘     └───────────────┘     └───────┬───────┘
                                                  │
                                                  ▼
┌─────────────┐     ┌───────────────┐     ┌───────────────┐
│  Email      │     │  RSS-to-Email │     │  Subscriber   │
│  Inbox      │◀────│  Service      │◀────│  Management   │
└─────────────┘     └───────┬───────┘     └───────────────┘
                            │
                            ▼
                    ┌───────────────┐
                    │  RSS Feed     │
                    │  Monitoring   │
                    └───────────────┘

The whole process required shoveling only $2.70 into Claude's gaping maw! Just don't ask how much time it took me to review, test, and troubleshoot, because I'll happily justify the time I spent 💫 learning 💫

Philosophical reflection

That said, I did spend a lot of time (hours) poking around the code it produced with VSCode, understanding it, wrangling dependencies, updating functions, changing my requirements, refactoring things that broke, and testing until I was happy with it and not too embarrassed to publish it. (Shoutout to Tailscale and repomix for making it easy to transfer files back and forth between my Raspberry Pi and my laptop for Claude collaboration).

When people say "you can't trust output from LLMs," I agree to a point, but it's impossible to know what all software in your life is doing. There's only so much you can do to protect your data, and everything is a tradeoff. Some people just accept that you need to sell your digital soul to one of the tech fiefdoms. Some people disable javascript everywhere and only browse with VPNs. Some people just block ads. Do you have any idea what software libraries are running your TV?

https://xkcd.com/2347/

I at least want to know what this code I'm creating is doing on my network, if only to understand how to fix it when it inevitably breaks. Code output from LLMs is the easiest to "trust but verify" by making sure it actually does what you want it to do. The stakes for this email newsletter service are so low. This isn't banking software, and if it was, I would expect nominal levels of scrutiny no matter who authors the code.

By the time I fully tweaked and tested everything, deployed it to my Raspberry Pi, and open-sourced it, I wasn't just vibe-coding anymore:

If an LLM wrote every line of your code but you've reviewed, tested and understood it all, that's not vibe coding in my book - that's using an LLM as a typing assistant. 

This project would never have left the ground without LLMs though. I left the artifacts of that collaboration in the repo like spec.md, todo.md, and prompt_plan.md for fun and transparency. There's plenty of room for improvement, but I'm generally happy with it. 

But it kinda sucks

Let me make excuses justify some of my decisions: the scope of this tool is tiny. It's intended for dozens, not hundreds, of subscribers. If that number gets high enough I'll just ante up for the fancy paid service. Besides, I'm not writing to get subscribers, I'm writing things that I'd want to read.

Also nobody else came up with a sweet name like rsspberry2email. Yeah yeah I'll get around to adding extra features sometime. Maybe. Feel free to open a PR! Today, this tool works for me and I refuse to let perfect be the enemy of good.

Someone already made something like this but better

But it was fun to do it myself! Also, I already migrated all my friends subscribers from the previous service to this service. I had told everybody not to expect emails from me anymore, and it's gonna be fun to see their reaction when this post is the first one they get emailed about. So meta.

And now, no pressure, but feel free to sign up for my newsletter:

But not too many people please!

Special shoutout to my wife who took care of so many things during the couple days I was driven like a man possessed to get this working! "But then why is this so far down the page and harder to read??" Well jeez I'm not trying to write a book here; this article is long enough!