I told you in Part 1 that PlexAmp was my biggest concern going into this migration. Spent some time sitting with that. Found an answer.
That answer is Navidrome. And it means Jellyfin never has to touch my music library at all.
Jellyfin Handles Music. It Just Doesn't Handle It Well.
Jellyfin is a video-first platform. Everything about how it's built and where developer attention goes reflects that. Music got added because a media server without music support feels incomplete, not because anyone set out to build the best music server on the internet.
That's not a criticism. It's just the honest framing. Once you accept it, the weaknesses stop feeling like bugs and start feeling like predictable results of prioritization.
Here's what those weaknesses look like in practice.
The Subsonic API is an afterthought. The Subsonic API has been the standard protocol for self-hosted music clients for over fifteen years. Navidrome implements it natively; it is the protocol. Jellyfin's Subsonic support is a community plugin. It's partial, it has compatibility issues with certain clients, and you have to maintain it yourself outside of Jellyfin's core update cycle. If the plugin breaks on an update, your music clients break.
The client ecosystem is thin. Because Jellyfin's Subsonic implementation is limited, the 20+ mature clients in that ecosystem don't fully work with it. You end up funneled toward Finamp. Finamp is a good app, but one client versus an ecosystem of purpose-built music apps is a real constraint. On iOS especially, the music client story hasn't kept pace with the video story.
Scrobbling requires a plugin. Last.fm scrobbling in Jellyfin needs the Last.fm plugin installed and maintained separately. When Jellyfin updates, you hope the plugin ships a compatible version at the same time. It usually does. "Usually" is not a comfortable operating condition for something that should just work.
Smart playlists don't exist. Jellyfin lets you build manual playlists. That's the whole story. No rules-based playlists, no "give me everything rated 4 stars or higher released before 1990 that I haven't played in 60 days." If you have a large library and care about how you surface music in it, this gap will bother you.
ReplayGain support is inconsistent. If you've tagged your files with ReplayGain values, Jellyfin's handling of that metadata varies by client. Some honor it, some ignore it, and Jellyfin itself doesn't have a clear answer. That inconsistency matters if you've put in the time to get your listening levels right across albums.
Performance degrades with large libraries. Jellyfin indexes video metadata, music metadata, and everything else in one database. Adding a large music library on top of an already-loaded video library produces real slowdown. A server handling 500 movies and 30 TV shows without complaint can start dragging when you throw 20,000 music tracks into the mix.
Jellyfin's music feature exists. For casual listening, a playlist here, an album there, it's probably fine. For anyone with a real library who thinks about how they listen, it's a workaround looking for a better answer.
What Navidrome Actually Is
Navidrome is a music server and nothing else. Written in Go, fast, and running in a container that idles around 50MB of RAM. It implements the full OpenSubsonic API natively, which means every client in that ecosystem connects without workarounds or plugins.
It indexes your library, handles on-the-fly transcoding via FFmpeg when clients need it, scrobbles to Last.fm and ListenBrainz at the server level, and builds smart playlists from tag-based rules. No GPU required. No resource competition with Jellyfin. No plugins to maintain across updates.
One container, one job.
What it doesn't do: video, anything the *arr stack needs to talk to, or anything outside of audio. Music in, music out. That narrowness is the point.
The High-Res Question
If you care about lossless audio, and if you're self-hosting your music library in 2026 you probably do, this part matters.
Navidrome doesn't transcode by default. It streams files in their original format. FLAC, ALAC, WAV, your 24-bit/96kHz files arrive at the client exactly as they left your drive. FFmpeg only kicks in when a client requests a lower bitrate, say on a slow mobile connection, or when you've explicitly configured a transcode profile.
Jellyfin also passes through lossless files, so on a spec sheet the difference looks small. The gap shows up in the client layer. Nautiline on iOS handles lossless passthrough properly and respects the ReplayGain tags already embedded in your files. Jellyfin's music clients are less consistent on both counts.
Navidrome also recently added sonicSimilarity support through its plugin system. Audio-based recommendations, finding tracks that actually sound like the one you're playing, are now possible when a plugin provides the capability. It's early, but it's the kind of music-specific feature development that simply won't happen on the Jellyfin side. Jellyfin has video to worry about.
Nautiline and Why the Client Matters
PlexAmp works because it's a music-first iOS app built specifically around a music server. A purpose-built server paired with a purpose-built client is what makes it feel like a real product instead of a bolted-on feature.
The equivalent on the Navidrome side is Nautiline. It's a $10 iOS app built specifically for OpenSubsonic-compatible servers. The interface feels native, not like a port of an Android app or a web wrapper in a trench coat. Album art renders correctly. Now Playing is clean. Offline downloads work. ReplayGain is respected. CarPlay works. The queue is persistent.
Reviews from people switching to Navidrome tell the same story: try the available iOS clients, land on Nautiline, stop looking. That's where I landed too.
The reason PlexAmp felt irreplaceable was that it was the only mobile music client in the self-hosted space that felt finished. Nautiline is finished. That's the gap closing.
Psysonic for Mac and Windows (and the Orbit Feature Worth Talking About)
iOS covered. Desktop is a different conversation, and the answer there is Psysonic.
Psysonic is a native desktop client for Mac and Windows built primarily around Navidrome. It's not a web app in an Electron shell pretending to be a desktop app. It uses Tauri and React and actually feels like something installed on your machine. The library browser is fast, the Now Playing dashboard is customizable, and it supports smart playlists natively, which pairs well with Navidrome's tag-based playlist rules.
It's under active development, so rough edges exist. But the trajectory is clear and the update cadence is solid.
The feature that stands out is Orbit.
Orbit is Psysonic's shared listening mode. You start a session, share an invite link, and anyone else on your Navidrome server can join and listen in sync. The host controls playback and the queue. Guests can suggest tracks from anywhere in the library (albums, playlists, search results, favorites), and the host either approves them manually or enables auto-approve to keep things moving. Everyone's client mirrors the same track and position in real time.
The thing that makes this practical rather than gimmicky: it runs entirely over your existing Navidrome server. No external relay, no third-party sync service, no extra account anywhere. Your server, your users, your playlists as the transport layer. Guests do need their own Navidrome login and access to the same server, so for anyone outside your network that means having Navidrome reachable publicly, which in my setup means pointing them at home-domain.com through Cloudflare rather than the Tailscale hostname.
It's a genuinely fun feature for the "what are you listening to right now" use case, without turning your self-hosted setup into a social platform.
What This Does for the Migration
Here's the decision this unlocks.
If Jellyfin has to handle music well, I'm comparing the entire Jellyfin experience to the entire Plex experience. Plex wins that comparison on music. Every time. That's a hard migration to justify.
But if Navidrome handles music and Jellyfin only has to handle video, the comparison becomes video versus video. That's a much more favorable fight for Jellyfin, which is genuinely good at video and improving.
Navidrome is already running, pointed at the same /mnt/user/media/music directory that Lidarr writes to, doing its job in the background. That piece is done. Navidrome doesn't care what I decide about Jellyfin.
The remaining concerns from Part 1, Tautulli, family app quality, the Prologue audiobook situation, are all video-adjacent problems. I can work through each of them without music muddying the comparison.
The Short Version
Jellyfin doesn't have a music problem it's actively trying to solve. Navidrome is a music server that does nothing else and does it well. Those two facts point at the same answer: don't ask Jellyfin to handle music. Split the stack.
One container, one job, a $10 iOS app. Music is handled. On to the harder problems.
Next up: Part 3 — Setting Up Jellyfin on Unraid and Connecting the *arr Stack
Running Navidrome? Using a different iOS client? Drop it in the comments.
Comments