August 24, 2026
Navidrome: Personal Music on the OpenSubsonic Protocol
A lightweight Go-based self-hosted music server speaking the OpenSubsonic protocol: tag-first library handling, read-only mounts, and compatibility with dozens of playback apps.
Navidrome is a self-hosted music streaming server in Go. Instead of uploading a collection to the cloud, it plays your own audio files from a local directory — through the browser or any app speaking the OpenSubsonic protocol.
Why Navidrome
The real problem: a personal collection, including lossless formats like FLAC, is never fully on subscription streaming platforms — some albums missing, some different masters, all dependent on a rented service. The common homelab answer is a Subsonic-compatible server, and Navidrome is one of the lightest options.
- Very lightweight. Written in Go; per official docs it runs comfortably even on a Raspberry Pi Zero. On a single-machine homeserver, no fighting for RAM with other services.
- OpenSubsonic ecosystem. Compatible with Subsonic API v1.16.1 plus OpenSubsonic extensions constantly being added. Dozens of mobile and desktop players work out of the box: Symfonium, Feishin, Substreamer, and others.
- Canonical library protection. The music directory is mounted read-only, so Navidrome cannot consume or corrupt the canonical audio files.
Architecture and How It Works
Navidrome treats the library by tags, not by folder structure. A scheduled scanner (default @every 24h) reads metadata from audio files into a SQLite database in the data folder. On playback, the server streams directly from the original file — no upfront conversion.
- Tag-first library: various-artists compilations and multi-disc box sets are handled natively.
- Multi-user: each account keeps its own play counts, playlists, and favorites.
- Music only: the API deliberately implements no video functionality.
Deployment with Docker Compose
The setup below follows the official Navidrome Docker docs:
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
user: 1000:1000
restart: unless-stopped
ports:
- "4533:4533"
environment:
ND_SCANSCHEDULE: 1h
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 24h
volumes:
- ./navidrome-data:/data
- ./music-library:/music:ro
user: 1000:1000 must own the data folder and read the music folder. Official images cover amd64, arm v6/v7, and arm64.
Security Note: The
./music-libraryvolume is mounted read-only (:ro) to protect canonical audio files from accidental modification.
This container exposes only port 4533; access from outside should go through a reverse proxy.
Security and Operations
- Do not run as root. Navidrome only needs read-only access to the music folder and read-write to the data folder;
EnforceNonRootUserrefuses containers running as root. - Use a reverse proxy. The embedded HTTP server is fine behind a reverse proxy (Caddy, Nginx, Traefik, Apache) with SSL; it can also bind to localhost only via
Address(ND_ADDRESS). - Browser sessions.
ND_SESSIONTIMEOUTcontrols when idle sessions close; the default is 48 hours, the config above uses 24 hours. - Credentials in the database. For Subsonic API compatibility, user passwords are stored in the database, encrypted with a shared key; you can override it once via
PasswordEncryptionKey, after which it cannot change.
Synced Lyrics and Transcoding
Synchronized lyrics are read from .lrc sidecar files that share the audio file’s name. The order of lyric sources is controlled with LyricsPriority:
# navidrome.toml
LyricsPriority = ".lrc,embedded,.txt"
For mobile bandwidth, Navidrome uses ffmpeg to downsample on client request. Downsampling defaults to opus; transcode output is cached separately, so the FLAC collection is never modified.
Trade-offs and Limitations
- No web upload. This is by design; music files are managed outside Navidrome.
- No metadata editing in the UI. Messy tagging must be fixed with external tools (Picard, beets, etc.) and rescanned. Navidrome is tag-first: folder browsing is not planned;
getIndexesreturns only a simulated/Artist/Album/01 - Song.mp3tree. - Music only. There is no video support.
- Multi-value tags in M4A/AAC can misbehave.
ARTISTS/ALBUMARTISTSin AAC/M4A files occasionally read as a single artist, depending on the tagging tool.
Backup and Recovery
Navidrome state (users, play counts, playlists, favorites) lives in SQLite inside ./navidrome-data. Because the music folder is read-only, restoring the server means restoring that folder; the scanner rebuilds the index from the music files.
Since v0.54, Navidrome includes a built-in scheduled backup that exports the database periodically:
[Backup]
Path = "/path/to/backup/folder"
Count = 7
Schedule = "0 0 * * *"
This backup covers only the database (users and play counts), not music files or configuration. The music collection still needs its own backup — e.g., off-host storage.
Conclusion
Navidrome is a strong pick for personal music streaming on a homeserver: lightweight, a mature OpenSubsonic client ecosystem, and read-only treatment of the original collection. On a single machine with limited resources it runs with negligible overhead and full audio quality.
Honestly, it is not for everyone: messy tags, or a habit of browsing by folder structure, require adjustment. But for a cleanly tagged library played from any device without a cloud subscription, Navidrome works very well.
