cruftcast: a private morning podcast made from my RSS feeds

I like podcasts, but sometimes the hosts can stretch out a story far too long.

So I built an app that turns my RSS feeds into a short 10-15 minute private podcast. Hence cruftcast was born.

I want a short podcast that provides updates on topics I care about. I don’t need a lot of banter, just a heads up on a weblog post or news item that I want to dig into more later.

I’m old, so I use RSS to help keep track of the topics I care about. Previously, I built an app, wireburst, that pushes all my RSS feeds into a private Discord server, instead of using a traditional RSS reader.

My idea was to use my RSS feeds as the basis for my custom morning podcast. The app runs in a Docker container on my home server.

The app does a few interesting things to pull this off.

To start, the app grabs the OPML that lists my RSS feeds and looks for new items in the last 24 hours. OPML is a structured list of the RSS feed subscriptions.

The app then sends an API call to Claude to review the new news/posts and pick stories on a range of criteria: category priority, per-blog caps (some people post too much), topic exclusions (judged by meaning rather than keywords), duplicate articles merged, etc. From that, Claude writes a script sized to the time desired. By default, it’s a 10-15 minute script.

A dark-themed settings panel for "Stories" configuration, showing fields for category priority (Weblog, Tech News), weblog settings, topic exclusions including filtered subjects like Trump and mobile phone news, excluded categories (Personal), excluded feed URLs from cruftbox.com, and article character limit set to 6000.

The script is then pushed to Microsoft’s Read Aloud service via edge-tts. FYI, edge-tts is an unofficial Python library that taps the same voices Microsoft Edge uses for Read Aloud. It’s not as perfect as ElevenLabs, but it’s FREE. Caveat: Since it’s unofficial, it can break when Microsoft changes things.

The resulting mp3 file can then be placed into the storage location you prefer, along with an updated RSS file. You can push to an external web server or store locally on the home server. If you run Tailscale, you can store on your home server and retrieve anywhere with your phone.

During testing, I added several settings to tune the podcast into what I wanted. I can set priority categories, topics I don’t want to hear about, what voice to use, and words edge-tts mispronounces (which Claude respells for the voice).

A dark-themed "Voice and sound" settings panel showing options for text-to-speech configuration, including a voice selector set to "Ava (female: expressive, caring, pleasant, friendly)," rate and pitch controls, chime settings, and a pronunciation correction table showing "Anthropic" spoken as "An thropic" and "404" spoken as "four oh four."

Right now, the app is just set up to use Claude for the LLM, but small code changes would open it to any LLM with API access. There is some token cost for API usage, but it’s pennies for these simple tasks.

Once everything is configured and tested, fire up your favorite podcast app and enjoy! For me, it’s a quick listen on morning dog walks.

A podcast app's "Unplayed" queue showing six subscriptions including American Power, Beekeeping Today Podcast, Cruftcast, Darknet Diaries, Decoder Ring, and Decoder: Ad-Free Edition, with episode counts and last-updated dates listed beneath each title.

Code is on GitHub at https://github.com/cruftbox/cruftcast

Author