Skip to content

Release history

multi-scrobbler releases

Scrobble plays from multiple sources to multiple clients

All releases

15 shown

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
0.13.1 Bug fix

Fixed missing next() invocation preventing ingress Sources from completing requests.

Full changelog

Changelog

  • fix: Add missing next() invocation preventing ingress Sources from completing requests #561 #562
0.13.0 Breaking risk
Breaking changes
  • Node.js requirement updated to 24.14.0 for local installations
Notable features
  • Yandex Music source
  • Improved source/client restart reliability
  • Docker image size reduced ~32%
0.12.2 Bugfix

# Changelog * Fix play initialization not being reset on each API fetch invocation

0.12.1 New feature
Notable features
  • Music Assistant Listenbrainz integration
  • Improved caching and memory usage
  • Grafana dashboard for Prometheus
0.12.0 Breaking risk
Breaking changes
  • Koito support removed from Listenbrainz Client
Notable features
  • Arbitrary time-range historical scrobble matching
  • Interactive schema explorer and JSON editor
0.11.5 New feature
Notable features
  • Discord Rich Presence support
  • Service status monitoring page
0.11.4 Bug fix

# What's New? * A very small release to fix a bug with parsing Spotify data #470

0.11.3 New feature
Breaking changes
  • allowUnknown option deprecated in favor of allowMediaTypes
Notable features
  • Deezer family account monitoring
  • Jellyfin allowMediaTypes configuration
0.11.2 New feature
Notable features
  • Debug button for plays
  • JSON diff tracking for play changes
0.11.1 New feature
Notable features
  • Sonos Source support
  • Memory optimization (30-50% reduction)
  • Prometheus metrics endpoint
0.11.0 Breaking risk
Breaking changes
  • Musicbrainz fallback options deprecated, use searchOrder
  • Removed deprecated Jellyfin Source
  • Removed deprecated Plex/Tautulli Sources
Notable features
  • Libre.fm Source/Client
  • Musicbrainz search method improvements
  • Configurable search order

Beta — feedback welcome: [email protected]