JellyJams is a modern, standalone Docker container that automatically generates music playlists for your Jellyfin media server using the Jellyfin REST API. It features a beautiful dark-themed web UI for easy configuration and management.
JellyJams is currently inΒ alpha. It's working well for me, but as my first coding project, I'm sure there are improvements to be made! I'd love your feedback on:
- Installation experience
- Feature requests
- Performance with large libraries
- UI/UX suggestions
We changed how folders are bound into the container to simplify setup and improve compatibility.
- Update your
.envto use these variables:JELLYJAMS_DATA_DIR_HOST=/mnt/user/appdata/jelljamsPLAYLIST_DIR_HOST=/mnt/user/appdata/jellyfin/data/playlistsMUSIC_DIR_HOST=/path/to/your/music(e.g.,/mnt/user/media/data/music)MUSIC_DIR_CONTAINER=/path/to/your/music(must match the path that Jellyfin uses inside its container)
- The old
PLAYLIST_FOLDERenvironment variable is no longer used. Please remove it if present. - Most of the playlist settings have been moved to web UI only. Please reference
.env.example. - Compose volumes should look like this:
- Host app data β
/data - Jellyfin playlists β
/playlists - Music (read-only) β
${MUSIC_DIR_HOST}:${MUSIC_DIR_CONTAINER}:ro
- Host app data β
See SETTINGS.md β Docker Volume Configuration for full details and Unraid examples.
This project is evolving rapidly. Things may change significantly between releases. Always review the latest README.md and SETTINGS.md when upgrading to ensure your environment variables and volume mappings are correct.
Get JellyJams running in minutes with Docker:
Replace the placeholder paths with your real host directories:
docker run -d \
--name jellyjams \
-p 5000:5000 \
-e JELLYFIN_URL=http://jellyfin:8096 \
-e JELLYFIN_API_KEY=YOUR_API_KEY \
-v /path/to/appdata/jellyjams:/data \
-v /path/to/jellyfin/config/data/playlists:/playlists \
jonasmore/jellyjamsπ¦ Docker Hub: jonasmore/jellyjams
- Multiple Playlist Types - Genre, Year, Artist, and Personalized playlists
- Smart Genre Grouping - Groups similar genres into main categories to avoid overly specific playlists (e.g., "Alternative Rock", "Indie Rock", "Classic Rock" β "Rock Radio")
- Smart Naming - Clean playlist names ("Rock Radio", "Back to 1980", "This is Beatles!")
- Artist Diversity Control - Configurable minimum artist diversity for genre/year playlists
- Discovery Playlists - Personalized recommendations with diversity controls (max songs per album/artist)
- Jellyfin API Integration - Creates playlists directly via REST API with proper privacy controls
- User-Specific Playlists - Private playlists based on individual listening habits
- Multiple Playlist Types - Top Tracks, Discovery Mix, Recent Favorites, Genre Mix
- User Selection - Choose specific users or generate for all users
- Listening Analytics - Based on play counts, favorites, and recent activity
- Plugin Requirement - Requires Jellyfin Playback Reporting Plugin for listening statistics
- Multi-Tier Cover Art System - Comprehensive fallback system for all playlist types
- Custom Generated Covers - "This is [Artist]" text overlays on artist folder images
- Spotify Integration - Automatic artist playlist cover downloads from Spotify
- Predefined Custom Covers - Manual cover art for specific playlists
- Smart Fallbacks - Generic covers per playlist type ("Top Tracks - all.ext")
- Multi-format Support - Searches for images in multiple formats (JPG, JPEG, PNG, WebP, AVIF, BMP)
- Artist Folder Integration - Uses existing folder.ext from music directories
- Unicode Support - Handles special characters in artist names (altβJ, Sigur RΓ³s, etc.)
- Extension Preservation - Maintains original image format when copying.
- Generated Image Format - Saves generated images as WebP for high quality and compression.
- Beautiful Dark Theme - Modern, responsive design
- Real-time Dashboard - Connection status, playlist stats, and monitoring
- Advanced Settings - Comprehensive configuration with live validation
- User Management - Select users for personalized playlists
- Playlist Viewing - Browse playlist contents directly in the web UI
- Web UI Override - Settings page overrides environment variables
- Live Updates - Changes apply immediately without container restart
- Comprehensive Options - 25+ configurable settings
- Privacy Controls - Separate settings for public vs private playlists
- Scheduled Generation - Configurable automatic playlist updates (default: 24 hours)
- Media Library Scan - Automatic Jellyfin library refresh after playlist creation
- Docker Ready - Easy deployment with Docker Compose
- Unraid Support - Dedicated docker-compose configuration
- Comprehensive Logging - Detailed operation tracking and debugging
- Discord Notifications - Optional Discord webhook notifications for playlist updates and cover art changes
JellyJams includes optional basic authentication to protect the web interface:
- Default: Disabled for easy setup
- Configuration: Via environment variables only
WEBUI_BASIC_AUTH_ENABLED=true
WEBUI_BASIC_AUTH_USERNAME=your_username
WEBUI_BASIC_AUTH_PASSWORD=your_password- Multi-Tier Cover Art System - Comprehensive fallback system for all playlist types
- Custom Generated Covers - "This is [Artist]" text overlays on artist folder images
- Spotify Integration - Automatic artist playlist cover downloads from Spotify
- Predefined Custom Covers - Manual cover art for specific playlists
- Smart Fallbacks - Generic covers per playlist type ("Top Tracks - all.ext")
- Multi-format Support - Searches for images in multiple formats (JPG, JPEG, PNG, WebP, AVIF, BMP)
- Artist Folder Integration - Uses existing folder.ext from music directories
- Unicode Support - Handles special characters in artist names (altβJ, Sigur RΓ³s, etc.)
- Extension Preservation - Maintains original image format when copying.
- Generated Image Format - Saves generated images as WebP for high quality and compression.
- Custom Generated Covers (Artist playlists)
- Spotify Cover Art (Artist playlists, if enabled)
- Predefined Custom Covers (Manual covers)
- Artist Folder Fallback (Uses existing folder.ext)
- Generic Fallbacks (Type-specific defaults)
For artist playlists, JellyJams automatically generates professional "This is [Artist]" covers:
- Uses artist's existing folder.ext as background
- Adds stylized text overlay with adaptive colors
- Handles Unicode characters (altβJ, Sigur RΓ³s, MΓΆtley CrΓΌe)
- High-quality PNG output with text shadows
- Automatic brightness analysis for optimal text contrast
Place custom images in your cover directory (stored at /data/cover):
- Exact playlist name matching:
"Top Tracks - Jonas.ext" - Generic fallbacks:
"Top Tracks - all.ext" - Decade-specific covers:
"Back to the 1990s.ext" - Genre-specific covers:
"Jazz Radio.ext"
JellyJams can use existing cover art from your music library:
- Searches for
folder.ext,cover.ext,artist.extin artist directories - You set the music directory path (in .env) to the same path you set in Jellyfin
- Case-insensitive artist folder matching
- Multiple image format support (JPG, PNG, WebP, AVIF, BMP)
Refresh cover art for existing playlists without regenerating:
- Web UI Button: "Update Covers" on playlists page
- Multi-tier Processing: Tries all cover art sources in priority order
- Progress Tracking: Real-time feedback with statistics
- Selective Updates: Focuses on artist playlists for efficiency
- Error Handling: Graceful fallbacks with detailed logging
Fine-tune discovery playlists for better variety:
- Max songs per album (default: 1)
- Max songs per artist (default: 2)
- Configurable via web UI settings
JellyJams automatically triggers a Jellyfin media library scan after playlist creation to ensure playlists appear immediately in your Jellyfin interface. This can be disabled in .env.
JellyJams creates playlists in the following format:
π/playlists/
βββ πRock Radio/
β βββ playlist.xml
βββ πJazz Radio/
β βββ playlist.xml
βββ πBack to the 1970s/
β βββ playlist.xml
βββ πThis is The Beatles!/
βββ playlist.xml
Playlists are saved in Jellyfin-compatible XML format:
<?xml version="1.0" encoding="utf-8"?>
<playlist xmlns="http://xspf.org/ns/0/">
<title>JellyJams Genre: Rock</title>
<trackList>
<track>
<location>file:///path/to/song.mp3</location>
<title>Song Title</title>
<creator>Artist Name</creator>
<album>Album Name</album>
</track>
</trackList>
</playlist>- Use the included docker-compose.yml
- Copy .env.example. to .env
- Enter your settings in your .env file
For Unraid users, bind app data to /mnt/user/appdata/jellyjams/ for persistent storage. If you are using the included docker-compose.yml, set these values in your .env file.
JELLYJAMS_DATA_DIR_HOST=/mnt/user/appdata/jellyjams
PLAYLIST_DIR_HOST=/mnt/user/appdata/jellyfin/data/playlists
MUSIC_DIR_HOST=/mnt/user/media/data/music
MUSIC_DIR_CONTAINER=/mnt/user/media/data/musicJellyJams uses the Jellyfin REST API to:
- Fetch music library metadata
- Parse genres, artists, and years
- Handle semicolon-separated genre strings
- Test connection status
- Retrieve audio item details
- Retrieve the primary image of artists
- Jellyfin connection status indicator
- Playlist generation statistics
- Quick action buttons
- Real-time status updates
- Jellyfin server configuration
- Playlist generation options
- Genre exclusion management
- Scheduling configuration
- View all generated playlists
- Filter and search playlists
- Delete unwanted playlists
- Preview playlist contents
- Real-time log viewing
- Log filtering and search
- Download log files
- Auto-refresh capability
jellyjams/
βββ .env.example # Environment template
βββ Dockerfile # Container definition
βββ docker-compose.yml # Docker Compose config
βββ app/ # Container app files
βββ entrypoint.sh # App entrypoint
βββ start.sh # App startup script
βββ requirements.txt # Python dependencies
βββ vibecodeplugin.py # Main playlist generator
βββ webapp.py # Flask web UI
βββ cover # Customizable playlist images
βββ Playlist Name.jpg
βββ static/ # WebUI resources
βββ templates/ # HTML templates
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Jellyfin - Amazing open-source media server
- Bootstrap - UI framework
- Font Awesome - Icons
- Inter Font - Typography
- Unsplash - Cover Images
- π Issues: GitHub Issues
- π¬ Discussions: GitHub Discussions
- ποΈ Forum Post: Jellyfin Forum

