Music Sovereignty

Table of Contents
  1. Tl;dr
  2. Introduction
  3. Where to buy
  4. Indexing the media
  5. Jellyfin
  6. Uploading music to Jellyfin
  7. Keeping it secure
  8. The whole cycle
  9. What about discovering new music?
  10. Turning it up to 11
  11. Adding new features
  12. A million Enough songs in your pocket
  13. Maintenance
  14. Wrapping it up

Tl;dr

Running micro-scale personal streaming service is very doable in 2026. Secure, private, and easier to directly support artists who will notice real revenue versus fractions of a penny per stream. If terms like Docker Compose or Tailscale don’t scare you away, it’s worth a go.

Introduction

Like most people, I’ve had a music streaming subscription for over a decade in one form or another. Sometimes I’ll shift between services, or pause subscriptions for a period of time. I remember signing up for Spotify in its very early USA launch and not really looking back.

However, one of my biggest takeaways from 2025 is that the future I want to grow ought to be one of care and not one of scale. Consumers trade a lot for convenience when it comes to streaming, never mind artists who are paid fractions of a penny for each listen. Artists can’t reasonably expect to make much of anything on a release, even if it gets a million listens.

While reading this, listen to one of my favorite tracks, The Wolves and the Ravens by Rogue Valley! Based in Minneapolis, but inspired by the craggy cliffs of the Pacific Northwest. Two of my favorite places and one of my favorite tracks, all at the same time.

Where to buy

To that end, I no longer pay for music streaming services. I’ve been trying to find ways to “go local” with my music collection from sources like Bandcamp, Subvert.fm, and Qobuz for digital downloads, and thrifting CDs as well. It’s really satisfying to buy a stack of CDs for a couple of dollars and rip them to my digital collection, or to find or rediscover favorite artists.

Bandcamp, for all its faults, still is the center of independent music gravity, as near as I can tell. Subvert is very new, but promising, and I’m hopeful that it will become the spiritual successor to Bandcamp in the future.

Qobuz is interesting because it provides DRM-free, high quality downloads and streaming for basically everything else. It seems to field more royalties to artists than other options, too, so it’s a good backstop for getting media that I can’t find elsewhere.

Indexing the media

Once I’ve got a pile of audio files, I need a way to organize it. This comes in two parts:

  1. The files themselves, sitting in folders on disk. I just put them in my ~/Music folder on my computer, organized by artist, and then by album. Tracks are numbered in the title. Something like ~/Music/Sigur Rós/02 Glósóli.m4a.
  2. The ID3 tags, which contain all of the really rich details around the tracks: album art, release date, etc.

As much “fun” as it would be to manually maintain build all these folders or write the tags on all of these files, there are terrific tools for doing this automatically. I rely on Picard, which is powered by Musicbrainz. Picard takes care of:

  • Identifying tracks and matching them to albums
  • Showing the data that’s there and any proposed changes
  • Letting me manually make edits as needed
  • Instantly saving changes when I tell Picard to “make it so”

I’ve manually added a handful of records and album art data that’s been missing in Musicbrainz to try and give back, but on the whole it’s all in there.

From there, I have a well organized, sorted, and tagged pile of plain audio files. The next step is the listening experience.

Jellyfin

Jellyfin lets you serve up private media collections to personal devices. If you’re willing to set it all up, it can share eBooks, movies, TV shows, and even live TV. For me, I just need it for my music collection. It’s similar to Plex, but seemingly more open and with fewer frills. I can run it where, when, and how I need to, and that’s what works for me.

Jellyfin needs a machine to run on. That machine needs to be online in order for music playback to work. I started out with running it on my laptop, but eventually wanted to move it somewhere that was always on. I rent a machine from a cloud hosting provider for Jellyfin. It doesn’t need much in the way of CPU or memory, as streaming music doesn’t take all that much work generally.1

Uploading music to Jellyfin

With Jellyfin installed on that remote server2, the next thing I need is a way to get my indexed music library into Jellyfin. This is easier said than done. I honestly expected Jellyfin to have a media manager feature of some kind, but I couldn’t find one and I didn’t really want to load arbitrary plugins into my system. Keeping the setup as simple as possible matters for long-term maintenance here.

Enter Syncthing, one of the simplest and most robust tools I’m aware of for keeping two folders in sync no matter where they are. It’s like Dropbox, but open source and private. Best of all, it’s free to use.

I installed Syncthing on my laptop and server, configuring it to mirror my local machine up to the server. Any changes I make locally (adding new music, updating things with Picard) are pushed up automatically in the background to the remote server.

Jellyfin periodically scans for new content (and I can manually trigger a scan from the Jellyfin admin panel). Once the scan completes, I can browse & playback the media from my browser or the Jellyfin app.

Keeping it secure

I don’t trust the internet. I can’t watch server logs constantly, and playing cat-and-mouse with whatever is out looking for vulnerable servers on the internet is just not worth it.

Sometimes, the winning move is not to play at all - or, better yet, play a different game altogether.

Hence, that cloud server is not available over the public internet. It can call out but it has no public IP address attached to it. This means it’s effectively invisible to anyone on the internet.

Instead, I use Tailscale, a lightweight VPN that connects all my devices as though they’re sitting in the same room. Whether my server is available over the internet or not, my personal devices can access it, stream music, and I can get in to maintain the system or provide updates.

The whole cycle

From here, my process looks something like this:

  1. Rip CDs I find in thrift shops, or buy tracks as close to the artist as possible
  2. Run them through Picard to make sure the metadata is correct and it’s all organized as I’d like
    1. If Picard fails to identify something, I take a detour through editing Musicbrainz so it has what it needs to update everything
  3. Wait for Syncthing to push the changes up to the server, and re-run the Jellyfin sync task
  4. Listen to cool tunes (more on this below)

What about discovering new music?

All of this is great once you have music. But, how do you find and curate the music to listen to in the first place?

Admittedly, I haven’t fully cracked discovery yet, and that’s probably the next big frontier for me. For now, I’m mostly taking more time to learn about the artists behind music I do like, and organically growing my library a bit at a time.

One of the benefits of going local/small like this is that you have to be picky about what you load into your system. I’m paying for whatever music I load into this system, either as close as I can to the artists themselves or through secondhand stores. Paying for the music I add to the library naturally puts back pressure on how much I can add in a month without blowing my budget. I’m shifting away from “post-scarcity” economics with streaming (where the artists are the ones who lose the most), to where I’m the bottleneck on discovering new tunes.

This works for me, admittedly, because I don’t demand a ton of novelty from my listening experience. Your mileage may vary if you need to listen to a ton of variety across a bunch of categories. Qobuz or Tidal streaming plans may be your best bet in “paying close to the creators” here.

In the future, I think that Teal.fm may be part of the solution for me in the future. Being able to see what other people are listening to, and using that to inform where I go looking for new music seems like a good next step for more organic discovery at scale through small-scale relationships of trust with people with good taste, without resorting to faceless algorithms.

Turning it up to 11

From there, the listening experience comes together. The default Jellyfin app is not very polished, but it works. On my iPhone, however, Manet is terrific. It’s polished, it just works, and it’s simple.

I haven’t found a great way to wire Jellyfin up to Sonos speakers yet, apart from using Manet from my phone and using Airplay to stream from there to the speakers. That works well enough (though my wifi coverage fades in some parts of the house, leading to occasional stuttering), but it would be nice if Sonos was natively aware of this.

Adding new features

Because it’s just audio files organized in folders, adding new features is surprisingly easy. For example, I saw that Jellyfin/Manet supports Karaoke-style lyrics if you include lyric files alongside the music files. These files can be plain text, or LRC files that include timecodes and other details to sync the lyrics up to the music.

LRCGET is a lightweight tool similar to Picard, but for downloading lyrics. While I don’t spend a ton of time with lyrics, it’s neat to run LRCGET against new music, have the lyrics download next to the music files, Syncthing pushes those new lyric files to the server, Jellyfin picks them up and serves lyrics up to Manet, which then shows them in a smooth & polished interface.

Even if Jellyfin, Manet, or other pieces of all of this break or go away, replacing any one of these pieces isn’t a huge deal. The files are still there, and they’re not going away if I stop paying a subscription or a vendor goes out of business. If Jellyfin stops receiving updates, my copy of it running on my server will keep running just fine.

A million Enough songs in your pocket

I haven’t done this yet, but apparently refurbished iPods or other MP3 players are on the rise again. They still work, and you can just load your music on them and listen, and that’s it. Single purpose device, no noise or interruptions, and you don’t need a subscription. You just listen to your music.

Maintenance

There isn’t much. Adding new music is the most time-intensive part, since I have to pick, purchase/rip, categorize, maybe update Musicbrainz, save those changes in Picard, and run LRCGET. That takes just a couple minutes with every batch of music I purchase.

The server itself is self-sustaining, and I don’t worry too much about security since it’s not on the public internet at all. If I have time after uploading a batch of music, I may hop on the server to check for updates or run some backups to secondary storage, just in case. Even so, it’s amazing how smooth it all is in the end. It just works. This is largely a testament to Tailscale, Jellyfin, and especially Manet. The teams behind those products are quite good, and deserve whatever paid support/donations they can get (Tailscale is great, though being a commercial product they subsidize their free offering from paid business accounts - Jellyfin and Manet not so much, so a dollar goes farther on those two in particular).

Wrapping it up

In the future, I’d like to move this cloud server to a local device on my home network. For now, I’m not willing to shell out for RAM and hardware maintenance, but eventually I’d like to put something like that together. A NAS like a Synology comes to mind, or perhaps just a box of disks running TrueNAS or even plain Linux is enough. While the sky’s the limit generally here, keeping it simple is all I really need.


  1. If media needs to be transcoded from one format into another before being played, then this could be different. Fortunately I haven’t had that problem with just music streams.

  2. I run mine behind Nginx Proxy Manager which handles setting up and renewing LetsEncrypt.org TLS certificates and running more than just Jellyfin on this machine