Self-Hosting multi-scrobbler with Docker
What Is multi-scrobbler?
multi-scrobbler is a self-hosted scrobble aggregator that listens to 25+ music sources (Spotify, Jellyfin, Plex, Navidrome, YouTube Music, and more) and forwards your listening history to multiple scrobbling services simultaneously — Last.fm, ListenBrainz, Maloja, and others. It replaces the need to configure individual scrobbling plugins in every player you use, giving you a single point of control for all your listening data.
Prerequisites
- A Linux server (Ubuntu 22.04+ recommended)
- Docker and Docker Compose installed (guide)
- 256 MB of free RAM
- API credentials for at least one music source and one scrobbling destination
- A domain name (optional, for remote access and OAuth callbacks)
Docker Compose Configuration
Create a docker-compose.yml file:
services:
multi-scrobbler:
image: foxxmd/multi-scrobbler:0.11.5
container_name: multi-scrobbler
volumes:
- ms-config:/config
ports:
- "9078:9078" # Web dashboard and API
environment:
- TZ=Etc/UTC # Your timezone
- PUID=1000 # Match your host user ID
- PGID=1000 # Match your host group ID
#- BASE_URL=http://your-ip:9078 # Set if accessing from a different machine
restart: unless-stopped
volumes:
ms-config:
Start the stack:
docker compose up -d
Initial Setup
- Open
http://your-server-ip:9078in your browser - The dashboard shows configured sources (inputs) and clients (outputs)
- On first run, no sources or clients are configured — you need to add them via configuration files
Configuration Methods
multi-scrobbler supports three configuration approaches:
1. Individual JSON files in the /config directory (recommended):
Create config/spotify.json:
{
"sources": [
{
"type": "spotify",
"name": "My Spotify",
"clientId": "YOUR_SPOTIFY_CLIENT_ID",
"clientSecret": "YOUR_SPOTIFY_CLIENT_SECRET",
"redirectUri": "http://your-server-ip:9078/callback"
}
]
}
Create config/lastfm.json:
{
"clients": [
{
"type": "lastfm",
"name": "My Last.fm",
"apiKey": "YOUR_LASTFM_API_KEY",
"secret": "YOUR_LASTFM_SECRET"
}
]
}
2. Single config.json file with all sources and clients.
3. Environment variables for simple setups:
environment:
- JELLYFIN_URL=http://jellyfin:8096
- JELLYFIN_APIKEY=your-jellyfin-api-key
- JELLYFIN_USER=your-username
- MALOJA_URL=http://maloja:42010
- MALOJA_API_KEY=your-maloja-api-key
Configuration
Connecting Sources
| Source | Config Type | Notes |
|---|---|---|
| Spotify | OAuth | Requires Spotify Developer app. Set redirect URI to http://your-ip:9078/callback |
| Jellyfin | API Key | Generate in Jellyfin Dashboard → API Keys |
| Plex | Webhook | Plex Pass required. Set webhook URL to http://multi-scrobbler-ip:9078/plex |
| Navidrome | Subsonic API | Works with any Subsonic-compatible server |
| YouTube Music | OAuth | Requires Google Cloud credentials |
| Mopidy | WebSocket | Connect to Mopidy’s WebSocket endpoint |
| MPD | TCP | Connect to MPD’s control port (default 6600) |
| Last.fm | API | Useful for mirroring Last.fm scrobbles to other services |
| ListenBrainz | API | Pulls listening data from ListenBrainz |
Connecting Clients (Destinations)
| Client | What It Does |
|---|---|
| Last.fm | Scrobbles tracks to your Last.fm profile |
| ListenBrainz | Scrobbles to the open-source ListenBrainz service |
| Maloja | Scrobbles to your self-hosted Maloja instance |
| Libre.fm | Open-source Last.fm alternative |
| Discord | Shows “Now Playing” status in Discord |
Jellyfin + Maloja Example
A common self-hosted setup — scrobble everything played in Jellyfin to your own Maloja instance:
services:
multi-scrobbler:
image: foxxmd/multi-scrobbler:0.11.5
container_name: multi-scrobbler
volumes:
- ms-config:/config
ports:
- "9078:9078"
environment:
- TZ=Etc/UTC
- PUID=1000
- PGID=1000
- JELLYFIN_URL=http://jellyfin:8096
- JELLYFIN_APIKEY=your-jellyfin-api-key
- JELLYFIN_USER=your-username
- MALOJA_URL=http://maloja:42010
- MALOJA_API_KEY=your-maloja-api-key
restart: unless-stopped
volumes:
ms-config:
Advanced Configuration (Optional)
Metadata Caching with Valkey/Redis
For high-volume setups, cache API metadata responses with Valkey:
services:
multi-scrobbler:
image: foxxmd/multi-scrobbler:0.11.5
container_name: multi-scrobbler
volumes:
- ms-config:/config
ports:
- "9078:9078"
environment:
- TZ=Etc/UTC
- PUID=1000
- PGID=1000
- CACHE_METADATA=valkey
- CACHE_METADATA_CONN=redis://valkey:6379
restart: unless-stopped
depends_on:
- valkey
valkey:
image: valkey/valkey:8.1
container_name: ms-valkey
volumes:
- valkey-data:/data
restart: unless-stopped
volumes:
ms-config:
valkey-data:
Prometheus Monitoring
multi-scrobbler exposes Prometheus metrics at /api/metrics. Add it to your Prometheus scrape config:
scrape_configs:
- job_name: multi-scrobbler
static_configs:
- targets: ['multi-scrobbler:9078']
metrics_path: /api/metrics
Reverse Proxy
If you need OAuth callbacks (Spotify, YouTube Music) from outside your network, expose multi-scrobbler through a reverse proxy and set BASE_URL to the public URL. See Reverse Proxy Setup.
Backup
Back up the ms-config volume — it contains your source/client configuration files and cached authentication tokens. Losing this volume means re-authenticating all OAuth sources.
See Backup Strategy.
Troubleshooting
Spotify Source Shows “Not Authenticated”
Symptom: Spotify source appears in the dashboard but shows as unauthenticated.
Fix: Ensure redirectUri in your config matches exactly what you set in the Spotify Developer Dashboard. Visit the multi-scrobbler dashboard and click the Spotify authentication link. The redirect must reach multi-scrobbler — if behind a reverse proxy, set BASE_URL accordingly.
Scrobbles Not Appearing on Last.fm
Symptom: multi-scrobbler shows tracks from sources but Last.fm profile doesn’t update. Fix: Check the dashboard for client errors. Verify your Last.fm API key and secret are correct. Last.fm requires tracks to be played for at least 50% of their duration or 4 minutes (whichever is less) before scrobbling.
Duplicate Scrobbles
Symptom: Same track appears multiple times on your scrobbling service. Fix: Check if you have multiple sources pointing to the same player. For example, if Jellyfin has its own Last.fm plugin enabled AND multi-scrobbler is also scrobbling from Jellyfin to Last.fm, you’ll get duplicates. Disable the in-app scrobbling plugin and let multi-scrobbler handle it centrally.
Resource Requirements
- RAM: ~150 MB idle, increases slightly with more active sources
- CPU: Minimal — mostly waiting for events from sources
- Disk: ~50 MB for application, plus cached data
Verdict
multi-scrobbler is the best tool for consolidating scrobbles across multiple music sources. If you listen on Spotify during the day, Jellyfin at home, and Navidrome on mobile, multi-scrobbler ensures every play reaches all your scrobbling services without configuring plugins in each player individually. Pair it with Maloja for a fully self-hosted listening analytics stack. If you only use one music source and one scrobbling destination, the built-in scrobbling plugins in Navidrome or Jellyfin are simpler.
FAQ
What is scrobbling?
Scrobbling is tracking what music you listen to. Services like Last.fm record every song you play, building a listening history with statistics. multi-scrobbler automates this by pulling play data from your music sources and forwarding it to scrobbling services.
Do I need Spotify Premium for Spotify scrobbling?
No. The free tier of Spotify works with multi-scrobbler’s Web API polling. However, you do need to create a Spotify Developer app for API access (free). Set the redirect URI in the app settings to match your multi-scrobbler instance.
Can I use multi-scrobbler with Plex?
Yes, but Plex Pass is required for webhook support. Configure a webhook in Plex pointing to http://multi-scrobbler-ip:9078/plex. Without Plex Pass, Plex doesn’t support webhooks and multi-scrobbler can’t receive play events.
What’s the difference between multi-scrobbler and built-in scrobbling plugins?
Built-in plugins (like Jellyfin’s Scrobbler) connect one source to one destination. multi-scrobbler aggregates all sources into all destinations from a single service. If you use multiple players, multi-scrobbler prevents duplicate setup and ensures consistent scrobbling across everything.
Does multi-scrobbler deduplicate scrobbles?
Yes. If you have a Jellyfin scrobbling plugin enabled AND multi-scrobbler also scrobbling from Jellyfin, you’ll get duplicates on the destination service. Disable in-app plugins and let multi-scrobbler handle all scrobbling centrally.
Can I self-host everything in the scrobbling chain?
Yes. Use Navidrome or Jellyfin as your music source, multi-scrobbler as the aggregator, and Maloja as a self-hosted Last.fm replacement. No cloud services needed in the entire chain.
Related
- Self-Hosting Maloja with Docker Compose
- Self-Hosting Navidrome with Docker Compose
- Self-Hosting Jellyfin with Docker Compose
- Self-Hosting gonic with Docker Compose
- Best Self-Hosted Music Streaming Apps
- Self-Hosted Alternatives to Last.fm
- Self-Hosted Alternatives to Spotify
- Docker Compose Basics
- Reverse Proxy Setup
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments