"Point it at the music. Get a library."
Grooverr is a self-hosted music acquisition and library manager. Search for a track, album, artist, or paste a YouTube Music playlist link. Grooverr resolves canonical metadata via MusicBrainz, downloads audio via YouTube Music, converts it to your chosen format, tags it with Picard-compatible metadata and embedded cover art, and files it into your library using a clean, predictable naming convention that Plex, Navidrome, Jellyfin, or any scraper can read without further massaging.
Single-user, no accounts, no Spotify dependency.
- Docker (or a Docker-compatible host, e.g. Unraid)
- Two persistent locations: one for your music library, one for Grooverr's own config/database
docker run -d \
--name grooverr \
-p 8000:8000 \
-e PUID=1000 \
-e PGID=1000 \
-v /path/to/your/music:/music \
-v /path/to/appdata/grooverr:/config \
--restart unless-stopped \
lffpicard/grooverr:latestThen open http://<host>:8000.
git clone https://github.com/LFFPicard/Grooverr.git
cd Grooverr
docker compose up -dEdit the volumes: section of docker-compose.yml first — the checked-in
paths (/path/to/your/music, /path/to/appdata/Grooverr) are placeholders.
- In the CA app store, search for Grooverr. (Until the template is
accepted into the official CA index, add it manually: Apps → Template
URL, paste
https://raw.githubusercontent.com/LFFPicard/Grooverr/master/unraid/grooverr.xml.) - Set Music to your existing music share (e.g.
/mnt/user/music/). - Set Config to a dedicated appdata folder (e.g.
/mnt/user/appdata/grooverr/) — never point this at the same path as Music. - Leave PUID/PGID at the defaults (
99/100, Unraid'snobody/users) unless your library is owned by a different user. - Apply, then open the WebUI from the Docker tab.
Open Settings in the web UI and configure:
- MusicBrainz user-agent string (no API key needed, but MusicBrainz rate-limits by user-agent)
- Optional YouTube cookie file, if you hit YouTube rate limits or need access to age-restricted content
- Default quality ceiling
- Output path template
Then use Search to find a track, album, artist, or paste a YouTube Music playlist link, and add it to your library. Progress is visible live on the Dashboard and Queue screens.
| Variable | Default | Description |
|---|---|---|
PUID |
1000 |
User ID Grooverr runs as, so files written to /music and /config are owned by a user you can manage |
PGID |
1000 |
Group ID Grooverr runs as |
PORT |
8000 |
Port the web server listens on inside the container |
| Container path | Purpose |
|---|---|
/music |
Your music library. Grooverr reads what's already there to skip duplicates, and writes newly downloaded albums/tracks here. |
/config |
Grooverr's own database, settings, and optional YouTube cookies file. Keep this separate from /music. |
The container runs as a non-root user by default, dropping from root to the
PUID/PGID-mapped user at startup (same convention used by LinuxServer.io
images), and exposes a /api/health endpoint used by the built-in Docker
HEALTHCHECK.
git clone https://github.com/LFFPicard/Grooverr.git
cd Grooverr
docker build -t grooverr:local .The image is a multi-stage build: the React frontend is built in a Node stage and only its static output is copied into the final Python/FastAPI image, so Node tooling never ships in the final image.
Pushes to main automatically build and publish lffpicard/grooverr:latest
to Docker Hub via GitHub Actions (.github/workflows/docker-publish.yml).
To run this workflow in a fork, set these repository secrets:
| Secret | Description |
|---|---|
DOCKERHUB_USERNAME |
Docker Hub account/organization to publish under |
DOCKERHUB_TOKEN |
Docker Hub access token (Account Settings → Security → Access Tokens) |
TBD.