Spotify Owns Your Library. Until You Self-Host.
There’s a moment every music nerd hits: you realize Spotify’s playlist gets deleted if you stop paying, your data lives on someone else’s server, and that deep cut you’ve loved for a decade might disappear if the rights holder has a bad day.
So you think, “I’ll just self-host my music.” Then you find two projects that actually work, and they’re solving completely different problems. That’s Navidrome and Funkwhale in a nutshell.
One is a lightweight, fast, Subsonic-API-compatible streaming server that respects you and your hardware. The other is a federated social music platform that lets you share, discover, and podcast with your friends. They’re not really competitors — they’re two different answers to “why do I want my music on my own server?”
Let me save you the research rabbit hole.
Navidrome: The Subsonic Decathlon Athlete
Navidrome is what happens when you ask a Go developer to build a music server and they say, “sure, let me also make it so small you can run it on a Raspberry Pi.” It’s a single binary. No Python, no Django, no six services playing tag. You download a 40 MB file, point it at your music library, and boom — you’ve got Subsonic.
“What’s Subsonic?” you ask. It’s a protocol — a ten-year-old open API spec that basically every music streaming app that isn’t Spotify has agreed to understand. DSub, Symfonium, play:Sub, Substreamer on Android. Maroofy on iOS. Subsonic itself (the original, still around). Most of them talk the same language. You pick a Navidrome server, you pick a client you like, and you’re done.
Navidrome reads your library from files — MP3, FLAC, OGG, whatever. It respects ID3 tags, folder structure, cover art. No forced upload, no reprocessing. It scans your disk and indexes what’s there. If you’ve got 50,000 songs in a folder tree, Navidrome will find them, tag them, and make them searchable. The search is fast because it’s Go, not Python sitting there thinking about it.
You can transcode on the fly. Navidrome will convert FLAC to MP3 to save bandwidth if your client asks. Or don’t — if you’re on the same network, stream lossless all day. Scrobble to Last.fm. Create playlists. Shuffle. Star tracks. The mobile experience is solid because the Subsonic client ecosystem spent a decade nailing it.
The footprint? Tiny. RAM usage is measured in tens of MB. CPU idles. A single ARM chip from 2015 runs it without breaking a sweat. You could throw it on a Synology NAS, a Docker container, a VPS, or literally anywhere you can point it at a music folder.
Funkwhale: The Federation Experiment
Funkwhale is the idealist’s answer. It’s built on ActivityPub — the same protocol that powers Mastodon. Your Funkwhale server can talk to other Funkwhale servers without a central gatekeeper. You can follow people across instances, share playlists, discover music, and if you’re into it, host podcasts alongside your music.
It’s Python and Django (so it’s heavier — you’re looking at 512 MB RAM, maybe a gig if you’re ambitious). But it’s feature-rich. Funkwhale has a built-in music discovery mechanism. You can follow other users. There’s a radio station mode where the server generates playlists based on what’s trending on your instance or the wider federation. You can upload tracks for other people to listen to, or tag releases as a “draft” and iterate.
Podcasts live here too. You can import podcast RSS feeds and serve them alongside your music library. Same player, same library interface, same sync.
The federation part is the hook. If your friend runs a Funkwhale server, you can share playlists across the network. You’re not locked into your instance — you’re part of an ecosystem. (In practice, federation for music is still niche and early. Not many people are running their own Funkwhale boxes. But it’s there if you want it.)
Scrobbling to Last.fm? Yes. Last.fmsubmit support. Playlist sharing? Built-in. User permissions? You can create shared accounts, listener-only accounts, uploaders. It’s a social music server.
The Trade-Offs: Speed vs Features
Navidrome wins on:
- Resource footprint. We’re talking 50-100 MB running. A used Raspberry Pi 3B. Your NAS. A $6/month VPS.
- Speed. The Go binary indexes and searches fast. Startup time is measured in seconds. Zero overhead.
- Subsonic compatibility. If you want choice in mobile clients, Navidrome is bulletproof. Every app that speaks Subsonic works here.
- File-first philosophy. Your library stays on disk. Navidrome doesn’t own it, doesn’t reprocess it, doesn’t add metadata you don’t want. Your music, your rules.
- Simplicity. Download a binary. Point it at a folder. Done. Docker is optional.
Funkwhale wins on:
- Features. Podcasts, federation, instance-wide radio, user management, upload workflows.
- Social stuff. If you want to share with friends or collaborate on playlists, Funkwhale has the UI for it.
- Customization. Funkwhale is Django, so you can fork it, modify it, integrate it with other services.
- One place for audio. Music and podcasts in the same interface, same sync, same search.
Library Handling & Mobile Clients
Here’s where Navidrome shines: mobile client choice.
The Subsonic protocol is the lingua franca. You can:
- Use DSub if you want a no-bullshit Android client with bitrate control, offline caching, and a 15-year history of just working.
- Use Symfonium if you want sleek design and Material Design 3.
- Use play:Sub if you like Spotify-style discovery features built in.
- Use Substreamer on iOS (it’s not perfect, but it exists).
- Bounce between them. Your library is the same. Your login works on all of them.
Funkwhale has a web player (really good one, actually) and some mobile app support, but it’s more “Funkwhale” flavored. You’re not jumping between clients mid-session. That’s not a knock — the Funkwhale web player is solid. It’s just different philosophy.
For tags and metadata: both read ID3 tags from files. Both handle cover art. Navidrome’s approach is “scan and index,” so it’s faster on large libraries. Funkwhale lets you edit metadata in the web UI, which is nice if you want to fix stuff without editing files.
Deploy: Docker Compose Reality Check
Navidrome (you’re looking at ~3 minutes setup):
version: "3.8"services: navidrome: image: deluan/navidrome ports: - "4533:4533" environment: ND_SCANINTERVAL: 1h ND_LOGLEVEL: info volumes: - /path/to/music:/music - navidrome_data:/data restart: unless-stopped
volumes: navidrome_data:That’s it. Start it. Point your browser to localhost:4533. Login as admin/admin, change the password, add your music folder, and wait for the scan. First client? Fire up DSub, add a server entry with your IP, and start playing.
Funkwhale (you’re looking at ~15 minutes, more if you care about federation):
version: "3.8"services: postgres: image: postgres:15-alpine environment: POSTGRES_DB: funkwhale POSTGRES_PASSWORD: funkwhale volumes: - funkwhale_db:/var/lib/postgresql/data restart: unless-stopped
redis: image: redis:7-alpine restart: unless-stopped
funkwhale: image: funkwhale/funkwhale:latest ports: - "5000:5000" environment: FUNKWHALE_DJANGO_ALLOWED_HOSTS: localhost FUNKWHALE_DJANGO_SECRET_KEY: your-secret-key-here DATABASE_URL: postgresql://postgres:funkwhale@postgres/funkwhale CACHE_URL: redis://redis FUNKWHALE_DJANGO_DEFAULT_FROM_EMAIL: noreply@localhost volumes: - /path/to/music:/music - funkwhale_data:/data depends_on: - postgres - redis restart: unless-stopped
volumes: funkwhale_db: funkwhale_data:More moving parts. Postgres, Redis, the app itself. More to patch, more to back up. But you get the features.
Transcoding, Scrobbling, and Ecosystem
Both do transcoding. Both talk to Last.fm. Both cache playlists. Both handle offline storage (on the client side — both Subsonic clients support it).
Listenbrainz (the open-source Last.fm alternative)? Funkwhale has built-in support. Navidrome can scrobble there too, but it depends on your client — some Subsonic clients support it, some don’t.
DLNA / UPnP? Neither does it natively, but you could run a Subsonic-to-UPnP bridge if you’re desperate.
Airsonic and Airsonic-Advanced (Subsonic forks)? They exist. Airsonic is slower than Navidrome, heavier, but more feature-complete than vanilla Subsonic. If you’re comparing, Navidrome is the lean option, Airsonic is the Swiss Army knife, and vanilla Subsonic is… outdated. Most people skip vanilla Subsonic entirely now.
When You Pick Navidrome
You want to:
- Listen to your own library on your own server.
- Not care about sharing or social stuff.
- Run it on a potato.
- Switch between mobile clients on a whim.
- Keep your metadata clean and your library private.
- Spend zero time thinking about Postgres or Redis.
You’re a solo listener with a big library and strong opinions about your music app.
When You Pick Funkwhale
You want to:
- Host podcasts alongside your music.
- Share playlists and music with friends or a community.
- Participate in a federated music network (eventual-future stuff, but cool idea).
- Use one interface for all your audio.
- Let other people upload to your instance.
- Have a web player that’s genuinely good (it is).
You’re thinking about music as social, not just personal. You want features Navidrome will never have because it refuses to leave the file-server lane.
The Honest Take
Navidrome is what happens when someone asks, “What’s the minimum viable product for playing my own music?” and actually ships it. It’s not sexy. It doesn’t have network effects. Nobody’s going to build a community on Navidrome because that’s not what it’s for. But it’s rock solid. It’s the Toyota Corolla of music servers — boring, reliable, fuel-efficient, and you’ll never worry about it.
Funkwhale is the idealist’s platform. It’s got federation, it’s got features, it’s got vision. But it comes with the operational weight of Django and Postgres. You’re running a platform now, not a file server.
If you’re reading this on your home lab subreddit at 2 AM, trying to figure out what to install on that spare NAS, the answer is probably Navidrome. Fire up DSub, throw in your USB drive of FLAC files, and go to bed. Your morning shower is going to sound great, and you didn’t need to think about database migrations.
If you’re the type to say, “I want my friends to discover music on my instance,” or “I want podcasts and music in one place, federated forever,” then Funkwhale’s your jam. Just budget the RAM and patience.
Picking the Player
The real win here is that you’re not locked into anything. Your music stays on your server, in your folder structure, with your tags. If Navidrome disappeared tomorrow, you’d just point Airsonic or Subsonic at the same folder and keep going. The protocol outlives the implementation.
That’s the whole point of self-hosting. You’re not renting. You’re owning. You’re not waiting for some company to decide your music isn’t profitable. You’re the gatekeeper of your library.
So spin up one, try it for a week, and if it doesn’t fit, spin up the other. Your music folder won’t judge you.