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 server. No subscriptions, no renting your music back. Just smart mixes generated from the library you already own.
- 🎵 This Is (Artist) — Builds a definitive playlist for any artist in your library, combining hits, deep cuts, and featured appearances without duplicates.
- 🔄 Re-Discover — Rotates tracks you haven’t played in a while, helping you fall back in love with your collection.
- ⏰ Auto-Refresh — Keep playlists fresh with daily, weekly, or monthly updates.
- 🐳 Quick Setup — Simple Docker install; get started in minutes.
Navidrome 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.
I’m Ricky, a product designer with 20+ years in tech. I’m building MagicLists feature by feature, from UI and CSS to playlist logic, because I’m passionate about open-source, privacy-friendly music tools. This isn’t vaporware or a throwaway experiment—it’s genuine, ongoing research into how AI can enrich personal music libraries.
Upcoming experiments include:
- Multi-artist “radio” blends
- Decade and discovery-focused lists
- Creative journeys like The Long Way Home (a track-to-track sonic path) and Genre Archaeology (tracing influences backwards through time).
MagicLists is just getting started, and I’d love your feedback as it grows.
_Caption: Creating a 'This is (Artist)' playlist _
magiclists-navidrome/
├── backend/
│ ├── main.py # FastAPI entrypoint
│ ├── navidrome_client.py # Navidrome API client
│ ├── ai_client.py # AI integration
│ ├── database.py # SQLite database manager
│ ├── recipe_manager.py # Playlist recipe system
│ ├── rediscover.py # Re-discover logic
│ └── schemas.py # Pydantic models
├── frontend/
│ ├── templates/
│ │ └── index.html # Main web interface
│ └── static/
│ └── assets/
│ └── ml-logo.svg # Magic Lists logo
├── recipes/
│ ├── registry.json # Recipe registry
│ ├── this_is_v1_002.json # This Is recipe v1.2
│ └── re_discover_v1_004.json # Re-Discover recipe v1.4
├── assets/
│ └── images/
│ └── artist-radio.png # Screenshot
├── requirements.txt # Python dependencies
├── Dockerfile # Container configuration
├── docker-compose.yml # Docker Compose setup
└── README.md # This file
-
Clone the repository:
git clone https://github.com/rsynnot/magic-lists-for-navidrome.git cd magiclists-navidrome-mvp -
Create your environment file:
cp .env.example .env
-
Configure your
.envfile with your Navidrome details:# Required - Your Navidrome server details NAVIDROME_URL=https://your-navidrome-server.com NAVIDROME_USERNAME=your_username NAVIDROME_PASSWORD=your_password # Optional - AI features (see AI Configuration section below) AI_API_KEY=your_api_key_here AI_MODEL=openai/gpt-3.5-turbo
-
Start the application:
docker-compose up --build
-
Access the application:
- Open http://localhost:4545 in your browser
- The app will connect to your Navidrome server using the credentials in
.env
That's it! The application will be running in a Docker container with all dependencies included.
-
Install dependencies:
pip install -r requirements.txt
-
Set environment variables:
export NAVIDROME_URL=http://localhost:4533 export NAVIDROME_TOKEN=your_navidrome_api_token export AI_API_KEY=your_openai_api_key # Optional export AI_MODEL=gpt-3.5-turbo # Optional
-
Run the application:
cd magiclists-navidrome-mvp python -m uvicorn backend.main:app --reload --host 0.0.0.0 --port 8000
GET /- Web interfaceGET /api/artists- List all artists from NavidromePOST /api/create_playlist- Create a new "This Is" playlistPOST /api/create_playlist_with_reasoning- Create playlist with detailed reasoningGET /api/rediscover-weekly- Generate Re-Discover Weekly recommendationsPOST /api/create-rediscover-playlist- Create Re-Discover Weekly playlist in NavidromeGET /api/playlists- List all managed playlistsDELETE /api/playlists/{playlist_id}- Delete a managed playlistGET /api/recipes- List available recipe versionsGET /api/recipes/validate- Validate recipe configurationsGET /api/scheduler/status- Check auto-refresh scheduler statusPOST /api/scheduler/trigger- Manually trigger scheduled refreshesPOST /api/scheduler/start- Start the auto-refresh scheduler
The AI features enhance playlist curation with intelligent track selection. You can choose from free, low-cost, or premium models:
Getting an API Key:
- OpenRouter - Provides access to many models with free tiers
Model Options:
- Free/Low-cost:
deepseek/deepseek-chat,google/gemini-flash-1.5,meta-llama/llama-3.1-8b-instruct:free - Paid:
openai/gpt-3.5-turbo,openai/gpt-4o-mini,anthropic/claude-3-haiku
Example .env setup:
# For OpenRouter (free tier available)
AI_API_KEY=sk-or-v1-your-key-here
AI_MODEL=deepseek/deepseek-chat
# For OpenAI direct
AI_API_KEY=sk-your-openai-key
AI_MODEL=openai/gpt-3.5-turboNote: Without AI configuration, the app falls back to play-count based playlist generation.
| Variable | Description | Required |
|---|---|---|
NAVIDROME_URL |
Navidrome server URL | Yes |
NAVIDROME_USERNAME |
Navidrome username | Yes |
NAVIDROME_PASSWORD |
Navidrome password | Yes |
NAVIDROME_API_KEY |
Navidrome API key (future feature) | No |
AI_API_KEY |
OpenRouter API key for AI curation | No |
AI_MODEL |
AI model name (default: openai/gpt-3.5-turbo) | No |
DATABASE_PATH |
SQLite database file path | No |
- Install and configure Navidrome on your system
- Point Navidrome to your music library
- Create a user account
- Use these credentials in the MagicLists configuration
- FastAPI: Web framework and API
- httpx: HTTP client for Navidrome API
- aiosqlite: Async SQLite database
- Pydantic: Data validation and schemas
- Jinja2: HTML templating
- uvicorn: ASGI server
- New API endpoints: Add to
backend/main.py - Database changes: Modify
backend/database.py - Frontend updates: Edit
frontend/templates/index.html - Styling: Styles are handled with Tailwind CSS in the HTML template
-
Navidrome connection failed
- Check
NAVIDROME_URLis correct - Verify Navidrome is running
- Confirm username/password are valid
- Check
-
No artists found
- Ensure your music library is scanned in Navidrome
- Check Navidrome logs for scanning issues
-
Database errors
- Ensure write permissions for database directory
- Check disk space
MIT License - see LICENSE file for details.
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
This project uses Umami Analytics to anonymously measure feature usage (no cookies, no personal data are stored).
You can view the public dashboard here: magic-lists analytics
For issues and questions:
- Check the troubleshooting section
- Review Navidrome documentation
- Create an issue in the repository
© 2025 Synnot Studio — Licensed under the MIT License.
Made with ❤️ by Synnot Studio.
