Your Music, Your Server, No Subscriptions
Navidrome is a lightweight, open-source music server that streams your personal music library to any device using the Subsonic API – meaning it works with dozens of existing apps on iOS, Android, and the desktop without any proprietary client software.

What You Need Before You Start
Navidrome runs on Linux, macOS, and Windows, but this guide uses Ubuntu 22.04 or Debian 12 on a home server or VPS. The requirements are modest: a single-core CPU handles most libraries fine, and RAM usage sits well under 100MB at idle. What actually matters is storage – your music files need to live somewhere accessible, whether that is a local directory, an NFS mount, or an external drive.
You will also want a domain name or at least a local hostname if you plan to access Navidrome outside your home network. For remote access, a reverse proxy like Nginx or Caddy sits in front of Navidrome and handles HTTPS termination. Without HTTPS, sending your login credentials over the open internet is a bad idea, so treat that step as required rather than optional. If you are already running a self-hosted media stack – for example, if you have already set up Jellyfin as a self-hosted Netflix alternative – you likely have Nginx or Caddy configured already, and you can reuse that setup here.
Organize your music library before you point Navidrome at it. The server reads ID3 tags from MP3, FLAC, AAC, OGG, and other common formats, and it relies on those tags for artist names, album titles, track numbers, and cover art. A folder full of files named “track01.mp3” with no embedded metadata will produce a messy, unusable library. Tools like MusicBrainz Picard or beets can scan and fix tags in bulk before the import.
The simplest deployment method is Docker, which keeps Navidrome isolated from the rest of your system and makes updates a single command. The guide below covers both the Docker approach and a direct binary install, so you can choose whichever fits your setup.
Installing and Configuring Navidrome
For Docker, create a working directory – something like /opt/navidrome – and place a docker-compose.yml file inside it. A minimal compose file looks like this:
version: "3"
services:
navidrome:
image: deluan/navidrome:latest
restart: unless-stopped
ports:
- "4533:4533"
environment:
ND_SCANSCHEDULE: 1h
ND_LOGLEVEL: info
ND_BASEURL: ""
volumes:
- ./data:/data
- /path/to/your/music:/music:ro
Replace /path/to/your/music with the actual path to your library. The :ro flag mounts it read-only, which is good practice – Navidrome has no reason to write to your music files. Run docker compose up -d and the server will be live at http://your-server-ip:4533 within seconds. The first time you open that address, Navidrome prompts you to create an admin account. Do that immediately, before anything else, because any unauthenticated user who reaches that page first can claim the admin role.
For a direct binary install without Docker, download the latest release from the Navidrome GitHub releases page for your architecture – typically the linux_amd64 build. Extract it to /opt/navidrome, make the binary executable with chmod +x navidrome, and create a configuration file at /etc/navidrome/navidrome.toml. A basic config sets the music folder and data directory:
MusicFolder = "/path/to/your/music" DataFolder = "/var/lib/navidrome"
Create a dedicated system user to run the process – never run it as root. A systemd service file handles automatic startup and restarts. Set User=navidrome, ExecStart=/opt/navidrome/navidrome, and Restart=on-failure in the service unit, then enable it with systemctl enable –now navidrome. Check journalctl -u navidrome -f to confirm it starts cleanly and begins scanning your library.

Once the server is running, put Nginx in front of it. Create a server block that proxies requests to localhost:4533 and add a Certbot-managed SSL certificate. The key directive is proxy_pass http://127.0.0.1:4533; along with the standard proxy header lines for X-Real-IP, X-Forwarded-For, and X-Forwarded-Proto. If you set a ND_BASEURL in the Navidrome config – for example /music if you want to serve it at a subdirectory – that path must match exactly in both the config file and the Nginx location block, or you will get broken asset URLs. Subdomain setups like music.yourdomain.com are cleaner and avoid that complexity entirely.
The admin panel under Settings lets you manage users, set individual password policies, and control which users can modify metadata or download files. Each non-admin user gets their own play history, playlists, and starred tracks – those are stored per-account in Navidrome’s internal SQLite database. For larger libraries, you can switch to PostgreSQL by setting ND_DBPATH to a Postgres connection string, though SQLite handles libraries of tens of thousands of tracks without issue.
Connecting Apps and Playing Music
Navidrome exposes a Subsonic-compatible API, which means any Subsonic or Airsonic client works with it out of the box. On Android, DSub and Symfonium are popular choices. On iOS, Amperfy and play:Sub both connect reliably. For the desktop, Sonixd (now called Feishin) is a cross-platform Electron app that handles large libraries well and supports gapless playback. To connect any of these, enter your server URL, your username, and your password – most clients also have a “test connection” button that confirms everything is working before you commit to the setup.

Transcoding is worth configuring if you store lossless FLAC files and stream to mobile devices on cellular connections. Navidrome can transcode on the fly using ffmpeg – install ffmpeg on the host, and the ND_TRANSCODINGCACHESIZE setting controls how much disk space it uses for cached transcodes. Clients let users select a maximum bitrate, so a phone on LTE can request 128kbps AAC while the same file plays back in full FLAC quality on a home network. Without ffmpeg installed, transcoding silently falls back to direct stream, which burns through mobile data quickly on lossless files.





