Self-hosted web UI for managing Navidrome playlists, M3U editor, smart rule builder, dedup, merge, and bulk ops. No filesystem access required.
# Clone and configure
git clone https://github.com/fabienpiette/navilist.git
cd navilist
# Edit docker-compose.yml: set NAVIDROME_URL, NAVIDROME_USER, NAVIDROME_PASS
# Run
docker compose up -d
# Open
open http://localhost:8080Or from source (Go 1.22+ required):
NAVIDROME_URL=http://localhost:4533 \
NAVIDROME_USER=admin \
NAVIDROME_PASS=yourpassword \
go run ./cmd/server- Smart playlist builder, visual rule editor with 40+ filterable fields, live autocomplete for genre/artist/album, 12 preset templates, raw NSP JSON fallback
- M3U playlist editor, create and edit playlists with live search-as-you-type track search
- Dedup, find playlists with identical track lists, pick which to keep, delete the rest in one click
- Merge, combine two or more playlists into one (tracks deduplicated); optionally delete the sources
- Smart rename, suggest
Artist – Albumnames based on track metadata; edit before applying - M3U import, upload a
.m3ufile, get a match report (exact path → title fuzzy fallback), confirm to create - Batch ops, delete selected, delete all empty, export multiple playlists as a
.zip - Single binary, all templates and static assets embedded; no volume mounts needed in Docker
- Dark mode, stored in
localStorage; no cookies, no server round-trip
Prerequisites: a running Navidrome instance (v0.50+). Docker or Go 1.22+.
Note: the Navidrome account must have admin privileges. Non-admin accounts can only see public playlists and their own.
services:
navilist:
image: ghcr.io/fabienpiette/navilist:latest
container_name: navilist
restart: unless-stopped
ports:
- "8080:8080"
environment:
NAVIDROME_URL: http://navidrome:4533
NAVIDROME_USER: admin
NAVIDROME_PASS: yourpassword
networks:
- navidrome-net
networks:
navidrome-net:
external: truedocker compose up -dgit clone https://github.com/fabienpiette/navilist.git
cd navilist
go build -o navilist ./cmd/server
NAVIDROME_URL=http://localhost:4533 NAVIDROME_USER=admin NAVIDROME_PASS=secret ./navilist# Environment variables (all required except PORT)
NAVIDROME_URL=http://navidrome:4533 # Navidrome base URL
NAVIDROME_USER=admin # Navidrome username (must be admin)
NAVIDROME_PASS=secret # Navidrome password
PORT=8080 # Listening port (default: 8080)Playlist list (/), filter by All / M3U / Smart, client-side search, inline delete, batch delete/export, merge selected, dedup selected, smart rename selected, delete all empty.
New M3U (/playlists/new), type a name, search tracks, reorder with drag, save.
New Smart (/playlists/new/smart), add rules visually or paste NSP JSON directly; set sort field and limit. In a rule row, set field to genre/artist/album for live autocomplete suggestions.
Import (/import), upload a .m3u file; review the match report; confirm to create the playlist.
Merge, check two or more playlists, click merge selected, name the result, optionally delete sources.
Dedup, check two or more playlists, click find duplicates; for each group of identical playlists choose which to keep.
Smart rename, check smart playlists, click smart rename; suggested names are derived from track metadata; edit before applying.
- Smart playlists require Navidrome v0.50+ (earlier versions don't expose the
rulesfield via/api/playlist). - The M3U import fuzzy-match uses title search only; tracks with identical titles may match the wrong song.
- No authentication layer, intended for private/LAN use only. Do not expose port 8080 to the internet without a reverse proxy with auth.
- Genre autocomplete fetches the full genre list on each keystroke (Navidrome has no server-side genre filter); performance degrades with very large genre libraries.
- Architecture
- Contributing, dev setup, hook install, commit conventions
- Navidrome Smart Playlist format
Contributions welcome. See CONTRIBUTING.md for dev setup and guidelines.
Thanks to all contributors.
AGPL-3.0, if you distribute a modified version, you must release its source under the same terms.

