Skip to content

Engineering

Moving a 95-episode podcast to new infrastructure without dropping a feed

Scient Systems2 min read

Most infrastructure migrations fail quietly, in a staging environment, in front of nobody. A podcast migration is not like that. An RSS feed is a live contract with every podcast app a show's listeners use, and if you break it, thousands of people find out at the same moment their next episode does not appear.

That was the test we set for Fijjy: move Mentoring Developers, a podcast with 95 published episodes, off captivate.fm and onto our own infrastructure, without a single subscriber noticing the seam.

The feed is the real interface

It is tempting to think of a podcast as a collection of audio files. The system that actually matters is the feed. Every subscribed app remembers episodes by their identifiers, points at specific enclosure URLs, and expects the metadata to stay stable. A migration that regenerates any of that carelessly does not lose data so much as lie to every listener's app about what it is looking at.

So the cutover was designed around feed integrity first. Every historical episode, its metadata, and the feed that podcast apps subscribe to had to survive intact. Fijjy runs on self-hosted Castopod for hosting and RSS generation, which means the show owns its feed rather than renting it, and the migration had to hand that feed over without changing what subscribers already trusted.

Contract-first, because the contract was the point

Underneath, Fijjy is a Go API built contract-first with OpenAPI, backed by MongoDB as the system of record for recordings, guests, and production state. Building against an explicit contract is usually sold as a developer-experience win, and it is one. But on a migration like this it earned its keep differently: when the shape of the data is written down and enforced, moving an entire archive into it is a matter of meeting a specification, not guessing at one.

What "safe" actually looked like

Safe did not mean fast. It meant the archive and the live feed arrived together, every episode accounted for, and the apps on the other side kept working as if nothing had changed. The show runs on Fijjy today, and the most telling detail is that there is no dramatic story to tell about the day it switched. That silence was the deliverable.

The lesson generalizes past podcasts: when a system has a public contract, treat that contract as the thing you are migrating. Everything else is implementation.

Working on something like this?

Let’s talk it through.

Start a conversation