# beets v2.10.0 — Release v2.10.0 - Product: beets (https://whatsnew.fyi/product/beets) - Vendor: Adrian Sampson - Date: 2026-04-19 - Version: v2.10.0 - Original notes: https://github.com/beetbox/beets/releases/tag/v2.10.0 - Permalink: https://whatsnew.fyi/product/beets/releases/v2.10.0 - Labels: Platforms: Desktop What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — Store item and album-art paths relative to the library root in the database while remaining absolute in the rest of beets, with automatic migration of existing paths on first run - **added** — Access to the album or item object as db_obj in inline plugin fields - **added** — Import Discogs remixer, lyricist, composer, and arranger credits into multi-value remixers, lyricists, composers, and arrangers fields - **added** — Add keep_synced config option and --keep-synced CLI flag to lyrics plugin to skip re-fetching lyrics for tracks that already have synced lyrics - **added** — Use aliases for artist credit in MusicBrainz plugin - **added** — Execute metadata source plugin searches and lookups concurrently to speed up lookups when multiple plugins are enabled - **fixed** — Chromaprint/Acoustid plugin now correctly respects when the MusicBrainz plugin is not enabled and restores compatibility with MusicBrainz Pseudo-Release plugin - **fixed** — Automatically remux WAV files containing MP3 streams to proper MP3 files during import with correct metadata - **fixed** — Remove clutter from imported album folders - **fixed** — Retry ListenBrainz requests for temporary failures - **security** — Fix stored XSS vulnerability in web plugin where unescaped metadata fields could execute arbitrary JavaScript by using escaped template interpolation #### New features - **Beets library is now made portable**: item and album-art paths are now stored relative to the library root in the database while remaining absolute in the rest of beets. Path queries continue matching both library-relative paths and absolute paths under the currently configured music directory under the new storage model. The existing paths in the database are migrated automatically the first time you run any `beet` command after the update. :bug: (#133) > [!WARNING] > make sure you run `beet version` (or any other command) at least once after upgrading to trigger the migration. Only then you can safely move the library to a new location. - [Inline Plugin](https://beets.readthedocs.io/en/stable/plugins/inline.html): Add access to the `album` or `item` object as `db_obj` in inline fields. - [Discogs Plugin](https://beets.readthedocs.io/en/stable/plugins/discogs.html): Import Discogs remixer, lyricist, composer, and arranger credits into the multi-value `remixers`, `lyricists`, `composers`, and `arrangers` fields. :bug: (#6380) - [Lyrics Plugin](https://beets.readthedocs.io/en/stable/plugins/lyrics.html): Add `keep_synced` config option and `--keep-synced` CLI flag to skip re-fetching lyrics for tracks that already have synced lyrics, even when `force` is enabled. :bug: (#5249) - [MusicBrainz Plugin](https://beets.readthedocs.io/en/stable/plugins/musicbrainz.html): Use aliases for artist credit. - Metadata source plugin searches and lookups are now executed concurrently, speeding up lookups when multiple plugins (e.g. MusicBrainz and Spotify) are enabled. #### Bug fixes - [Chromaprint/Acoustid Plugin](https://beets.readthedocs.io/en/stable/plugins/chroma.html): Do not produce MusicBrainz-sourced autotagger candidates when the [MusicBrainz Plugin](https://beets.readthedocs.io/en/stable/plugins/musicbrainz.html) plugin is not enabled. The chroma plugin now looks up the musicbrainz plugin through the metadata-source registry instead of unconditionally instantiating its own private instance, which also restores compatibility with [MusicBrainz Pseudo-Release Plugin](https://beets.readthedocs.io/en/stable/plugins/mbpseudo.html) for chroma-triggered lookups. :bug: (#6212) :bug: (#6441) - [import command](https://beets.readthedocs.io/en/stable/reference/cli.html#import-cmd) Automatically remux WAV files containing MP3 streams (`WAVE_FORMAT_MPEGLAYER3`) to proper MP3 files during import, instead of silently importing them with incorrect metadata. :bug: (#6455) - [import command](https://beets.readthedocs.io/en/stable/reference/cli.html#import-cmd) Remove clutter from imported album folders. :bug: (#5016) - [ListenBrainz Plugin](https://beets.readthedocs.io/en/stable/plugins/listenbrainz.html): Retry listenbrainz requests for temporary failures. - [Web Plugin](https://beets.readthedocs.io/en/stable/plugins/web.html): Fix a stored XSS vulnerability where unescaped metadata fields (artist, album, title, comments, lyrics) could execute arbitrary JavaScript in the browser. Template tags now use `<%-` (escaped interpolation) instead of `<%=` (raw interpolation). #### For plugin developers - Consumers of [beetsplug.\_utils.musicbrainz.MusicBrainzAPI](https://beets.readthedocs.io/en/stable/api/generated/beetsplug._utils.musicbrainz.MusicBrainzAPI.html#beetsplug._utils.musicbrainz.MusicBrainzAPI) now receive normalized MusicBrainz payloads with underscore-separated field names (for example `artist_credit` and `release_group`) and grouped relation lists such as `work_relations`, `release_relations`, and `url_relations`. The API responses are also now fully typed with concrete `TypedDict` models for releases, recordings, works, and relations. Update direct access to raw MusicBrainz response keys if needed.