Tech Digest

Migration

Replace Spotify

This is the one migration on the site where most readers should stay put. Navidrome is excellent and it plays only the files you own.

Last reviewed

Can Navidrome replace Spotify?

Only for music you already own. Navidrome streams audio files sitting on your disk, so replacing Spotify means buying, ripping or otherwise acquiring every album you want to hear, one at a time. The catalogue is the thing you lose and it cannot be replicated at any price a household would pay. Discovery goes with it: no Discover Weekly, no Release Radar, no autoplay radio, and no hearing an album thirty seconds after you think of it.

What you are actually giving up#

Say it plainly: this is not a like for like replacement, and no article that tells you otherwise is being honest with you. Spotify's product is a licensing arrangement with the entire recording industry. Navidrome is a very good program for playing files you already have. Those are different things.

What goes away:

  • The catalogue. Every album you have not bought. Every track a friend mentions at dinner. Every soundtrack you needed once.
  • Discovery. Discover Weekly, Release Radar, autoplay radio, Blend, collaborative playlists. These are built on aggregate listening data from hundreds of millions of accounts. Nothing you run at home approximates them, and the plugin ecosystems that try are recommendation engines over a library you already chose.
  • Zero-latency curiosity. The gap between "I wonder what that sounds like" and hearing it goes from three seconds to a purchase decision.
  • Podcasts and exclusives, which do not exist outside Spotify at all.
  • Everything downstream of the app. Spotify Connect, car head units, smart speakers, Wrapped. Some of it has a Subsonic equivalent; most of it does not.

Who this genuinely works for: people who already own a CD or FLAC collection and are paying Spotify to listen to music they have already bought. People who buy from Bandcamp habitually. People whose listening is deep and repetitive rather than broad. Households where one library serves several people. If you are not in one of those groups, the honest recommendation is to keep paying Spotify and self-host something else.

Get your data out first#

Your Spotify data is only available while the account exists, so extract it before you cancel, even if you are undecided.

1. Request both packages. On the Account Privacy page, request the Account Data package (playlists, library, streaming history, search queries, follower data, taste profile, Wrapped summaries) and the Extended Streaming History separately. The extended history is the interesting one: every item listened to across the lifetime of the account, with timestamps, platform, milliseconds played, country and the reason each track started and stopped. It arrives as JSON, by email, and it is not instant.

2. Get playlists now, with ISRCs. Waiting for a data package is fine for records; it is bad for planning. Exportify runs in your browser against Spotify's Web API, asks for read-only playlist access and writes CSVs per playlist including the track URI, album, release date, popularity and the ISRC. That last field is what lets you match a track you loved to a specific release you can buy. Track and artist names alone will not do it, because half your library is a deluxe reissue with a different title.

3. Turn the data into a shopping list. The extended streaming history plus the playlist CSVs give you a ranked list of what you actually listen to, as opposed to what you think you listen to. Sort by total milliseconds played, cut it at whatever number is honest, and buy that.

bash
# top 100 artists by listening time, from the extended history export
jq -s 'add | group_by(.master_metadata_album_artist_name)
       | map({artist: .[0].master_metadata_album_artist_name,
              hours: (map(.ms_played) | add / 3600000 | floor)})
       | sort_by(-.hours) | .[0:100]' Streaming_History_Audio_*.json

4. Acquire, then tag, then import. Rip CDs with a verifying ripper, buy FLAC where the option exists, and run everything through MusicBrainz Picard or beets before Navidrome ever sees it. Navidrome reads tags and never writes them, so a badly tagged library looks broken in ways no server setting fixes.

Which one to pick#

Navidrome for music, without much hesitation. One static binary or one container, one SQLite file, no external database, ops load 1 out of 5, and it idles around 70 MB on a Pi 4. Mount your music read-only at /music, a data directory at /data, expose 4533, done.

Your situationPickWhy
Music is the job and you want to choose your own appNavidromeThe Subsonic client ecosystem is the feature
You already run Jellyfin for videoJellyfinOne less service, at the cost of a weaker music experience
Audiobooks and podcasts as wellAudiobookshelfPer-user, per-item position sync that music servers do not do
A very large library, hundreds of thousands of tracksNavidrome with the external scannerFull scans have pushed container memory into gigabytes

What the migration actually costs#

  • Disk: roughly 350 MB per album in FLAC, or 120 MB at 320 kbps MP3. A thousand albums is around 350 GB of FLAC, which is a single cheap disk. Storage is not the constraint here.
  • Money: the constraint. Whatever your shopping list came to.
  • Setup: under an hour. The first scan is the only slow part, roughly an hour per 100,000 tracks on spinning disks and much less on SSD, with artwork extraction dominating.
  • Server load: ~70 MB idle, ~200 MB in use. Serving costs almost nothing because most clients stream the original file untouched.
  • The ongoing job, which never stops: acquiring and tagging. Every new release is a purchase and a tagging session, call it ten minutes an album. That is the real recurring cost of leaving Spotify, and it is a hobby, not a chore, only if you already enjoy it.
  • Backup: the navidrome.db file holds users, playlists, play counts, ratings, starred items and scrobble history, and none of it is recoverable from your audio files. Use SQLite's .backup rather than copying it live under WAL, and see Backups that actually restore. Smart playlists are .nsp JSON files in the music folder, so they travel with the library.

What breaks and how to tell early#

Subsonic clients do not use your SSO. Even with Authelia or a proxy in front of the web UI, third-party apps authenticate against Navidrome's own user database with a password. Every user needs a Navidrome password for mobile, and your proxy has to let the /rest endpoints through, or the phone simply fails to connect. Plan the proxy rules around that split rather than discovering it in a car park.

Header auth is a foot-gun. If you set ND_REVERSEPROXYUSERHEADER without setting ND_REVERSEPROXYWHITELIST to the proxy's CIDR, anything that can reach port 4533 can claim to be anyone. The first user auto-created that way becomes an admin.

Full scans can be OOM-killed. Steady-state memory is tiny, but full rescans on libraries in the hundreds of thousands of tracks have pushed resident memory past 10 GB. That is why an external scanner subprocess mode exists. If the container dies mid-scan, enable it rather than fighting the schedule.

The car, the speaker, the watch. Whatever integration you use daily is the thing to test on day one with a single album, not on day thirty with a full library.

The honest early tell. For two weeks, keep a note every time you go to play something and find you do not own it. If that number is more than a handful per month, stop. Cancelling Spotify will make you listen to less music, which is the wrong outcome from a music project.

The point of no return#

Run both for ninety days. That is longer than the other migrations on this site because the failure mode is not technical, it is that your listening quietly shrinks and you do not notice until you have unsubscribed.

Before you cancel:

  1. Both Spotify data packages downloaded and stored somewhere backed up. They are unavailable after the account closes.
  2. Your top 100 artists by listening time either owned or consciously abandoned.
  3. The client app installed and working on every device you use, including the one in the car.
  4. Ninety days of the "things I wanted and did not have" log, at fewer than five a month.
  5. A tested restore of navidrome.db, because play counts and playlists are the only part of this that cannot be rebuilt from your files.

If step 4 fails, keep paying. A $12 subscription alongside a self-hosted library you actually own is a perfectly reasonable end state, and it is the one most people who try this end up at.

Next: pair it with Navidrome vs Jellyfin for music for the head to head, sort out reaching the server from a phone with Remote access without port forwarding, and see Replace Audible for the audiobook half of the same problem. The rest of the category is at Media.

Questions#

Does Navidrome let me stream any song like Spotify?

No. Navidrome indexes tagged audio files you have put on a disk and serves them over its web UI and the Subsonic API. It has no catalogue, no store and no licensing deal. If a track is not on your disk it does not exist. This is the single most important sentence on the page and most people who bounce off self-hosted music did not read it before they started.

How do I export my Spotify playlists?

Two routes. Spotify's Account Privacy page produces an Account Data package containing playlists, library, streaming history, search queries and taste profile as JSON, and separately an Extended Streaming History covering every play across the lifetime of the account with timestamps and play duration. That takes days. For playlists right now, Exportify uses Spotify's Web API in your browser to write CSVs including ISRC codes, which matters because ISRCs let you match a track to a purchase and track names do not.

Where does the music actually come from?

Ripping CDs you own, buying downloads from Bandcamp, Qobuz, 7digital or a label's own store, and digitizing whatever is already in the house. Buy FLAC where you can: it is the format you will not have to buy again. Budget the time as much as the money, because verifying rips and tagging albums is the recurring cost of this entire arrangement.

Does Navidrome have a mobile app?

Not a first-party one, deliberately. It implements the Subsonic API, so you choose from Symfonium, play:Sub, substreamer, Amperfy and Feishin among others. That means the app quality problem is solved by people who specialize in it and you get a choice, but some of the best clients are paid one-off purchases and none of them is supported by the Navidrome project.

Why do my albums show up split into single tracks?

Navidrome groups by album artist and trusts your file tags absolutely: it reads them and never writes them. A compilation with a different artist per track becomes many one-track albums until ALBUMARTIST is set consistently and the compilation flag (TCMP or COMPILATION) is present. No Navidrome setting fixes this. Run the library through MusicBrainz Picard or beets and rescan.

Navidrome or Jellyfin for music?

Navidrome if music is the point: it is one binary, idles around 70 MB, scores 1 out of 5 for operational load, and gives you the whole Subsonic client ecosystem. Jellyfin if you already run it for video and would rather not add a service, accepting a weaker music experience. Running both against the same read-only music directory is also fine and fairly common.

Sources#

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.