We're happy this one is finally out. It includes a ton of fixes and additions 🎉
The first 2.0 release candidate shipped last December. Then we kept finding reasons to hold it back (one more fix, one more cleanup, one more thing to verify first). Instead of postponing the inevitable again, we decided it is time we do a proper release now.
Because this is a major version, please have a look at the breaking changes below!
Upgrading
- Back up
/config. - Switch your compose file or
docker runline frompspitzner/beets-flasktometasauce/beets-flask. The old image name will not receive updates. docker compose pull && docker compose up -d.- Open the UI. If your config has an option we can no longer validate, it will say so on startup instead of crashing.
⚠️ Breaking Changes ⚠️
- Repository and images moved: from
pSpitzner/beets-flasktometasauce/beets-flask. Update your git remote and your image reference. Updatepspitzner/beets-flasktometasauce/beets-flaskin your compose file, otherwise you will stay on 1.2.x. - Base image changed: the container base image is now
python:3.12-slim(previouslypython:3.11-alpine). If you use a customstartup.sh, check it for Alpine-specific tooling and shell behaviour #212 - Upgraded
beetsfromv2.5.1tov2.14.0- Many changes and improvements, including in some plugins.
- See the changelog at beets.readthedocs.io
- Changed config options (beets-flask):
gui.inbox.folders.your_inbox.autotagno longer acceptsfalse, use"off"instead. This was needed for consistency with the new config validation.
- Changed config options (beets):
fetchart.sourcesdefaults changed. If you get errors from our previous defaults, set it to"*".
Added
- Config validation. When loading config files we now check that the specified options will work. If they won't, the frontend shows an error message with details on what is wrong. This covers
guisettings (our own ones, inbeets-flask/config.yaml) and the native beets options we use directly. Covering all of beets' native options is more of an upstream task. #224 - Upload files via the WebUI. You can now drag and drop single files into an inbox. To upload whole albums, zip them on your host first — uploading folders directly would require a secure context.
- New config option
gui.terminal.enabled(default: true) #254 - You can use
PUIDandPGIDinstead ofGROUP_IDandUSER_ID. Handy for yaml anchors. #260 - Use an external redis server by setting the
REDIS_URLenvironment variable. #277 - Faster inbox loading: chip info (best match, duplicates, data source) is fetched via a new lightweight
/session/minimalendpoint, batched into one request instead of loading full session states. - Cover art preview for external URLs is resolved through a pluggable art-extension system. New providers can be added by implementing the
ArtSourceinterface. - Discogs art source: releases matched via the discogs plugin get cover art previews. Works without a token; uses
discogs.user_tokenwhen configured for a higher API rate limit. - Bandcamp art source: artwork is read from the release page JSON-LD.
Fixed
- Finally tracked down our resource issues, starting with the low-hanging fruit on memory footprint #342
- Missing library stats no longer crash on first launch #264
- Fixed a potential memory leak when checking whether files are archives. We now check the file extension instead of opening the file, which avoids the
tarfile.is_tarfileissue #258 - Library stats no longer block for minutes on large or network-mounted libraries. The size is computed by one shared background
dutask, and a request waits at most two seconds for it #360 - The tmux terminal could not start in some environments when
SHELLwas not set. We now always start a bash shell #282 - The container user
beetlenow uses bash by default and activates the uv environment automatically. - YAML syntax and parser errors are passed to the frontend for you to inspect instead of crashing before the UI starts #305
- Fixed timestamps in the library view #289
- A failed import no longer leaves a stale error behind after a successful reimport of the same folder.
- Folders without an import session no longer show a misleading "Unknown"/"Not started" badge.
- Folders containing only non-music files (e.g. a stray
foo.txt) are no longer detected as albums and auto-tagged by the watchdog. - Session and inbox data is cached in the frontend and only refetched when it changes, instead of on every view.
Other (dev)
- We now use
uvto manage python dependencies and run scripts in CI/CD, which improved dependency resolution and installation times. - We ship a static ffmpeg binary instead of installing ffmpeg via apt, which cut image size and improved compatibility across host systems.
- Added database migrations using Alembic.
- Removed the unnecessary
nest_asynciodependency. - Upgraded a number of frontend dependencies.