The new Docker Repo for MagicLists with Jellyfin Support and other upgrades
932
AI-assisted playlists for your own music library.
MagicLists adds the kind of curated, evolving playlists you’d expect from Spotify or Apple Music—except it works entirely on your self-hosted Navidrome or Jellyfin server. No subscriptions, no renting your music back. Just smart mixes generated from the library you already own.
Navidrome and Jellyfin users already own their music. MagicLists brings modern curation tools into that world—so your playlists feel alive, not static, and your collection keeps surprising you.
Why this method? Your MagicLists container will be on the same network as Navidrome, making connection simple and reliable. This also enables future features like audio analysis that require local file access. You also could use this compose to spin up a Szandalone Container.
docker-compose.yml (the one that runs Navidrome): services:
navidrome:
# ... your existing Navidrome or Jellyfin config ...
magiclists:
image: pirus999/magic-lists-ai-curator:latest
container_name: magiclists
ports:
- "4545:8000"
environment:
- SERVER_TYPE=navidrome # or jellyfin
- NAVIDROME_URL=http://navidrome:4533 # for Jellyfin use: JELLYFIN_URL=http://jellyfin:8096
- NAVIDROME_USERNAME=your_username # for Jellyfin use: JELLYFIN_USERNAME or JELLYFIN_API_KEY
- NAVIDROME_PASSWORD=your_password # for Jellyfin use: JELLYFIN_PASSWORD or JELLYFIN_API_KEY
- DATABASE_PATH=/app/data/magiclists.db # Required: Database location
- AI_PROVIDER=google # Optional: openrouter, groq, google, ollama
- AI_API_KEY=your_google_api_key # Optional, for OpenRouter/Groq/Google
- AI_MODEL=gemini-3.5-flash # Select one from your AI provider
- DESCRIPTION_AI_MODEL=gemma-4-26b-a4b-it # Optional, select a smaller model for Playlist descriptions
volumes:
- ./magiclists-data:/app/data # Persist configuration
restart: unless-stopped
docker-compose up -d
Note: The NAVIDROME_URL uses the container name (navidrome) as the hostname. If your Navidrome service has a different name in your compose file, update this accordingly.
Use this if you can't or don't want to modify your existing Docker Compose setup.
Docker Run If Navidrome is publicly accessible: Use your public Navidrome URL (e.g., https://music.yourdomain.com):
docker run -d \
--name magiclists \
-p 4545:8000 \
-e NAVIDROME_URL=https://music.yourdomain.com \
-e NAVIDROME_USERNAME=your_username \
-e NAVIDROME_PASSWORD=your_password \
-e DATABASE_PATH=/app/data/magiclists.db \
-e AI_PROVIDER=openrouter \
-e AI_API_KEY=your_openrouter_api_key \
-e AI_MODEL=dots-studio/dots-3-note-preview:free \
-v ./magiclists-data:/app/data \
pirus999/magic-lists-ai-curator:latest
| Section | Variable | Example / Default | What it does | Required? |
|---|---|---|---|---|
| Server selection | SERVER_TYPE | navidrome (or jellyfin) | Chooses which music server the app talks to. | Yes – defaults to navidrome. |
| Navidrome settings | NAVIDROME_URL | http://navidrome:4533 | Base URL of the Navidrome instance. | Required if SERVER_TYPE=navidrome. |
NAVIDROME_USERNAME | your_navidrome_username | Navidrome user name. | Required if Navidrome. | |
NAVIDROME_PASSWORD | your_password | Navidrome password (plain‑text – the container runs in a trusted environment). | Required if Navidrome. | |
| Jellyfin settings | JELLYFIN_URL | http://jellyfin:8096 | Base URL of the Jellyfin instance. | Required if SERVER_TYPE=jellyfin. |
JELLYFIN_USERNAME | admin | Jellyfin user name. | Required if Jellyfin. | |
JELLYFIN_PASSWORD | password | Jellyfin password. | Required if Jellyfin. | |
JELLYFIN_API_KEY | (empty) | API key for token‑based auth (optional – password auth works too). | Optional. | |
JELLYFIN_VERIFY_SSL | true | Verify TLS certs when using https. Set to false for self‑signed certs. | Optional. | |
| ListenBrainz Labs (artist‑radio) | LISTENBRAINZ_LABS_URL | https://labs.api.listenbrainz.org | Endpoint used for “artist radio” suggestions. | Fixed – leave as‑is. |
LISTENBRAINZ_TOKEN | (empty) | Personal token – only needed when you hit rate‑limits. | Optional. | |
LISTENBRAINZ_TIMEOUT | 15 (seconds) | HTTP timeout for ListenBrainz calls. | Optional. | |
| AI Provider | AI_PROVIDER | google (options: openrouter, groq, google, ollama) | Which LLM service to call for playlist curation. | Yes. |
AI_API_KEY | your_api_key_here | Provider‑specific API key (OpenRouter, Groq, Google). Not needed for Ollama. | Yes for all non‑Ollama providers. | |
| LLM Model | AI_MODEL | gemini-3.5-flash | The “heavy” model that does the actual playlist generation / reasoning. Choose a model that matches the provider you picked. | Yes. |
| Description‑only Model | DESCRIPTION_AI_MODEL | gemma-4-26b-a4b-it | A cheaper / faster model used only for short description generation (e.g., “Genre Mix”, “This is a playlist” text). If left empty, AI_MODEL is reused. | Optional. |
Ollama‑specific settings (ignored unless AI_PROVIDER=ollama) | OLLAMA_BASE_URL | http://localhost:11434/v1/chat/completions | URL of the local Ollama server. Adjust when running inside Docker (host.docker.internal) or via a separate compose service. | Optional – required for Ollama. |
OLLAMA_TIMEOUT | 180 (seconds) | HTTP request timeout for Ollama. Raise for slow CPUs or huge prompts. | Optional. | |
OLLAMA_MAX_TRACKS | 150 | Hard cap on how many tracks are sent to the LLM (prevents context‑size overflow). Leave empty for the automatic dynamic limit. | Optional. | |
| Filesystem & persistence | DATABASE_PATH | /app/data/magiclists.db | Where the SQLite DB lives inside the container. For Docker you normally mount a volume at /app/data. | Yes – defaults to the internal path. |
| Logging | LOG_LEVEL | INFO (options: ERROR, INFO, DEBUG) | Verbosity of the app’s log output. | Optional. |
| Navidrome library filter | NAVIDROME_LIBRARY_ID | (empty) | If you have multiple Navidrome libraries, set the ID to limit the app to one. | Optional. |
MIT License
No Warranty: This software is provided "as is" without warranty of any kind, express or implied.
User Responsibility: You are solely responsible for:
Limitation of Liability: The developers shall not be liable for any damages including but not limited to data loss, corruption of music libraries, or any other direct or indirect damages arising from use of this software.
Third-party Services: This application integrates with external AI services. Your use of these services is subject to their respective terms of service.
By using this software, you acknowledge and accept these terms.
Content type
Image
Digest
sha256:e9672d183…
Size
140.3 MB
Last updated
22 days ago
docker pull pirus999/magic-lists-ai-curator