emby-watchparty
A synchronized watch party application for Emby media servers. Watch videos together with friends in real-time, no matt…
Industrial grade self-hosted streaming music server.
A music system designed to manage and stream music libraries with tens of millions of songs
🌐 Try Demo • Features • Quick Start • Documentation • Contributing • Support
Melodee is a self-hosted music management and streaming system designed for very large libraries. It ingests and normalizes audio through an inbound → staging → storage pipeline, then serves a curated library via a Blazor web UI plus OpenSubsonic, Jellyfin, and native REST APIs. Built on .NET 10 with PostgreSQL and first-class container support, it's a great fit for homelabs (from Raspberry Pi-class hardware to full servers).
docker pull ghcr.io/melodee-project/melodee:latestExperience Melodee before installing! Our official demo server is available at:
demo / Password Mel0deeR0cks!/scalar/v1Note: The demo server is for testing only. For production use, please install Melodee on your own infrastructure.
Melodee features a fully automated music ingestion pipeline. Simply drop your music files into the inbound folder and they'll be processed, validated, and made available for streaming—typically within 15-20 minutes.
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ INBOUND │ │ STAGING │ │ STORAGE │ │ DATABASE │
│ (Drop zone) │────▶│ (Review) │────▶│ (Published) │────▶│ (Playable) │
│ │ │ │ │ │ │ │
│ Drop files │ │ Validated & │ │ Final home │ │ Indexed & │
│ here │ │ ready albums │ │ for music │ │ streamable │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │ │
▼ ▼ ▼ ▼
LibraryInbound StagingAuto LibraryInsert API Clients
ProcessJob MoveJob Job can stream
(every 10 min) (every 15 min) (chains auto)
| Step | What Happens | Automatic? |
|---|---|---|
| 1. Drop | Place music files (MP3, FLAC, etc.) in the inbound folder | You do this |
| 2. Process | Files are scanned, metadata extracted, validated, and moved to staging | ✅ Automatic |
| 3. Review | Albums marked "Ok" are automatically promoted; others await manual review | ✅ Automatic for valid albums |
| 4. Move | Validated albums move from staging to storage library | ✅ Automatic |
| 5. Index | Albums in storage are indexed into the database | ✅ Automatic |
| 6. Stream | Music is available via OpenSubsonic API and web player | Ready to play! |
Automatic Mode (Default): Jobs chain together—when one completes successfully, it triggers the next. Well-tagged music flows from inbound to playable without intervention.
Manual Mode: Trigger jobs individually from the admin UI for troubleshooting or when you want to review albums before promotion. Manual triggers don't chain, giving you full control.
Albums that don't pass validation (missing tags, artwork issues, etc.) stay in staging for manual review. You can:
Before installing, test drive Melodee on our demo server:
👉 https://demo.melodee.org (Username: demo, Password: Mel0deeR0cks!)
git clone https://github.com/melodee-project/melodee.git cd melodee python3 scripts/run-container-setup.py --start
The script handles preflight checks, runtime detection, secure configuration, building, and startup.
Melodee publishes pre-built, multi-arch images (linux/amd64, linux/arm64) to GitHub Container Registry on every release. No build step required:
# Pull the latest pre-built image docker pull ghcr.io/melodee-project/melodee:latest # Or pin to a specific version docker pull ghcr.io/melodee-project/melodee:2.0.1
To use pre-built images with compose, set the MELODEE_IMAGE environment variable before running compose up:
export MELODEE_IMAGE=ghcr.io/melodee-project/melodee:latest docker compose up -d
📖 Full installation guide: melodee.org/installing
cd melodee git pull python3 scripts/run-container-setup.py --update
Your data (database, music library, playlists) is preserved during updates. Database migrations run automatically.
📖 Full upgrade guide: melodee.org/upgrade
Melodee is designed to run in homelab environments with support for various hardware configurations:
📖 Deployment guides: melodee.org/installing | melodee.org/upgrade
Melodee uses several persistent volumes for data storage:
| Volume | Purpose | Description |
|---|---|---|
melodee_data_protection_keys |
Security | ASP.NET Core data protection keys |
melodee_db_data |
Database | PostgreSQL data |
melodee_inbound |
Incoming Media | New media files to be processed |
melodee_logs |
Logs | Application log files |
melodee_playlists |
Playlists | Admin-defined (JSON-based) dynamic playlists |
melodee_podcasts |
Podcasts | Downloaded podcast episodes |
melodee_staging |
Staging Area | Media ready for manual review |
melodee_storage |
Music Library | Processed and organized music files |
melodee_templates |
Templates | Email and notification templates |
melodee_themes |
Themes | Custom theme packs |
melodee_user_images |
User Content | User-uploaded avatars |
To backup your data:
# Backup volumes podman volume export melodee_storage > melodee_storage_backup.tar podman volume export melodee_db_data > melodee_db_backup.tar # Restore volumes podman volume import melodee_storage melodee_storage_backup.tar podman volume import melodee_db_data melodee_db_backup.tar
New installations are guided through an 8-step setup wizard that ensures your server is properly configured:
| Step | Description |
|---|---|
| 1. Welcome | Introduction and overview of the setup process |
| 2. Paths | Configure library paths (inbound, staging, storage, etc.) |
| 3. Database | Verify database connectivity and run migrations |
| 4. Search Engines | Set up MusicBrainz and artist search databases |
| 5. Settings | Configure essential server settings |
| 6. Admin Account | Create or verify the administrator account |
| 7. Pre-flight Checks | Run system diagnostics and verify configuration |
| 8. Verify & Complete | Final verification and setup completion |
The wizard automatically detects existing configurations and can be re-run from /onboarding if needed. Once setup is complete, the system.onboardingCompletedAt setting is updated and the wizard is bypassed for subsequent logins.
Inbound Processing
Staging Management
Production Libraries
Melodee includes a comprehensive job scheduling system powered by Quartz.NET:
| Job | Purpose | Default Schedule |
|---|---|---|
| ArtistHousekeepingJob | Cleans up artist data and relationships | Daily at midnight |
| ArtistSearchEngineHousekeepingJob | Updates artist search index | Daily at midnight |
| ChartUpdateJob | Links chart entries to albums | Daily at 2 AM |
| LibraryInboundProcessJob | Scans inbound, processes files to staging | Every 10 minutes |
| LibraryInsertJob | Indexes storage albums into database | Daily at midnight (+ chained) |
| MusicBrainzUpdateDatabaseJob | Updates local MusicBrainz cache | Monthly |
| NowPlayingCleanupJob | Cleans stale now-playing entries | Every 5 minutes |
| PodcastCleanupJob | Enforces retention policies on downloaded episodes | Daily at 3 AM |
| PodcastDownloadJob | Downloads queued podcast episodes | Every 5 minutes |
| PodcastRecoveryJob | Resets stuck downloads and cleans orphaned files | Every hour |
| PodcastRefreshJob | Fetches new episodes from subscribed podcasts | Every 30 minutes |
| StagingAutoMoveJob | Moves "Ok" albums from staging to storage | Every 15 minutes (+ chained) |
Jobs can be manually triggered, paused, or monitored from the admin UI at /admin/jobs.
MQL is a powerful query language for advanced music library searches. Access it via the Advanced button in the Search page.
Syntax highlights:
artist:"Pink Floyd" album:"The Wall"year:>=2000 rating:>3 duration:<300added:last-week lastPlayedAt:-30d(rock OR metal) AND NOT livetitle:/.*remix.*/iExample queries:
# Find highly-rated jazz you haven't heard recently
genre:Jazz rating:>=4 lastPlayedAt:<-90d
# Pink Floyd albums from the 70s
artist:"Pink Floyd" year:1970-1979
# Recently added music you haven't played yet
added:-7d plays:0
See the full MQL Documentation for complete field reference and examples.
Melodee features comprehensive localization with support for 10 languages:
| Language | Code | Status | RTL |
|---|---|---|---|
| English (US) | en-US | ✅ 100% | - |
| Arabic | ar-SA | 🔄 94% | ✅ |
| Chinese (Simplified) | zh-CN | 🔄 94% | - |
| French | fr-FR | 🔄 94% | - |
| German | de-DE | 🔄 94% | - |
| Italian | it-IT | 🔄 34% | - |
| Japanese | ja-JP | 🔄 94% | - |
| Portuguese (Brazil) | pt-BR | 🔄 94% | - |
| Russian | ru-RU | 🔄 94% | - |
| Spanish | es-ES | 🔄 94% | - |
We welcome translation contributions from the community! Strings marked with [NEEDS TRANSLATION] in the resource files need native speaker review.
How to contribute translations:
src/Melodee.Blazor/Resources/SharedResources.<code>.resx[NEEDS TRANSLATION] entriesResource files are standard .NET .resx XML format. You can edit them with any text editor or Visual Studio's resource editor.
Current translation needs: Italian needs the most work (~1,321 strings). Other languages need ~105 strings each (out of 2,025 total). See Contributing Guide for details.
Full compatibility with Subsonic 1.16.1 and OpenSubsonic specifications:
See the OpenSubsonic Compatibility Matrix for detailed endpoint support, client compatibility, and known limitations.
Melodee provides a Jellyfin-compatible API that allows popular Jellyfin music clients to connect:
Add custom Markdown content to pages for branding, announcements, or policies:
.md files in ${MELODEE_DATA_DIR}/custom-blocks/{page}/{slot}.md and they appear instantlyPerfect for terms of service links, support contact information, or custom branding messages.
Melodee supports multiple authentication methods:
All API endpoints (except public endpoints) require a Bearer token:
curl -H "Authorization: Bearer <JWT_TOKEN>" https://your-server/api/v1/albums
Melodee implements secure token rotation:
To enable Google Sign-In, configure the following in appsettings.json:
{
"Auth": {
"Google": {
"Enabled": true,
"ClientId": "your-google-client-id.apps.googleusercontent.com",
"AllowedHostedDomains": [],
"AutoLinkEnabled": false
},
"SelfRegistrationEnabled": true
}
}
For API documentation including authentication endpoints, access /scalar/v1 on a running instance. Download the OpenAPI specification at /openapi/v1.json. For OpenSubsonic API, refer to the OpenSubsonic specification.
| Component | Description | Technology |
|---|---|---|
| Melodee.Blazor | Web UI and OpenSubsonic API server | Blazor Server, Radzen UI |
| Melodee.Cli | Command-line interface | .NET Console App |
| Melodee.Common | Shared libraries and services | .NET Class Library |
We welcome contributions! Please see our Contributing Guide for details.
Clone the repository
git clone https://github.com/melodee-project/melodee.git cd melodee
Install .NET 10 SDK
# Follow instructions at https://dotnet.microsoft.com/download
Run locally
dotnet run --project src/Melodee.Blazor
This project adheres to the Contributor Covenant Code of Conduct.
This project is licensed under the MIT License - see the LICENSE file for details.
For comprehensive documentation, including installation guides, configuration options, homelab deployment strategies, and API references, visit https://www.melodee.org.
more like this
A synchronized watch party application for Emby media servers. Watch videos together with friends in real-time, no matt…
YiMao · 云海求片助手 — 双核心 Telegram 影视求片机器人。订阅模式:TMDB 智能搜索一键订阅 / 趣味求片模式:AI 生成五层地狱闯关,通关解锁优先求片。深度集成 MoviePilot + Emby/Jellyfin。…
search projects, people, and tags