Everyone knows this situation: You are surfing the interwebs, and are coming across some audiofiles. You would love to listen to in your podcast player of choice. But there is no RSS feed - the very thing that makes a podcast a podcast. 1

Or, am I the only one? Because that is how I felt when I was looking for an easy to use online tool to generate one-off, static podcast RSS feeds. There are lots of commercial podcast hosting providers, Wordpress plugins, and entire open source projects providing everything an aspiring new podcaster needs. Stuff that we could only dream of, when we were hand-stitching the RSS feed for our Geekasmus podcast back in 2009!

But I don’t want to host yet another podcast. 2 I just have a couple files, that in my humble opinion should be offered in form of a podcast feed, too.

Introducing: Rebelfeeds

So, instead of doing the reasonable thing of hand-stitching my one-off RSS feed, or, probably more 2023-style, asking a large language model to do it for me in a short web chat, I built the generator I wanted: Rebelfeeds.

Screenshot of the rebelfeeds web application. It boasts a very bare-bones 3-column “design”.

Rebelfeeds is a, currently not very pretty, static, client-side web application, that allows you to generate RSS podcast feeds based on the information you enter in a form.

The first section is about the general metadata of the feed: Title, original authors, maybe the category and a short description. The middle section is the episode list: You can dynamically add any number of episodes, by linking to their audio-files and entering a title. The third section is where it is all coming together: It displays your data in a valid XML RSS podcast feed.

What you do with that feed is on you: Rebelfeeds doesn’t provide hosting for these files. So to be able to point your podcatcher to a valid URL that serves your newly created RSS feed, you need to upload it somewhere. A random pastebin service should do the trick, as long as your podcatcher isn’t too picky about the Content-Type of your RSS feed.

The name rebelfeeds comes from the fact that these feeds are not like the other feeds. They are not necessarily created by the original authors, but by people who just couldn’t accept that this content was not accessible as a real podcast. Rebels, creating the free and open internet that we always wanted. And because the RSS feeds are simply linking to the original files, no copyright is infringed.

These feeds are not the ideal solution of course: Many of them will be one-off feeds, created for individuals and never updated. But there is nothing that prevents anyone from updating an existing feed with new episodes. Ideally the original authors would create these feeds themselves. But maybe a rebelfeed as an example can help them with that decision by showing the great possibilities of RSS.

Limitations and Workarounds

Building this application as a static web app comes with some limitations, in the form of cross-origin resource restrictions. These restrictions are important, because they stop websites from accessing your data on other websites.

Serving permissive CORS (Cross-Origin Resource Sharing) headers is a way for a server to allow specific or any other websites client-side code to access this content. But for that you need the cooperation of the file hosting server owners, which we don’t necessary have in our case.

Luckily the audio HTML element allows playing files hosted on other origins. However, it doesn’t allow the client-side javascript code access to information like the filesize and mimetype of the audio file, for privacy reasons. Both of which are required for episode-items of podcast feeds. But: it does allow us to get the duration of the audio file.

So to give a reasonable guess of the mime-type, I look at the file ending (don’t do this server-side kids!), and for another guestimate of the file size, I multiply the audio duration by the average bitrate of those files (or by what I think they might be). The results are… mixed. But it’s the closest thing I can come up with right now.

Luckily I can also add the actual duration of the episode as an optional attribute to the RSS feed, so that at least the durations should be shown correctly, even if the filesizes are way off.

Side track: Side projects with svelte

The old side project rule applies: It’s not about the destination, it’s about the frameworks we learned along the way.

For this side project I chose the svelte frontend framework. I am not a frontend developer anymore. I used to be one, but then they changed what frontend development was, and then I wasn’t anymore. More and more levels of abstraction, loads of dependencies, not really my thing. As a professional, I need to be able to find my way around a React+Redux app, but it doesn’t spark joy, at least for me.

But I’ve been following svelte from afar, mainly because it was different: No virtual DOM, no separation of concerns, just a bunch of javascript, HTML, and CSS living in the moment. That always sounded more up my alley. sveltes concept of having behavior, markup, and style of one component all in one simple file resonated with me ever since I first read about it.

But I never tried it for myself, so a couple days ago I ran npm create svelte@latest rebelfeeds for the first time.

It was surprisingly easy to get started. Once I figured out that the error messages for HTTP 500 Internal Server Error messages of the vite development server can be found in the browser console (???!) I was a happy camper. sveltekit mostly gets out of the way, so much so that I wasn’t sure if I actually still have a client-side static web app in the end, because it seamlessly serves some server-side rendered content, too. But by adding a static adapter and prerender=true I finally got my static builds.

At times I had to look up how to do pretty basic things in javascript, and I’m far from sure that my solutions always are the right way to do things. Did I split my component in reasonable ways? Is this how you should handle state across components? Probably not. But it works.

I intend to keep working on this project for some more time, to add some features and do at least something design-wise. Whether or not rebelfeeds deserves its own domain, we will see. I’ll keep you updated.

  1. Yes, “spotify-exclusive podcasts” are in fact not podcasts, fight me. ↩︎

  2. At least right now. ↩︎