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

  1. Open http://your-server-ip:9078 in your browser
  2. The dashboard shows configured sources (inputs) and clients (outputs)
  3. 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

SourceConfig TypeNotes
SpotifyOAuthRequires Spotify Developer app. Set redirect URI to http://your-ip:9078/callback
JellyfinAPI KeyGenerate in Jellyfin Dashboard → API Keys
PlexWebhookPlex Pass required. Set webhook URL to http://multi-scrobbler-ip:9078/plex
NavidromeSubsonic APIWorks with any Subsonic-compatible server
YouTube MusicOAuthRequires Google Cloud credentials
MopidyWebSocketConnect to Mopidy’s WebSocket endpoint
MPDTCPConnect to MPD’s control port (default 6600)
Last.fmAPIUseful for mirroring Last.fm scrobbles to other services
ListenBrainzAPIPulls listening data from ListenBrainz

Connecting Clients (Destinations)

ClientWhat It Does
Last.fmScrobbles tracks to your Last.fm profile
ListenBrainzScrobbles to the open-source ListenBrainz service
MalojaScrobbles to your self-hosted Maloja instance
Libre.fmOpen-source Last.fm alternative
DiscordShows “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.

Comments