Replace Spotify with Navidrome
This guide serves a music library that you already own, and plays it on a phone and in a browser. It does not cover where the files come from.
Prepare the library
Navidrome reads tags, not folder names. Each file needs correct artist, album, title, and track number tags. A tag editor such as MusicBrainz Picard fixes a messy library in one pass. A tidy layout still helps you:
music/
Artist/
Album/
01 Title.flac
Run Navidrome
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
restart: unless-stopped
ports:
- '4533:4533'
volumes:
- ./data:/data
- /path/to/music:/music:ro
The :ro flag mounts the library read-only, so Navidrome cannot change your
files. Open port 4533 once to create the admin account. Navidrome then scans
the folder.
Reach it from outside
My Navidrome runs on a home machine that has no public address. The VPS proxies to it over the tailnet:
music.example.com {
encode zstd gzip
reverse_proxy 100.64.0.10:4533
}
The address 100.64.0.10 stands for the home machine’s tailnet IP. The block
has no import sso. A phone app cannot pass a web login page, so Navidrome
keeps its own login. Use a long password.
Play on the phone
Install Symfonium, a paid Android player for Subsonic servers. Add a server
with the URL https://music.example.com and your Navidrome login. Turn on
offline caching for the playlists that you want on a flight.
Play in the browser
Navidrome has its own web page. I find it plain. Feishin is a web client for Subsonic servers, and it runs as its own site. The browser then streams from the Navidrome hostname, so both hostnames must stay reachable.
Check the result
Play a track on the phone over mobile data. Then turn on flight mode and play a cached playlist. Both should work.
What is still open
I have requested my Spotify listening history export. I cancel Spotify only after the library is complete. The note Leaving Spotify tracks that decision.