Releases: metabrainz/listenbrainz-server
v-2026-03-10.0
API changes
Standardize range field [breaking change]
As announced in a blog post of Feb. 16th, we have fixed some inconsistencies in the name of some fields in our API responses (stats_range -> range).
Now you don't need to guess or wonder if the documentation is incorrect, all relevant endpoints will return the field range:
/1/stats/artist/<mbid>/listeners/1/stats/release-group/<mbid>/listeners/1/stats/sitewide/artist-map
If you are a third-party developer or use the above endpoints in your own code, make sure you're not expecting stats_range anywhere.
Playlist search [breaking change]
Previously, the endpoint used to search through a user’s playlist was returning playlists from other users.
This has been fixed and the /1/user/<user>/playlists/search endpoint will now only return search results for
Use the new ?include_global=true flag to also search through all public playlists.
Clear my playing_now listen [new endpoint]
You can now manually clear the current playing_now for your account, instead of relying on expiry after the track’s duration has elapsed, or 10 minutes if there is no duration.
This is a POST endpoint /1/user/<user>/playlists/search
If a client is provided in the request body, the endpoint will only clear the playing_now if it was submitted by that specified client.
This is particularly relevant if you are developing a client that submits listens to ListenBrainz; you can now detect if a user stopped playback, and send a request to clear the user’s status.
New features
Import loved tracks from Libre.FM
While you were previously able to import your listening history from Libre.FM, importing loved tracks was limited to the Last.FM importer.
That has now been rectified, you can import your favorites to your heart's content, from the Connect services page

Import Spinitron listening history files
Do you run a radio station? Well this might be for you!
Continuing on our efforts to allow you to migrate from anywhere to ListenBrainz, you can now export your Spinitron history as a CSV file and import it into your account.
Head, as usual, to the Import listens page

What’s Changed
Thank you to @Shreshtthh, @NAME-ASHWANIYADAV, @Parvm1102, @MrKomodoDragon, @shirsakm and @uzman2406 for their contributions 👏
- LB-1889: Import loved tracks from LibreFM (#3587) @Shreshtthh
- LB-1834: Standardize stats range field to "range" across all stats endpoints (#3578) @NAME-ASHWANIYADAV
- LB-1632: ADD Spinitron CSV Import support (#3584) @NAME-ASHWANIYADAV
- LB-1927: allow history importer to accept bigger files (#3572) @Parvm1102
- LB-1680: Add frontend display of service status (#3585) @MrKomodoDragon
- LB-1837 feat: improve playlist search API (#3505) @anshg1214
- LB-1866: Add delete_playing_now endpoint and corresponding tests (#3439) @anshg1214
- LB-1952: Remove YIM testing line (#3630) @MonkeyDo
- Add user_name to playing_now listens (#3629) @MonkeyDo
- LB-1848: Update MB metadata cache to surface URL relationships (#3626) @shirsakm
- Update Bar.tsx (#3602) @uzman2406
- Update troi to v2026.3.10.0 (#3628) @amCap1712
- Tweak AI section of PR template (#3625) @MonkeyDo
- chore(deps-dev): bump svgo from 3.3.2 to 3.3.3 (#3614) @dependabot[bot]
- chore(deps): bump dompurify from 3.3.1 to 3.3.2 (#3617) @dependabot[bot]
- chore(deps): bump immutable from 5.1.2 to 5.1.5 (#3613) @dependabot[bot]
- chore(deps): bump dompurify from 3.2.4 to 3.3.1 (#3612) @dependabot[bot]
- Update dependencies and websockets setup (#3616) @amCap1712
- chore: update troi package (#3610) @anshg1214
v-2026-03-03.0
New changes
A lot of small improvements in this version, as potential GSOC contributors show us what they got.
Notable addition of a graph on the "current status" page to show how many ListenBrainz users are joining each month, confirming the clear uptick we have felt since last year.

What’s Changed
- Fix soundcloud playlist import failure (#3581) @meekhumor
- Show user count evolution in status page (#3589) @MonkeyDo
- feat: Add retry mechanism to RecordingFeedbackManager and add tests (#3566) @garvthakre
- Clarify that arbitrary keys are allowed in
additional_info(#3588) @elomatreb - LB-1733: Add noscript warning in case user disables JS (#3564) @MrKomodoDragon
- test: added functional and integration tests for Navidrome (#3582) @mAmanullah7
- LB-1425: Hide listening-now link on other users' pages (#3567) @SomishaAdak
- LB-1838: Update docstrings to clarify pin/unpin API functionality (#3569) @NAME-ASHWANIYADAV
- Update RTD docs packages and fix search functionality (#3576) @MonkeyDo
- LB-1838: Fix broken Sphinx references in pin API docs (#3577) @NAME-ASHWANIYADAV
- Update PR template: add AI usage section and align with MB template (#3568) @MonkeyDo
- Fix to_api() User ID Mapping (#3573) @dronabopche
- LB-764: Remove uuid-ossp SQL extension (#3551) @MonkeyDo
- Add option to disable playlist export to spotify during YIM run (#3597) @amCap1712
- Refactor : Timezone and Troi preferences settings to functional components (#3574) @yateendogra2109
- feat(explore): LB-1932 Make Beta and Archived sections collapsible with keyboard support (#3570) @NAME-ASHWANIYADAV
- Refactor the retry logic in submitListens to remove the duplicate code (#3510) @yateendogra2109
- chore(deps): bump werkzeug from 3.1.5 to 3.1.6 (#3594) @dependabot[bot]
- chore(deps): bump swiper from 12.0.3 to 12.1.2 (#3593) @dependabot[bot]
v-2026-02-11.0
UI Improvements
Add listens modal
We improved the timestamp section in the "Add listens" modal, making it less clunky, saving a click and making it look nicer on mobile sizes.

Settings auto-save
Ever noticed how some parts of the settings required to click a "save" button while others didn't?
Ever changed your BrainzPlayer settings and navigated away only to find out you missed the "save" button at the bottom of the page?
Well, i sure did!
Now everything will automatically save for you so you don't have to worry about it, and show you a little confirmation message.
Year in Music alt-text button
This was requested since we have a button on the Art Creator to copy the alt-text, but don't have it on the Year in Music page.
Here it is :) Since we are going to keep the same Year in Music page for a while, consider it done for next year!

What’s Changed
- LB-1922 : Added Auto Save functionality to Settings (#3542) @yateendogra2109
- LB-1928 : Add Listen timestamp UX improvements (#3553) @Shreshtthh
- LB-1913: Filter out unrealistic years from Music by Decade chart (#3507) @AshutoshThings
- LB-1906: Add alt text copy button for Year in Music shareable images (#3483) @meekhumor
- test: added functional and integration tests for funkwhale (#3538) @mAmanullah7
- Update MusicBrainz OAuth registration steps to match current UI (#3552) @SomishaAdak
- Narrow exception handling in index view (#3559) @howtoquitvivek
- chore(deps-dev): bump webpack from 5.94.0 to 5.105.0 (#3556) @dependabot[bot]
v-2026-02-04.0
BrainzPlayer improvements
Make it BIGGER
If you use the Youtube player to play your music, you don't have to squint at the tiny video anymore!

You can now resize it to take as much space on the screen as you want.
Resize the frame from the top left corner, or with the quick expand/contract button added for convenience (top right).

Keyboard interactions
You can now use your keyboard to control the music player:
- left/right arrow keys to skip 10 seconds at a time
- up/down arrows to change the volume
- m key to mute/unmute
- 0-9 number keys to track to 0%-90% in the song
What’s Changed
- LB-1488: Allow Youtube video to be resized (#3441) @celestiancoder
- LB-1882: Add keyboard interactions to BrainzPlayer (seek + volume) (#3530) @faizanakhtar123
- LB-1910: Fix thanking a user for a pin causing 500 error (#3546) @Parvm1102
- Clarify import page info bubbles (#3549) @MonkeyDo
- Add explore widget (beta) tile + explore tidy (#3547) @Aerozol
v-2026-01-30.1
What’s Changed
Fixes a small detail in the previous release, ensuring the presence of track_metadata.additional_info when requesting a recording_msid in playing-now response body.
This ensures the playing-now listen is ingested with the recording_msid properly set.
v-2026-01-30.0
New features
New history file importer for Audioscrobbler/Rockbox format
Some players allow you to export your listening history as a .scrobbler.log file in the Audioscrobbler format.
If that's you, you can now import those history file directly in Settings > Import listens
Nice work from @shirsakm
Get an MSID identifier for playing-now listens
This is relevant in particular to third-party scrobblers: send the query parameter return_msid=true when sending a playing-now listen, and the response payload will contain a recording_msid.
This MSID can be used to send love/hate feedback, even if the user does not listen to the whole track or you don't send a full listen. Previously you needed to wait for a full listen to be sent to then retrieve identifiers.
Hide more events in your feed
We had missed a few event types that you couldn't hide. That is now fixed, get those notifications out of your sight!
Thanks to @fettuccinae for this fix
Fresh Releases: Fix range selection in "for you"
Previously changing the range had no effect. You can now limit your "for you" tab to the past and future week or month.
Good one @Dewolf1 !
Document HTML widgets
Remember the HTML widgets we added in August?
They were hidden from sight, and now have a dedicated page in our documentation: https://listenbrainz.readthedocs.io/en/latest/users/widgets.html
Soon™ we will add buttons on the website to customize and generate HTML code you can embed in your website.
What’s Changed
- LB-1852: Add file importer for Audioscrobbler spec (#3452) @shirsakm
- Fix: Allow users to hide notification events in timeline. (#3516) @fettuccinae
- Return recording MSID when submitting playing-now listen (#3513) @MonkeyDo
- Document HTML widgets in user docs (#3541) @MonkeyDo
- LB-1526: Fix fresh releases range selector (#3536) @Dewolf1
v-2026-01-27.0
What’s Changed
- LB-1827: Add payload documentation for year-in-music stats api (#3484) @meekhumor
- LB-1881: Fix force skip bug with Navidrome player (#3462) @shirsakm
- Delete playlists during user deletion (#3527) @amCap1712
- Show flair for users with anonymous donations (#3528) @amCap1712
- Refresh spotify auth token during album art fetch (#3525) @amCap1712
- Avoid OOM in similar users calculation (#3524) @amCap1712
- Make ConfirmationModal more reusable and accessible (#3518) @uzman2406
- Copy AI use policy from metabrainz/guidelines (#3520) @MonkeyDo
- Update dependencies (#3529) @amCap1712
- chore(deps): bump lodash from 4.17.21 to 4.17.23 (#3523) @dependabot[bot]
v-2026-01-21.1
TL;DR
We fixed an issue with statistics calculations that had a knock-on effect causing the listeners stats (on artist and album pages) to be incorrect.
We've been looking for the cause of these stats discrepancies for a while now!
There is also a change in how the "Play all" button works on album and artist pages, playlists, etc.
Clicking it will now replace the "next up" queue and starts playing from there, making sure that you can navigate away and keep playback going.
What’s Changed
- LB-1895: "Play all" button to properly queue tracks to global player (#3473) @faizanakhtar123
- Increase items per message for listener stats (#3522) @amCap1712
- Limit number of artists stored per time unit for artist_evolution_activity stat (#3521) @amCap1712
- Ensure one unique country per artist in artist cache (#3515) @amCap1712
- Include entity_ids in metadata cache (#3512) @amCap1712
v-2026-01-21.0
New features
Big release this week, many thanks to @celestiancoder, @meekhumor, @faizanakhtar123, @AshutoshThings and @yateendogra2109 !
Save offline listens
If you go offline or for some reason we fail to send your listens, we will now save them in your browser and try again to submit them once you are back online, ensuring you don't lose any of your precious listening history while listening on ListenBrainz.

Custom color presets in Art Creator
Tired of having to find your favorite color combination every week? Don't like the available color presets?
Fret not! You can now save you own custom color presets at will, and your selected preset will also be save for your next visit.

Queue duration
You can now see how many tracks and how much playback time you have in your music queue:

Manual submission: keep my text please!
When you switch between "Add track" and "Add album" modes in the manual submission modal, the search text will now be preserved, so like me you can make the same mistake over and over again, now without the frustration...

What’s Changed
- LB-1911: Fix soundcloud volume slider muting issue (#3509) @meekhumor
- LB-1880: Add BrainzPlayer submission retry logic (#3431) @faizanakhtar123
- LB-1894: play queue duration (#3460) @faizanakhtar123
- LB-1808: Fix scrollbar glitch in tags component (#3329) @anshg1214
- LB-1893: Correct Navidrome track duration logic (#3464) @AshutoshThings
- LB-1518: remember custom color presets on the Art Creator (#3486) @celestiancoder
- LB-1857: Manual submission: Don't clear field when toggling between add track/add album (#3481) @celestiancoder
- Avoid duplicate error toasts when a user does not exist (#3506) @yateendogra2109
- LB-1901: Add GET endpoint for artist cover art for specific artist (#3478) @meekhumor
- Do not perform exact lookup if string is empty (#3492) @amCap1712
- Bump react-router from 7.6.1 to 7.12.0 (#3488) @dependabot[bot]
- Bump werkzeug from 3.1.4 to 3.1.5 (#3489) @dependabot[bot]
- chore(deps): bump mdast-util-to-hast from 13.2.0 to 13.2.1 (#3423) @dependabot[bot]
v-2026-01-15.0
What’s Changed
- LB-1770: Brainzplayer queue improvements (#3485) @MonkeyDo
- LB-1846: Persistent toggles and Sort by on playlist overview page (#3448) @faizanakhtar123
- feat: improve artist activity stat api latency (#3493) @anshg1214
- Update tool links and descriptions to match current version and features (#3476) @regorxxx
- LB-1833: Fix time range handling in artist-evolution-activity stats (#3480) @meekhumor
- Add aria-label to icon-only playback buttons (#3495) @yateendogra2109
- LB-1854: enhance CoverArtGenerator with layout selection methods (#3494) @anshg1214
- Readme chat link update (#3475) @Aerozol
- Update AddData.tsx (#3474) @Aerozol
- Update data-update-intervals.rst (#3482) @Aerozol
- Fix broken link in listenbrainz documentation (#3499) @meekhumor
- Bump urllib3 from 2.6.0 to 2.6.3 (#3487) @dependabot[bot]