Navidrome Raspberry Pi turns a Pi 4 into a self-hosted music server that streams your FLAC, MP3, and lossless library to phones, desktops, and browsers simultaneously. Navidrome implements the Subsonic API, which means every major mobile and desktop music client connects to it out of the box. The entire server is a single Go binary under 30MB, it runs comfortably on a Pi 4 with 2GB RAM, and it scales to libraries of hundreds of thousands of tracks without requiring a database server. This guide covers Docker Compose installation, library organisation, client setup, HTTPS access, Last.fm scrobbling, and maintenance.
Last tested: Raspberry Pi OS Bookworm Lite 64-bit | April 18, 2026 | Raspberry Pi 4 Model B (4GB) | Navidrome 0.53.3 | Docker 27.3 | Ultrasonic (Android) + Infuse (iOS)
Key Takeaways
- Navidrome does not transcode by default. It streams files in their original format. If a client requests a lower bitrate (common on mobile), Navidrome calls ffmpeg to transcode on the fly. Transcoding is CPU-intensive on a Pi. Avoid it for local LAN clients that can handle FLAC directly.
- Store your music library on a USB SSD, not microSD. Navidrome writes a SQLite database and thumbnail cache continuously. MicroSD wear under sustained write activity will shorten its life and risk data loss.
- The first account created in Navidrome is automatically the admin account. Create it immediately after installation. Until you do, anyone who reaches port 4533 can create the admin account and take control of the server.
Navidrome Raspberry Pi: How It Works
Navidrome scans a music folder on startup and on a configurable schedule, reads ID3 and Vorbis Comment tags from each file, and builds a SQLite database of artists, albums, tracks, and artwork. It then serves this library over HTTP on port 4533 using the Subsonic API. Any Subsonic-compatible client (Ultrasonic, DSub, Symfonium, Strawberry, NetNewsWire) authenticates to Navidrome with a username and password and streams tracks directly.
Multiple users can connect simultaneously with independent playback sessions, separate playlists, and individual play history. The server does not enforce a user limit. Practical capacity depends on whether transcoding is active. A Pi 4 handles 10 or more simultaneous direct streams without strain. Transcoding even a single stream to MP3 128kbps uses roughly 40% of one CPU core on a Pi 4.
| Format | Lossless | Direct stream support | Notes |
|---|---|---|---|
| FLAC | Yes | Yes | Preferred for quality; large files |
| MP3 | No | Yes | Universal compatibility |
| AAC / M4A | No | Yes | Common for Apple-ripped files |
| OGG Vorbis | No | Yes | Open source, good quality-to-size ratio |
| ALAC | Yes | Yes | Lossless, native on Apple devices |
| OPUS | No | Yes | Excellent at low bitrates |
Hardware and OS Preparation
Pi 4 with 2GB RAM is the practical minimum for a single-user Navidrome setup with a moderate library. The 4GB model handles multi-user concurrent streams and light transcoding without memory pressure. Pi 5 works identically. The setup steps are the same and performance is noticeably better for large library scans.
Use a USB SSD for the music library and Navidrome data directory. See Booting Raspberry Pi from USB SSD for setup. Flash Raspberry Pi OS Bookworm Lite 64-bit using Raspberry Pi Imager. In the advanced settings, set hostname, enable SSH, and configure credentials. After first boot:
sudo apt update && sudo apt full-upgrade -y
Set a static IP with nmcli so clients always reach the server at the same address:
sudo nmcli connection modify "Wired connection 1" \
ipv4.method manual \
ipv4.addresses 192.168.1.70/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns 192.168.1.1
sudo nmcli connection up "Wired connection 1"
Create and mount the music directory. Use the drive’s UUID for a persistent mount:
sudo mkdir -p /mnt/music
blkid /dev/sda1
# Add to /etc/fstab:
# UUID=your-uuid-here /mnt/music ext4 defaults,nofail,noatime 0 2
sudo mount -a
The noatime mount option prevents the filesystem from updating file access timestamps on every read, which reduces unnecessary write cycles on the SSD. For supply adequacy verification under sustained streaming load, see Raspberry Pi Power Monitoring via USB.
Installing Navidrome
Docker Compose (recommended)
Install Docker and Compose v2:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
sudo apt install docker-compose-plugin -y
Log out and back in, then create the project directory:
mkdir -p ~/navidrome && cd ~/navidrome
Create compose.yaml:
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
restart: unless-stopped
user: "1000:1000"
ports:
- "127.0.0.1:4533:4533"
environment:
ND_MUSICFOLDER: /music
ND_DATAFOLDER: /data
ND_SCANSCHEDULE: 1h
ND_LOGLEVEL: warn
ND_ENABLETRANSCODINGCONFIG: "true"
volumes:
- ./data:/data
- /mnt/music:/music:ro
docker compose up -d
docker compose logs -f navidrome
Expected result: The log shows Navidrome starting, scanning the music folder, and listening on port 4533. Navigate to http://<pi-ip>:4533 in a browser. The first-time setup page asks you to create an admin account. Create it now. Do not leave this step until later.
Native binary install
For users who prefer a direct install without Docker, download the arm64 binary from the Navidrome releases page. On Bookworm 64-bit, use the linux_arm64 build:
sudo mkdir -p /opt/navidrome /var/lib/navidrome
sudo wget -O /tmp/navidrome.tar.gz \
https://github.com/navidrome/navidrome/releases/latest/download/navidrome_linux_arm64.tar.gz
sudo tar -xzf /tmp/navidrome.tar.gz -C /opt/navidrome
sudo chown -R pi:pi /opt/navidrome /var/lib/navidrome
Create /etc/navidrome/navidrome.toml:
MusicFolder = "/mnt/music"
DataFolder = "/var/lib/navidrome"
Port = "4533"
ScanSchedule = "1h"
LogLevel = "warn"
Create the systemd service at /etc/systemd/system/navidrome.service:
[Unit]
Description=Navidrome Music Server
After=network.target
[Service]
ExecStart=/opt/navidrome/navidrome --configfile /etc/navidrome/navidrome.toml
User=pi
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now navidrome
sudo systemctl status navidrome
Expected result: systemctl status navidrome shows the service active. The web interface is reachable at http://<pi-ip>:4533.

Library Organisation and Metadata
Navidrome reads metadata from file tags, not folder names. The folder structure helps with organisation but Navidrome does not require a specific hierarchy. It reads whatever tags are embedded in each file. A clean tagging workflow prevents the library from showing artists named “Unknown” or albums merged incorrectly across compilation releases.
Recommended folder structure:
/mnt/music/
Artist Name/
Album Name (Year)/
01 - Track Title.flac
02 - Track Title.flac
Tag your files before adding them to the library. Reliable tagging tools:
- MusicBrainz Picard: Auto-identifies recordings by audio fingerprint and fetches tags, artwork, and MusicBrainz IDs. Best for large libraries with inconsistent tags.
- beets: Command-line tool with plugin ecosystem. Handles bulk imports, duplicate detection, and format conversion.
- Mp3tag / EasyTag: GUI editors for manual tag corrections.
Trigger a manual library rescan from the web interface under Settings > Library, or restart the container. Navidrome also rescans on the schedule set in ND_SCANSCHEDULE.
Clients and Multi-Device Access
Navidrome uses the Subsonic API. Any Subsonic-compatible client connects by entering the server URL (http://<pi-ip>:4533 or the HTTPS domain), username, and password. No additional configuration is required on the server side.
| Client | Platform | Notes |
|---|---|---|
| Ultrasonic | Android | Open source, F-Droid, reliable sync and offline cache |
| Symfonium | Android | Modern UI, good FLAC support, paid |
| DSub | Android | Stable, feature-complete, long-maintained |
| Infuse | iOS | Polished, supports gapless, paid |
| Substreamer | iOS | Clean interface, caching, free tier available |
| Strawberry | Linux / Windows / macOS | Best desktop client, gapless, ReplayGain |
| Sonixd | Linux / Windows / macOS | Modern Electron app, cross-platform |
Navidrome’s built-in web interface runs in any browser and installs as a PWA. On Android, open the HTTPS URL in Chrome and use Add to Home Screen. On iOS, use Safari and Share > Add to Home Screen. The PWA caches album art and user session state for a near-native experience.
User management
Create additional users under Settings > Users in the admin interface. Each user has their own play history, playlists, and starred tracks. Two roles are available: Admin (full control) and User (stream and manage own playlists). Create a dedicated account for each household member rather than sharing credentials. This preserves independent play history and prevents playlist conflicts.
HTTPS Access and Remote Streaming
Most mobile clients require HTTPS for external access. Set up Caddy as a reverse proxy for automatic TLS:
music.yourdomain.duckdns.org {
reverse_proxy localhost:4533
}
For the full Caddy installation and DuckDNS setup, see Caddy Reverse Proxy Raspberry Pi. Forward ports 80 and 443 to the Pi. After Caddy is running, update clients to use the HTTPS URL.
For remote access without exposing the server to the internet, use a WireGuard VPN. Clients connect to the home network through the tunnel and reach Navidrome at its LAN IP. See WireGuard Raspberry Pi Site-to-Site VPN for the setup. The VPN approach is preferable for a music library. There is no good reason to expose a media server to the public internet.
Transcoding for remote clients
Install ffmpeg on the Pi host (or confirm it is available inside the Docker container. The official image includes it):
sudo apt install ffmpeg -y
Set a maximum bitrate in the Docker environment to limit transcoding CPU usage for mobile clients on slow connections:
ND_MAXBITRATE: "192"
For LAN clients, set the client app to “No Limit” or “Original Quality” so Navidrome streams FLAC directly without transcoding.
Last.fm Scrobbling and Metadata
Navidrome supports Last.fm scrobbling. Enable it in navidrome.toml (native install) or via environment variables (Docker). The correct environment variable names for Docker:
ND_LASTFM_ENABLED: "true"
ND_LASTFM_APIKEY: "your-lastfm-api-key"
ND_LASTFM_SECRET: "your-lastfm-secret"
After enabling Last.fm at the server level, each user links their own Last.fm account in Settings > Personal > Last.fm in the web interface. The server-level API key is required for the connection; the per-user linking determines which Last.fm account receives scrobbles.
Navidrome also fetches artist biographies and additional album metadata from MusicBrainz and Last.fm when the library is scanned. This enriches the browsing experience without requiring manual intervention.
Backups and Maintenance
Two things to back up: the ./data directory (SQLite database, artwork cache, configuration) and the music library itself. The music library is likely your most valuable asset. The Navidrome database can be rebuilt from the files but not the reverse.
#!/bin/bash
# Backup Navidrome data directory
TIMESTAMP=$(date +%Y%m%d-%H%M)
mkdir -p ~/navidrome/backups
docker compose -f ~/navidrome/compose.yaml stop navidrome
tar -czf ~/navidrome/backups/navidrome-$TIMESTAMP.tar.gz -C ~/navidrome/data .
docker compose -f ~/navidrome/compose.yaml start navidrome
ls -tp ~/navidrome/backups/*.tar.gz | tail -n +8 | xargs -I {} rm -- {}
For encrypted, deduplicated backups of both the data directory and music library, see BorgBackup Raspberry Pi Prune Policies. Borg handles large music libraries efficiently through deduplication. Unchanged files are not re-transferred on each backup run.
Keep Navidrome updated:
docker compose pull
docker compose up -d
docker image prune -f
Monitor resource usage during library scans and transcoding:
# CPU and memory
htop
# Temperature (throttling during heavy transcoding)
vcgencmd measure_temp
# Navidrome container stats
docker stats navidrome
Troubleshooting
Tracks not appearing after scan
# Check permissions on the music volume
ls -la /mnt/music/
# Confirm the container user (1000:1000) can read the files
docker exec navidrome ls /music
# Trigger a manual scan
docker exec navidrome navidrome --scan
The most common cause is that the container user (UID 1000) cannot read files owned by root or another user. Fix with sudo chown -R 1000:1000 /mnt/music. Also check that the file extension is in Navidrome supported list. Unsupported formats are silently skipped.
Client cannot connect
# Test the Subsonic API endpoint directly
curl -s "http://<pi-ip>:4533/rest/ping?u=admin&p=password&v=1.16.1&c=test&f=json"
A successful ping returns "status":"ok". A failed ping indicates the server is not running, the port is blocked, or credentials are wrong. Confirm the firewall allows port 4533 and the container is running with docker ps.
Playback skips or buffers
On a LAN, skipping is almost always a network issue rather than a server issue. Confirm the Pi is on wired Ethernet rather than Wi-Fi. Check whether the client is requesting transcoding. A FLAC stream at 1000kbps over Wi-Fi to a room two walls away will buffer. Switch the client to a lower bitrate or move to wired. For the server side, check vcgencmd measure_temp. Thermal throttling on the Pi during heavy transcoding can cause audio gaps.
Album art not showing
Navidrome prefers embedded artwork over folder.jpg files. If artwork is missing, embed it using MusicBrainz Picard or Mp3tag, then trigger a library rescan. Navidrome caches artwork in ./data. If artwork changed after the last scan, delete the cache directory and rescan to regenerate it.
FAQ
How many simultaneous streams can Navidrome handle on a Pi 4?
For direct streams (no transcoding), a Pi 4 handles 10 or more simultaneous connections without measurable strain. Navidrome is serving files from disk and the bottleneck is network bandwidth, not CPU. For transcoded streams, each simultaneous transcode uses roughly 40% of one CPU core. The Pi 4 has four cores, so three to four simultaneous transcoded streams is the practical ceiling before audio quality degrades.
Can I use Navidrome with Sonos or Chromecast?
Not directly. Navidrome exposes the Subsonic API; Sonos and Chromecast do not speak Subsonic natively. Workarounds exist: BubbleUPnP Server can bridge Subsonic to DLNA/UPnP for Sonos, and some Android clients like Ultrasonic support Chromecast casting. Neither approach is as seamless as a purpose-built integration.
Does Navidrome support gapless playback?
Navidrome streams files continuously and does not insert gaps. Gapless playback depends on the client. Strawberry, Symfonium, and Sonixd handle gapless transitions correctly. Some older clients add a brief gap between tracks regardless of the server’s behaviour.
How does Navidrome compare to Jellyfin for music?
Navidrome is purpose-built for music and does it extremely well. Jellyfin handles music alongside video and photos but its music browsing and client app ecosystem are less mature. For a dedicated music server, Navidrome is the better choice. For a household that wants music and video from one server, Jellyfin covers both at the cost of some music-specific polish.
Can I import playlists from Spotify or Apple Music?
Not directly. Spotify and Apple Music use proprietary formats and do not export standard M3U playlists. Tools like Soundiiz and TuneMyMusic can export playlist track lists to CSV or text, which you can then use as a reference to build M3U playlists pointing to your local files. Place M3U files in the music folder and Navidrome imports them automatically on the next scan.
References
- https://www.navidrome.org/docs/
- https://github.com/navidrome/navidrome
- https://hub.docker.com/r/deluan/navidrome
- https://www.subsonic.org/pages/api.jsp
About the Author
Chuck Wilson has been programming and building with computers since the Tandy 1000 era. His professional background includes CAD drafting, manufacturing line programming, and custom computer design. He runs PidiyLab in retirement, documenting Raspberry Pi and homelab projects that he actually deploys and maintains on real hardware. Every article on this site reflects hands-on testing on specific hardware and OS versions, not theoretical walkthroughs.
Last tested hardware: Raspberry Pi 4 Model B (4GB), USB 3.0 SSD. Last tested OS: Raspberry Pi OS Bookworm Lite 64-bit. Navidrome 0.53.3, Docker 27.3, Ultrasonic on Android, Infuse on iOS.

