How to Self-Host Navidrome: Music Streaming Server 2026
TL;DR
Navidrome (GPL 3.0, ~12K GitHub stars, Go) is a modern, lightweight self-hosted music streaming server. Point it at your music folder and stream to any device via the web UI or hundreds of Subsonic-compatible apps. Spotify charges $9.99/month for music you don't own. Navidrome streams your own purchased collection — every FLAC, MP3, and ALAC file — to every device for free.
Key Takeaways
- Navidrome: GPL 3.0, ~12K stars, Go — music server compatible with Subsonic API
- Subsonic API: Works with 50+ existing client apps (DSub, Symfonium, Sonixd, Feishin)
- Transcoding: Serve FLAC to web browser as MP3/AAC on-the-fly for bandwidth efficiency
- Playlists: M3U playlists in your music folder, plus server-side playlists
- Last.fm scrobbling: Track listening history and discover similar music
- Multi-user: Each user has their own playback history, playlists, and favorites
Part 1: Docker Setup
# docker-compose.yml
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
restart: unless-stopped
ports:
- "4533:4533"
volumes:
- navidrome_data:/data
- /path/to/music:/music:ro # Your music library (read-only)
environment:
ND_SCANSCHEDULE: "1h" # Scan library every hour
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 24h
ND_BASEURL: ""
ND_MUSICFOLDER: /music
ND_TRANSCODINGCACHESIZE: 100MB
TZ: America/Los_Angeles
volumes:
navidrome_data:
docker compose up -d
Visit http://your-server:4533 → create admin account on first visit.
Part 2: HTTPS with Caddy
music.yourdomain.com {
reverse_proxy localhost:4533
}
Part 3: Music Library Structure
Navidrome reads standard music folder structure:
/music/
├── Artist Name/
│ ├── Album Name (Year)/
│ │ ├── 01 - Track One.flac
│ │ ├── 02 - Track Two.flac
│ │ └── cover.jpg ← Album art
│ └── Another Album (Year)/
│ ├── 01 - Song.mp3
│ └── cover.jpg
├── The Beatles/
│ ├── Abbey Road (1969)/
│ │ ├── 01 - Come Together.flac
│ │ └── 02 - Something.flac
│ └── cover.jpg
Supported formats
| Format | Description |
|---|---|
| FLAC | Lossless — best quality |
| MP3 | Lossy — most compatible |
| AAC/M4A | Lossy — good quality/size |
| OGG Vorbis | Lossy — open source |
| ALAC | Apple lossless |
| WMA | Windows Media |
| AIFF | Uncompressed |
Part 4: Transcoding
Serve high-quality FLAC files as compressed audio for bandwidth savings:
# Enable transcoding in docker-compose.yml:
# Requires ffmpeg in the container (included by default):
environment:
ND_TRANSCODINGCACHESIZE: 500MB # Cache transcoded files
Transcoding profiles (configured in web UI):
- mp3 320k: FLAC → MP3 320kbps
- mp3 192k: FLAC → MP3 192kbps (default for web browser)
- aac 256k: FLAC → AAC 256kbps (for mobile)
In the web UI:
- Admin → Users → [user] → Max bit rate: limit per user
Part 5: Client Apps (Subsonic API)
Navidrome implements the Subsonic API — any of these apps work:
Web browser
Built-in at https://music.yourdomain.com — modern Vue.js interface with:
- Queue management
- Shuffle / repeat
- Keyboard shortcuts
- Album art display
Mobile apps
| App | Platform | Notes |
|---|---|---|
| Symfonium | Android | Best Android Subsonic client |
| DSub | Android | Classic, reliable |
| substreamer | iOS | Good iOS client |
| Ultrasonic | Android | Open source |
| Sonic | iOS/macOS | Native macOS support |
Desktop apps
| App | Platform | Notes |
|---|---|---|
| Feishin | All | Modern Electron client |
| Sonixd | All | Open source, actively maintained |
| Strawberry | Linux/Windows | Music player with Subsonic support |
Setup (same for all apps)
Server URL: https://music.yourdomain.com
Username: your-navidrome-username
Password: your-navidrome-password
Part 6: Last.fm Scrobbling
Track your listening history on Last.fm:
- Profile → Last.fm → Connect
- Authorize Navidrome on Last.fm
- Every played track scrobbles automatically
This enables:
- Listening history and statistics
- Similar artist/album recommendations
- "Now Playing" display on your Last.fm profile
- Weekly/annual listening reports
Part 7: Playlists
M3U playlists in your music folder
# Create a playlist file in your music folder:
cat > /path/to/music/playlists/Morning Workout.m3u << 'EOF'
/music/Artist A/Album/01 - Energetic Song.mp3
/music/Artist B/Album/03 - Pump Up.flac
/music/Artist C/Album/07 - Fast Track.mp3
EOF
Navidrome imports M3U files from a configured playlist folder.
Server-side playlists
In the web UI:
- Browse albums/tracks
- Click + → Add to playlist
- Create new playlist or add to existing
Playlists sync to all connected apps via Subsonic API.
Part 8: Multi-User
# Create users in Navidrome admin UI:
# Admin → Users → + Add User
# User types:
# Admin: full access, can create users
# Regular: play music, manage own playlists
# Read-only: play only, no playlist management
Each user has separate:
- Playback history
- Playlists (private or shared)
- Star/favorites
- Recently played
- Last.fm connection
Maintenance
# Update:
docker compose pull
docker compose up -d
# Force library rescan:
# Admin → Library → Rescan Full
# Backup (Navidrome DB + config — your music files are separate):
tar -czf navidrome-backup-$(date +%Y%m%d).tar.gz \
$(docker volume inspect navidrome_navidrome_data --format '{{.Mountpoint}}')
# Logs:
docker compose logs -f navidrome
# Check library statistics:
# Admin → About → Library stats
See also: Jellyfin — if you also want to stream video
See all open source music tools at OSSAlt.com/categories/media.