Navidrome

Modern music streaming server for your collection

Media Servers ★ 23.8k stars Easy setup GPL-3.0

Navidrome is a lightweight music server and streamer that is compatible with Subsonic API clients. It suits music collectors who want to stream their own library anywhere. It is deployed via Docker or a single binary.

Navidrome setup guides & articles

Hands-on coverage of Navidrome from the blog.

Key features

  • Subsonic API compatibility
  • Fast modern web player
  • Multi-user with playlists
  • Low resource usage

Quick deploy

A starting point for self-hosting Navidrome - check the official docs for the full set of options.

  • Image deluan/navidrome:latest
  • Web port 4533
  • Persist /data /music
Docker Compose
services:
  navidrome:
    image: deluan/navidrome:latest
    ports:
      - "4533:4533"
    volumes:
      - ./data:/data
      - ./music:/music
    restart: unless-stopped
docker run
docker run -d --name navidrome \
  -p 4533:4533 \
  -v ./data:/data \
  -v ./music:/music \
  --restart unless-stopped \
  deluan/navidrome:latest

Watch out for

  • Mount the music library read-only - Navidrome never needs to write to it
  • Set ND_BASEURL if you serve it under a subpath instead of a subdomain

Pros & cons

Strengths

  • Very lightweight
  • Works with many mobile apps
  • Easy to set up

Trade-offs

  • Music only
  • No video support

Navidrome replaces

Last reviewed Aug 25, 2026 · 645 words

Navidrome is the 128 MB music server that makes a personal collection stream like Spotify — web player, phone apps, playlists, offline caching — and the install is genuinely the easy part: one container, two mounts, done in ten minutes. The honest guide is about everything around the install: your tags (which are the actual product), the client you choose (which defines the experience), and the two settings that trip up every reverse-proxied deployment.

The install is two mounts and a rule

services:
  navidrome:
    image: deluan/navidrome:latest
    ports:
      - "4533:4533"
    environment:
      - ND_SCANSCHEDULE=1h
      - ND_BASEURL=
    volumes:
      - ./data:/data
      - /srv/music:/music:ro
    restart: unless-stopped

The :ro on the music mount is a rule, not a suggestion: Navidrome never writes to your library — its database, play counts, and playlists live in /data — so a read-only mount costs nothing and makes the server incapable of harming twenty years of collecting. ND_BASEURL matters only if you serve it under a subpath (/music) rather than a subdomain; leave it empty for music.example.com behind Caddy. Back up /data (small, SQLite) and the music separately per the 3-2-1 rules; re-scanning can rebuild the index, but play counts and playlists live only in that folder.

Your tags are the product

Navidrome displays exactly what your files' tags say — it deliberately doesn't rewrite, guess, or "fix" anything, which is a feature right up until it renders your inconsistent tagging back at you in high fidelity. The pre-Navidrome ritual that pays off forever: run the collection through MusicBrainz Picard (or beets, for the scriptable-minded), standardise album artist versus artist (the source of 90% of "why is my library split" complaints), embed art, and settle compilation handling. A weekend of tagging turns Navidrome from a file browser into a library. Multi-disc albums, classical box sets, and featured-artist chaos all resolve at the tag layer — no server setting fixes what Picard doesn't.

The client decides the experience

The web player is good; the phone is where you'll live, and the Subsonic-API ecosystem means you choose from purpose-built players rather than settling for one official app. The short list that covers most people: Symfonium (Android, paid, the current gold standard — offline sync, gapless, Android Auto), Tempo (Android, free and clean), play:Sub or Amperfy (iOS), Sonixd/Supersonic (desktop). Enable each client's offline caching for the commute — that single feature is what makes cancelling the streaming subscription stick. Scrobbling to ListenBrainz/Last.fm is native in server settings, and after a year the listening-history data is quietly one of the best parts.

Transcoding: set it once for mobile data

Your FLACs are wonderful on Wi-Fi and brutal on a metered connection. Navidrome transcodes on the fly per player: define an Opus 128k profile in Settings → Players once, and phone clients request it automatically on data while the home network streams lossless. CPU cost is trivial for music (unlike video transcoding's arithmetic), so there's no hardware planning — a Pi handles a household. Speaking of households: create one account per person. Play counts, favourites, and playlists are per-user, and "my partner's podcast episodes in my recently-played" is a wound that never heals.

What I'd do

Picard weekend first, then the compose file above, Symfonium on the phone with offline sync of the 20 most-played albums, Opus transcoding profile set, one account per household member, /data in the nightly backup. Total footprint rounds to nothing next to the rest of the rack, and the result — the full own-your-Spotify setup — is the rare self-hosted service that's genuinely nicer than the subscription it replaces, because it plays your collection, not a licensing catalogue's current mood.

Compare Navidrome

22 head-to-head comparisons.

Similar media servers apps