Skip to main content

How to Self-Host Navidrome: Music Streaming Server 2026

·OSSAlt Team
navidromemusicstreamingsubsonicself-hostingdockerspotify2026

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

FormatDescription
FLACLossless — best quality
MP3Lossy — most compatible
AAC/M4ALossy — good quality/size
OGG VorbisLossy — open source
ALACApple lossless
WMAWindows Media
AIFFUncompressed

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

AppPlatformNotes
SymfoniumAndroidBest Android Subsonic client
DSubAndroidClassic, reliable
substreameriOSGood iOS client
UltrasonicAndroidOpen source
SoniciOS/macOSNative macOS support

Desktop apps

AppPlatformNotes
FeishinAllModern Electron client
SonixdAllOpen source, actively maintained
StrawberryLinux/WindowsMusic 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:

  1. Profile → Last.fm → Connect
  2. Authorize Navidrome on Last.fm
  3. 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:

  1. Browse albums/tracks
  2. Click +Add to playlist
  3. 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.

Comments