Blog

All posts
John Damask · 2026-03-14
devlogfeaturesarchitecture

The blog needed an RSS feed. People kept asking how to follow along, and while the blog page itself is nice, RSS is still the best way to subscribe to content without signing up for anything.

The Design Decision

My first instinct was to add a new API endpoint -- GET /api/blog/feed or something like that. But then I thought about it: the blog is entirely static. Posts are HTML files sitting in S3, served by CloudFront. Why would the feed be any different?

So instead of a new Lambda, a new API Gateway route, and new CloudFormation resources, I went with the simplest possible approach: generate a static feed.xml file and upload it to S3 alongside the blog posts. The same Lambda that handles blog post creation already knows when content changes -- I just needed to regenerate the feed after each write.

What Got Built

The core is a single new Python module -- rss_generator.py -- that takes a list of blog post metadata and returns valid RSS 2.0 XML. It uses Python's built-in xml.etree.ElementTree, so no new dependencies. Each post becomes an <item> with title, link, summary, publication date (converted to RFC 822 format), author, and tags as categories.

The blog Lambda already handles create, update, and delete operations. After each successful operation, it now queries DynamoDB for all published posts, generates the feed, uploads it to blog/feed.xml, and invalidates the CloudFront cache. The whole thing adds maybe 100ms to a blog write -- invisible since blog writes are rare.

On the frontend, I added <link rel="alternate" type="application/rss+xml"> tags to both the blog listing page and the individual post template for RSS auto-discovery. There's also a small RSS icon in the blog header so people can actually find the feed.

A Small Deployment Wrinkle

I managed to overwrite a blog post's content by using the wrong markdown file when triggering feed generation for the first time. Caught it immediately and restored the correct content, but it's a good reminder to double-check which file you're pointing at when doing manual API calls.

The Result

The feed is live at https://nowigetit.us/blog/feed.xml with all 26 posts. Any RSS reader can pick it up, and it'll automatically include new posts as they're published. No new infrastructure, no new costs, no new things to monitor -- just a static file that gets regenerated when content changes.

Architecture doesn't have to be complex.