Tech Digest

Head to head

Navidrome vs Jellyfin for music

You already have a media server. This page argues that music deserves its own, and is specific about when it does not.

Last reviewed 2 tools compared

Should you run Navidrome if you already have Jellyfin?

Yes, if you listen to music on a phone more than a couple of times a week. Navidrome costs about 70 MB of RAM, one container, one SQLite file and one port (4533), and in exchange you get the Subsonic client ecosystem: Symfonium, play:Sub, substreamer, Amperfy and Feishin, so app quality stops being your server project's problem. Keep music in Jellyfin instead if your listening happens on a TV or a browser, if your library is small, or if you are unwilling to maintain a second backup target. Jellyfin plays music competently; it just makes music a secondary citizen inside a video product.

If you already run Jellyfin, you already have a music server. It scans your audio files, it has a music section, it streams to phones, it transcodes. Adding Navidrome means a second container, a second database to back up and a second thing to upgrade for content you can already play.

So the honest question is not "which server is better at music". It is whether music deserves its own process on your box.

Position: yes, if music is a daily habit and you listen on a phone. The reason is not audio quality or scanning or the UI. It is that Navidrome does not ship a mobile app, and that turns out to be its best feature.

What the spec table is telling you#

Look at Idle memory and Operational load together. Navidrome idles at 70 MB with an operational load of 1 out of 5, which is as close to free as a running service gets: one Go binary, one SQLite file, no external database, upgrades that migrate forward on start with no ceremony.

SpecificationNavidromeJellyfin
LicenceGPL-3.0 (Copyleft)GPL-2.0-only (Copyleft)
Written inGoC# / .NET
First release20202018
MaturityStableMature
DatastoreSQLiteSQLite
Services to run11
Idle memory70 MB280 MB
Memory in use200 MB900 MB
Operational load1 / 5, Set and forget2 / 5, Light
IdentityTrusted proxy headerOIDC via plugin
arm64 buildsYesYes
Default ports45338096, 8920
Backup shapeSQLite backupSQLite backup

That is the number that makes the second-server argument work. If Navidrome cost 500 MB and a Postgres instance, the answer would be different, and you would keep music in Jellyfin. Stack planner will show you what it does to your total, which for most people is nothing they will notice.

The part nobody says: the app you use is not made by either project#

Navidrome implements the Subsonic API and deliberately ships no mobile app. That sounds like a gap. In practice it means you choose: Symfonium or substreamer on Android, play:Sub or Amperfy on iOS, Feishin on the desktop. These are apps written by people whose entire product is a music player, competing with each other, and they are better than what a media server project can staff.

Jellyfin's music clients have improved. Finamp is the community music app most people pair with it and handles offline downloads. And here is the uncomfortable part for the Navidrome case: Symfonium speaks Jellyfin natively, so an Android listener can have a first-class music player without running a second server. If you are an Android household, that combination is genuinely competitive and the second server is optional.

On iOS the picture is different. The mature, polished music clients there are Subsonic clients, and that is where Navidrome's ecosystem argument stops being theoretical.

Which one handles a library that grew organically#

Neither will organize your files, and both punish bad tags, but they fail differently.

Navidrome is absolutist: it reads your tags, never writes them, and groups by album artist. A compilation without a consistent ALBUMARTIST and a compilation flag becomes twelve one-track albums, and no server setting rescues it. The fix is MusicBrainz Picard or beets, applied to the files, once. The upside of that strictness is predictability: fix the tag, rescan, the library is correct forever.

Jellyfin applies its video-derived metadata pipeline to music, which means more moving parts and more places for a mismatch to happen. It leans on folder structure more, it fetches artist images and biographies, and when it gets an album wrong the diagnosis is less obvious because the same scanner handles four other content types.

Either way, budget an evening for tags before you blame a server. That work is portable: it lives in your files and survives whichever server you keep.

What the second server actually costs you#

Be concrete about the price of running both.

  • 70 to 200 MB of RAM and one container.
  • One more port, 4533, and one more reverse proxy entry (Reverse proxy and TLS).
  • One more thing in the backup set: the data directory, meaning navidrome.db plus its -wal and -shm files. Use SQLite's .backup or stop the container rather than copying live under WAL. The cache/ subdirectory is regenerable and safe to exclude.
  • Split state. Play counts, ratings, starred items and playlists exist in whichever server you used, and they do not merge.

That last one is the real cost, and it is why running both indefinitely is worse than choosing. Pick the authoritative music server, and if you want a listening history that outlives both, scrobble to ListenBrainz or Last.fm rather than trusting either database.

Deployment is otherwise trivial:

yaml
services:
  navidrome:
    image: deluan/navidrome:latest
    ports: [ "4533:4533" ]
    environment:
      - ND_SCANSCHEDULE=1h
      - ND_LOGLEVEL=info
    volumes:
      - ./data:/data
      - /srv/music:/music:ro

The first user you create becomes the admin. The first scan is the only slow part: roughly an hour per 100,000 tracks on spinning disks, much less on SSD, with artwork extraction dominating.

What happens when the library gets big#

Navidrome's steady-state memory is tiny and its scan memory is not. Full rescans on libraries in the hundreds of thousands of tracks have been reported pushing resident memory past 10 GB and getting the container OOM killed. That is exactly why the project grew an external scanner that runs scanning in a subprocess, so the memory is returned when it exits. If your container dies mid-scan, enable it rather than fiddling with the schedule.

Jellyfin's scanner is slower per track but better behaved on memory, because it was built for libraries measured in thousands of items rather than hundreds of thousands. Its risk is elsewhere: the 10.11 release (October 2025) migrated the library onto EF Core and merged library.db into jellyfin.db, one way, from 10.10.7 only, and it can run for hours on a large library. A music library with 400,000 tracks is a large library by that measure. If your music lives in Jellyfin, that upgrade is more dangerous for you than for someone with 900 films.

Worth stating plainly: Navidrome is still pre-1.0 after six years. Version 0.60 (February 2026) added a WebAssembly plugin system for metadata providers and integrations, and 0.63.2 was current in July 2026. In practice it is more stable than the version number suggests, but you are choosing a project that has not committed to an API freeze.

Which one you can get your data out of#

Both keep your audio files untouched, so the only thing at risk is state.

Navidrome: navidrome.db holds users, playlists, play counts, ratings, starred items and scrobble history. None of it exists anywhere else. One nice detail is that smart playlists are .nsp JSON files stored in the music folder rather than database rows, so they travel with your library instead of with the server.

Jellyfin: /config holds everything, and 10.11 added a scheduled backup task (Dashboard, Backups) that writes a consistent archive rather than a torn SQLite copy. Use it.

Neither has a supported export of listening history into the other. Fold both config directories into the routine in Backups that actually restore and stop thinking about it.

The verdict, by situation#

SituationPickWhy
Daily listening on an iPhoneNavidromeThe good iOS music clients are Subsonic clients, and Jellyfin does not have an equivalent
Daily listening on Android, already running JellyfinJellyfin plus SymfoniumSymfonium speaks Jellyfin directly, so the second server buys you little
Music mostly plays on a TV or a browserJellyfinOne server, one library, no split state, nothing to add
300,000+ tracks, tags already curatedNavidromePurpose-built scanning and the external scanner mode for the memory spike
A 1 GB VPS or a Pi 4 with no video libraryNavidrome alone70 MB idle against Jellyfin's 280 MB, and you never wanted transcoding
You want to hand family a single app for everythingJellyfinTwo apps means two support conversations you will be having
Audiobooks and podcasts matter tooAudiobookshelfNeither of these keeps per-user audiobook position properly; see Replace Audible
Leaving Spotify entirelyNavidromeReplace Spotify walks the migration, and client choice is what makes it stick

What to do next#

Run Navidrome for two weeks alongside whatever you have. It is one container against a read-only music mount, so there is nothing to undo. Install one Subsonic client on your actual phone (Symfonium if you are on Android, play:Sub or Amperfy on iOS) and see whether the difference is worth a second backup entry. If it is not, delete the container and you have lost an evening.

Before either server sees the library, spend that evening in Picard or beets fixing ALBUMARTIST and compilation flags. That work makes both servers better and is the only part of this you cannot undo cheaply later.

If you expose it, set ND_REVERSEPROXYWHITELIST to your proxy's CIDR before you enable header authentication, put Authelia or an equivalent in front of the web UI, and read Remote access without port forwarding rather than forwarding 4533. The wider media picture is in Media, and if you are still choosing a video server, start with Jellyfin vs Plex and Jellyfin vs Emby.

Questions#

Does Navidrome have a mobile app?

Not a first-party one, and that is deliberate. Navidrome implements the Subsonic API and lets you choose the client: Symfonium and substreamer on Android, play:Sub and Amperfy on iOS, Feishin on the desktop. You get competition and a choice of interface instead of one bundled app. The cost is that support for a client bug is somebody else's forum, and each app is a separate purchase or install for every family member.

Can Jellyfin do gapless playback and offline downloads for music?

It depends more on the client than the server. Jellyfin's own apps have improved, and Finamp is the community music client most people use with it, with offline downloads. Symfonium also speaks Jellyfin directly, so on Android you can get a first-class music app without running a second server at all. That combination is the strongest argument against adding Navidrome, and it only exists on Android.

How much RAM does Navidrome use?

About 70 MB at rest and 200 MB in ordinary use, because it is a single Go binary with a SQLite file. The outlier is scanning: full rescans on libraries in the hundreds of thousands of tracks have been reported pushing container memory past 10 GB and getting OOM killed. That is why the external scanner exists, running the scan in a subprocess so memory is released when it exits. Enable it before you index a huge library.

Why do my albums split into one-track albums?

Tags, not the server. Navidrome groups by album artist, so a compilation with a different artist per track becomes many single-track albums. Set ALBUMARTIST consistently and use the compilation flag (TCMP or COMPILATION) in the files themselves. No Navidrome setting fixes it and rescanning changes nothing until the tags change. Run the library through MusicBrainz Picard or beets first. Jellyfin has the same class of problem with less tooling to explain it.

Does single sign-on work with Navidrome?

Partly, and the gap is on phones. Navidrome accepts a proxy-injected identity via ND_REVERSEPROXYUSERHEADER, so the web UI can sit behind Authelia or authentik. Third-party Subsonic clients still authenticate against Navidrome's own user database with a password or token, so every user needs a local password anyway and your proxy has to let /rest through. Set ND_REVERSEPROXYWHITELIST to the proxy's CIDR or anything that reaches port 4533 can claim any identity.

Can I run both against the same music folder?

Yes. Mount the music directory read-only into both containers. Navidrome never writes to your audio files and Jellyfin does not need to either. The only thing that does not merge is state: play counts, ratings, starred items and playlists live in each server's own database, so you pick one as authoritative or accept that they drift. Scrobbling both to ListenBrainz is the usual way to keep one real history.

Sources#

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