AI-powered music recommendation system for Plex using semantic search with CLAP embeddings that understands both natural language and sonic characteristics.
Mycelium connects to your Plex media server and uses AI to understand your music collection. Search using natural language ("melancholic indie rock") or upload audio files to find similar tracks. Uses CLAP (Contrastive Language-Audio Pre-training) to analyze both text and audio features.
- Scan - Connects to Plex and extracts music metadata
- Process - Generates AI embeddings using CLAP model
- Search - Find music using natural language or audio similarity
- Recommend - Get AI-powered recommendations based on sonic qualities
Tech Stack: Python (FastAPI) + Next.js + ChromaDB vector database
π Smart Search
- Text search: "upbeat 80s synthpop", "melancholic indie rock", "fast drumbeat"
- Audio search: Upload files to find similar tracks
- AI-powered recommendations
π Performance
- Distributed GPU processing for large libraries
- Resumable embedding generation
- Real-time progress tracking
βοΈ Integration
- Seamless Plex integration
- Modern web interface (Next.js + TypeScript)
- Web-based configuration
Search your library using natural language descriptions to find the perfect match for your mood.

Upload any audio file to find tracks in your library with similar sonic characteristics.

Manage your collection and discover hidden gems through AI-powered recommendations.

- Python 3.9+ and Node.js 18+
- Plex Media Server with music library
- GPU recommended for faster processing
# Install from PyPI
pip install mycelium-aiOr install from source:
# Clone and install
git clone https://github.com/marceljungle/mycelium.git
cd mycelium
pip install -e .
# Install frontend dependencies
cd frontend && npm install# Start server (web interface will open at http://localhost:8000)
mycelium-ai server
# For distributed processing with GPU workers (optional)
mycelium-ai client --server-host 192.168.1.100# Start the server
mycelium-ai server
# Open http://localhost:8000 and:
# 1. Configure Plex connection in Settings
# 2. Scan your Plex library
# 3. Generate AI embeddings
# 4. Search and explore your musicmycelium-ai server # Start server (API + Frontend)
mycelium-ai client --server-host HOST # Start GPU worker client- Search: Natural language search ("upbeat indie rock", "slow tempo with piano") or upload audio files
- Library: Browse tracks, scan Plex library, and process embeddings
- Settings: Configure Plex connection, API settings, and processing options via web interface
All configuration is done through the web interface at http://localhost:8000.
For large libraries, use GPU workers for faster processing:
# On main server
mycelium-ai server
# On GPU machine(s)
mycelium-ai client --server-host YOUR_SERVER_IP# Install backend with development dependencies
pip install -e ".[dev]"
# Install frontend dependencies
cd frontend && npm install# Full build: OpenAPI clients + both frontends
./build.sh
# Build with Python package
./build.sh --with-wheel
# Skip certain stages
./build.sh --skip-openapi
./build.sh --skip-frontends# Python
black src/ && isort src/ && mypy src/
# Frontend
cd frontend && npm run lint && npm run buildmycelium/
βββ src/mycelium/ # Python backend (FastAPI + clean architecture)
β βββ domain/ # Core business logic
β βββ application/ # Use cases and services
β βββ infrastructure/ # External adapters (Plex, CLAP, ChromaDB)
β βββ api/ # FastAPI endpoints
β βββ main.py # CLI entry point
βββ frontend/ # Next.js frontend (TypeScript + Tailwind)
β βββ src/components/ # React components
βββ config.example.yml # Configuration template
- Large libraries: Use GPU workers (
mycelium-ai client) for faster processing - Plex token: Get from Plex settings β Network β "Show Advanced"
- Resume processing: Embedding generation can be stopped and resumed anytime
- Configuration: All settings can be configured via the web interface at
/settings
Contributions welcome! Ensure changes follow existing patterns, include TypeScript types, and use the logging system.
MIT License - see LICENSE file.