Skip to content

multi-scrobbler

Media Servers

A Docker‑based, open‑source music scrobbler that aggregates listening activity from many sources and forwards it to multiple clients.

TypeScript Latest 0.14.2 · 18d ago Security brief →

Features

  • Supports dozens of source integrations (Apple Music, Spotify, Deezer, VLC, etc.)
  • Scrobble to many client services (Last.fm, Discord, Libre.fm, etc.)
  • Platform‑independent operation via Docker or local Node.js installation

Recent releases

View all 16 releases →
0.14.2 Breaking risk
⚠ Upgrade required
  • Read the Upgrade Path docs (https://docs.multi-scrobbler.app/updating/upgrade-path/0140/) before upgrading from any version earlier than 0.14.0.
  • Review the 0.14.0 Release Notes for detailed migration steps.
Breaking changes
  • Multi-Scrobbler 0.14.0 introduces breaking changes; consult the Upgrade Path documentation before upgrading.
Notable features
  • Historical scrobble matching for teal.fm and Rocksky now supports arbitrary time ranges via a synced database copy.
  • A fully rewritten UI preview is available at /next with mobile-first design, live updates, search/filter, and end‑to‑end scrobble timeline.
Full changelog

[!IMPORTANT]
Release 0.14.0 contains breaking changes. Read the Upgrade Path docs and 0.14.0 Release Notes before upgrading from Multi-Scrobbler earlier than 0.14.0!

What's New?

Historical Scrobble Matching for teal.fm/Rocksky

Multi-Scrobbler checks your scrobble clients to see if an incoming Play was already scrobbled. This process was previously overhauled in v0.12.0 to make it work for any arbitrary time range, but this overhaul did not include teal.fm and Rocksky due to limitations in how querying atproto records works.

In v0.14.2 this has been resolved so that these clients have the same arbitrary timerange functionality matching as all other clients. This is achieved by initially downloading a full copy of your record and converting them into MS scrobbles to store in the new database. Then, the copy is kept in sync with real time queries to the atproto api. MS then queries this copy when matching scrobbles.

New UI Preview

The UI for MS has been fully rewritten and a preview is now available alongside the normal UI. Some highlights:

  • mobile-first design
  • live, visual updates for all activity
  • search and filter all of your scrobbles
  • scrobble timeline shows how MS processed your scrobble data from end-to-end

It can be used by navigating to

http(s)://yourMsDomain/next

I need your feedback on bugs, opinions on design choices, and general usage impressions! Refer to the github issue for the preview ui for more details and to provide feedback.


Some screenshots from the preview ui:

Left: Source/Client list (main page) | Right: Source detail page with Plays

 

Left: Scrobble duplicate check results | Right: musicbrainz transformer "no results" with used queries

visual indicator of live activity (just scrobbled) on main page

0.14.1 Breaking risk
⚠ Upgrade required
  • Read the Upgrade Path docs (https://docs.multi-scrobbler.app/updating/upgrade-path/0140/) before upgrading from versions earlier than 0.14.0.
  • Review the 0.14.0 Release Notes (https://github.com/FoxxMD/multi-scrobbler/releases/tag/0.14.0) for detailed migration steps.
Breaking changes
  • Upgrade to version 0.14.0 requires reading the Upgrade Path documentation due to breaking changes.
Full changelog

[!IMPORTANT]
Release 0.14.0 contains breaking changes. Read the Upgrade Path docs and 0.14.0 Release Notes before upgrading from Multi-Scrobbler earlier than 0.14.0!

Full Changelog

🐛 Bug Fixes

  • (ui) Update JSX namespace to fix missing ambient in react 19
  • (No Category) Fix argument order for logger labels
  • (No Category) Add missing artist credit transforms causing Navidrome Source plays to create errors #613

⚙️ Miscellaneous Tasks

  • (No Category) Re-generate lock file
0.14.0 Breaking risk
⚠ Upgrade required
  • Add IDs to Sources/Clients as required by the new configuration schema.
  • Review cache settings before upgrading; migration guide provided in docs.
  • Automatic database backup and migration will run on upgrade; ensure sufficient disk space for the backup.
Breaking changes
  • Cache configuration simplified; existing cache settings must be reviewed and updated per the upgrade guide.
Notable features
  • Database structures for historical plays implemented (SQLite/Drizzle).
  • TealFM now playing support via `fm.teal.alpha.actor.status`.
  • LastFM bypasses scrobble rejection for tracks under 30 seconds.
Full changelog

[!IMPORTANT]
This release contains breaking changes. Read the Upgrade Path docs before upgrading. The migration should be simple for the majority of users.

Summary:

  • You should add ids to your Sources/Clients
  • If you have queued scrobbled these will be automatically migrated
  • If you have any Cache settings you will need to review the guide before upgrading

What's New?

I am excited to release Multi-Scrobbler 0.14.0 :tada: This is one of the largest releases for MS in years which significantly rewrites large portions of MS's architecture to allow it to scale in preparation for even more exciting, near-future functionality like the upcoming ui overhaul and eventual bulk scrobble transfer feature (move all your scrobbles from Client X to Client Y).

Stats for this release:

  • 158 commits
  • 243 files touched
    • +15,400 additions
    • -4,200 deletions
  • No AI was used during development. This is organic, free-range coding.

I want to acknowledge and say a big thank you to all the users who helped test and give feedback during this release process. Your input, patience, and reporting was invaluable :heart: :

@4rft5 @FestiveByteRider @gabeklavans @psyciknz @DigitalStarSys @owendaprile @timmyhbk @Sioeen @Ectalite @HStep20

Backend Overhaul

This release introduces a huge architectural upgrade for the backend: almost all data is now backed by a sqlite database powered by drizzle.

Some visible change highlights:

  • Discovered plays (from sources) are persisted
    • Backlogged, already discovered plays are not re-sent to clients on each startup (they are found in database and ignored)
  • Scrobbled plays (successfully sent by clients) are persisted
    • Reduces dupe scrobbles since identical scrobble data in MS can now be compared across restarts
  • Database migrations are automatic and also automatically make a backup of your database before upgrading
  • All queues and Plays are now managed in database instead of in-memory
    • Reduced memory usage in all usecases
    • Drastically reduced memory when there are many sources/client (5+) or many queued scrobbles (100+)
  • Source and Client statistics are persisted
  • (breaking) Simplified cache configuration to leverage database where feasible

To prepare for database usage in 0.14.0, please read the Upgrade Path docs.

The migration should be simple for the majority of users. For edge cases and power users, the docs cover how to migrate more advanced settings.

Documentation Improvements

The introduction of the database forced a good look at, and cleanup of, the existing docs. Application-wide config should now be easier to read and the kitchensink examples are now more straight-forward and relevant to common usecases.

Other Changes (Changelog Highlight)

⛰️ Features

  • (database) Implement database structures needed for historical plays
  • (database) Track component last ready and last active at
  • (tealfm) Add now playing support with fm.teal.alpha.actor.status by @HiiJax :tada:
  • (tealfm) Update lexicon defs with new mbid uri format teal-fm/teal#102
  • (now playing) More robust handling of clients with real time status updates (teal, discord) #608
  • (now playing) reduced logging noise
  • (lastfm) bypass scrobble rejection for very short tracks (< 30 seconds) by omitting duration #596
  • (No Category) refactor artists to directly map/associate MBIDs

⚙️ Miscellaneous Tasks

  • (No Category) update all dependencies #594 by @philocalyst :tada:

📚 Documentation

  • (lastfm) Document 2 week scrobble window
  • (No Category) Overhaul kitchensink
  • (No Category) Add _ID and _NAME examples to all instances of ENV configs
  • (No Category) Add id to all instances of file/aio configs
  • (No Category) Add more descriptive error logging for example config file parsing
0.13.3 Bug fix

Fixed cache usage causing older plays to be returned and corrected Spotify state staleness.

Full changelog

What's Changed

🐛 Bug Fixes

  • (transform) Fix bad usage of cache potentially causing older-timestamped plays to be returned when newer play data was identical
  • (spotify) Don't use platform creation timestamp as stateLastUpdatedAt, fixes spotify player accidentally going stale while still active

⚙️ Miscellaneous Tasks

  • (lastfm) Increase connection test timeout for slow networks and add DNS resolution logging
0.13.2 Breaking risk
⚠ Upgrade required
  • Override `rate-limit-threshold` to use the new version with reduced dependencies.
  • Deprecation warning: KOITO_ALLOWED_HOSTS configuration will no longer be recognized after this release.
Breaking changes
  • Removed KOITO_ALLOWED_HOSTS configuration reference.
Notable features
  • Fallback to release group MBID for album art retrieval in Discord when the defined release lacks associated art.
  • Zero-width padding support in Discord to allow single-character titles.
  • Added stubbed playing-now route and proper username handling to endpointlz integration.
Full changelog

What's New?

Discord Improvements

  • Fall back to using release group MBID to retrieve album art if the defined release does not have associated art
  • Use zero-width padding to allow single-character titles

Fresher Now Playing

For Sources that support multi-platform (plex, jellyfin), MS will more aggressively mark players as stale when there has been no activity but the Source still reports a player is alive. It will also switch Now Playing to the player that has actual activity if the "current" Now Playing player goes inactive (paused, stopped, stale).

Duplicate Scrobble Detection Docs

A new section in the docs has been added that goes into depth on:

  • How MS detects duplicate scrobbles
  • Configurations that won't cause dupes
  • Configurations that MAY cause dups
    • Solutions for avoiding these scenarios

Full Changelog

⛰️ Features

  • (discord) Implement fallback to release group art if present #578
  • (endpointlz) Add stubbed playing-now route to make some clients happy(er) #579
  • (endpointlz) Implement proper username handling for validate and now-playing routes #579
  • (lastfm) Add more logging to auth process and clean up host detection
  • (mpd) Rewrite with newer MPD client for better payload parsing #574
  • (player) Skip stale updates based on state timestamp and prevent dead players from being created from stale updates
  • (source) Add timestamps to play state to track player and play last updated, if present

🐛 Bug Fixes

  • (cache) Explicitly define auth/metadata as memory when testing file caching
  • (discord) Include known spotify cdn for media providers #569
  • (discord) Workaround activity minimum character limit #578
  • (endpointlz) Fix fallback route not returning a response
  • (lastfm) Fix total results reporting for librefm
  • (now playing) Prefer fresher players #480
  • (player) Initialize player state in the past to prevent false positive on stale update check if update happens at the same time player is initialized
  • (transformer) Try-catch cached steps and fallback to non-cache generation
  • (webscrobbler) Convert express wildcard path to regex #583
  • (No Category) Check undefined on correct property #567
  • (No Category) Simplify listenrange usage
  • (No Category) Fix missing await on stagger mapper initial sleep
  • (No Category) Workaround for old play structure

📚 Documentation

  • (mpd) Add permission guidance
  • (No Category) Add base site env detection for cloudflare pages
  • (No Category) Order BASE_SITE first to allow overriding other envs
  • (No Category) Fix missing backticks causing template errors on version equality
  • (No Category) Try to replace canonical urls for github.io with new site
  • (No Category) Add duplicate scrobble guidance
  • (No Category) Remove extra dupe detection section from client overview

🚜 Refactor

  • (No Category) Replace fast-deep-equal with fast-equals #569

🧪 Testing

  • (player) Fix incorrect variable used for advanced timestamp

⚙️ Miscellaneous Tasks

  • (No Category) Remove references to KOITO_ALLOWED_HOSTS (#581) thanks @gabehf
  • (No Category) Override rate-limit-threshold to use new version with reduced dependencies

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

About

Stars
1,130
Forks
45
Languages
TypeScript MDX JavaScript

Install & Platforms

Install via
docker
Platforms
linux arm64

Alternative to

browser extension mobile app scrobbler

Beta — feedback welcome: [email protected]