Chris standing in a field with wildflowers and a cabin in the background.

Reclaiming My Media (or: How I Accidentally Learned Docker)

May 2025

This project was a bit of a Trojan horse. I went into it hoping to revive my old media collection, but it turned out to be a project about learning Docker. I tried to frame this blog similarly.

Background: Streaming Frustration

My frustration with streaming services has been growing for a while. I resented that I had to maintain subscriptions to so many streaming services, and that I couldn't keep track of which app hosted which content. I hated that those apps kept trying to serve me adds and/or to jack up my subscription prices. And despite the amount of money that we were spending, I often found that I couldn't find the media I was looking for. At one point I wanted to find a specific Bill Nye episode and learned that it was not available anywhere. I wanted to listen to Joni Mitchell but her music was not on Spotify in protest of Spotify's refusal to moderate Joe Rogan's content. The breaking point came during a recent vacation with my partner. We were sitting in a hotel room, hoping to watch the movie Wicked, which we knew had just been released to streaming somewhere. But even with all of our subscriptions, the only option was to pay $20 for a single-stream "rental". I had also just listened to a podcast episode featuring the author of Mood Machine about how Spotify has changed the way we listen to music, and the way the music industry has changed itself to adapt. Finally, this was right after the second Trump inauguration, and I had been fixating on all the photos of tech CEOs who attended.

I remember the day that we cancelled our cable subscription and went all-in on streaming services. That seemed like a great decision at the time, but about a decade later I felt frustrated and trapped by these platforms that didn't meet my needs and didn't serve my interests. They had become "enshittified", and it was time to move on.

This got me thinking about the way I used to interact with media. Before the streaming era, I enjoyed curating a personal iTunes library. I remember organizing my MP3 library, ripping CDs, and making physical mixtapes for friends.

Building My Own Streaming Server

So I decided to break up with big tech platforms: I canceled all of my streaming services, unsubscribed from Amazon Prime, deleted my social media accounts—and started building something new.

That something is a home server that I've named 'Arlington Slasher' (which started as a nickname for my mean cat). It's hosted on a refurbished Dell Thin Client I found on eBay. I installed Ubuntu Server, added an SSD for performance, and connected an external drive for media storage.

My partner and I both had our old iTunes libraries buried on an old hard drive at the back of a desk drawer. I spent a lot of hours merging and cleaning them (with the help of MusicBrainz Picard to clean the metadata). We were watching Severence at the time, so I joked that this process felt like "Macrodata Refinement." Despite the tedious task, this was both a labor of love and a nostalgia trip. I found songs I hadn’t listened to in years, that reminded me of specific moments and friends, and albums from local bands that we’d forgotten about and didn't exist anywhere online.

Once the server was ready and my files were organized, I explored tools that I could use to access this media. My criteria were that they be open source and have a nice mobile experience.

I selected Jellyfin for video files and Navidrome for music. Both offer experiences comparable to Netflix and Spotify. One huge difference is that they both operate on popular protocols, which means that there are a variety of mobile apps that can connect to them.

(For a bit more about why this difference matters, see the famous essay “Protocols, Not Platforms.” And once you're convinced, check out this t-shirt that my partner designed).

While I was at it, I got excited about a few other open source, self-hosted apps. I ended up installing:

Enter Docker

I did some research about the best way to host all this code, and quickly realized that Docker was the key to making everything simple, consistent, and maintainable.

Docker is a very popular open source system for deploying applications. The core concept of docker is the "container" - a container includes the application code and everything that is necessary to run it (including dependencies, and even an operating system). This makes it easy to deploy an entire web app with just a few commands. And each container is isolated - if Jellyfin and Naivdrome rely on different versions of the same dependency, they won't interfere with each other.

Before this project, I had heard of Docker, and had intentionally avoided it. I've never really enjoyed DevOps work, and didn't see it as relevant to my work. Now that I understand it, I want to use it for everything.

Docker Compose makes this even easier. I was able to manage multiple web apps from a single configuration file, where I also mapped which apps should be able to communicate with each other, where they should persist their data, and which ports they should expose.

In addition to Docker, I learned a few other exciting tools that made this project possible:

A More Intentional Media Experience

As we stepped away from commercial streaming, my partner and I set a goal to continue spending the same amount each month on media, but to spend that money more thoughtfully.

We've been buy music directly from artists on Bandcamp Fridays, when Bandcamp does not charge its processing fees to artists. We hope to attend more live music at local venues, and to attend performances at nearby Signature Theater. We also maintain our memberships with our local NPR station and rejoined our beloved independent music radio station, WNRN (which we had supported for years, and then cancelled around the same time we started using Spotify).

Docker at Work

I ended up putting all of this learning ot use in my professional life. For a recent class project, my students built some Django apps. Productionalizing these apps was beyond the scope of the class, but my students were proud of their work and wanted to make them available on the internet. I already felt comfortable enough with Docker and Docker Compose. A friend of our school and real-life DevOps engineer, Matt Gallagher, helped me with the Dockerfile and Github CI automation. I wrote about that setup here.

Reflection

This is the most excited I've been about a technical project in a long time. The quality of these open source projects was far beyond what I expected, and I’ve loved reconnecting with the music that was important to me in my high school and college years. Docker was less intimidating and more fun that I expected.

More importantly, this project helped revive my passion for the internet. The internet isn't just "five giant websites each filled with screenshots of the other four" - it's a wild and wonderful place where people can create whatever they can dream up and can share their creations for the benefit of everyone else, a place where you can turn a tiny, underpowered, nearly 10-year-old computer in a basement into a media server capable to unseating a whole industry of malevolent corporations.

I'm thankful to the open source community and hope I can pay it forward. If anyone is feeling the same burnout and looking to setup something similar, feel free to reach out - I'd love to help.