Hi all – I’ve built a tool called Harmonist, for Picard-compatible tagging of Bandcamp purchases, and thought this crowd would appreciate the approach even if the tool itself isn’t for everyone.
I buy most of my music on Bandcamp, and for a while now I have wanted my purchases to land in my music library correctly tagged without having to wait until I get back to my laptop to drive Picard.
The key enabler here is that MusicBrainz records a release’s Bandcamp URL as a relationship. Harmonist gets the Bandcamp URL from the download itself, and hence can match it to an MB release by direct lookup (rather than a fuzzy match on filenames or fingerprints or whatever). Of course when a release isn’t in MusicBrainz yet, Harmonist points you at Harmony to seed it. A nice side effect of dogfooding this tool has been turning my own buying habit into a steady trickle of MB edits.
It’s a Python/FastAPI web app with an HTMX-based UI – no CLI required – self-hosted via Docker. It’s built on bandcampsync and musicbrainzngs.
Repo with screencast and lots more information: https://github.com/randomphrase/harmonist
Just to be upfront: this is built with substantial AI assistance (Claude). All code is human-reviewed, type-checked and linted in CI, and there is decent test coverage. Furthermore, I’ve been exercising it regularly against my own library of 400+ Bandcamp purchases, and have rounded out many corner cases as a result.
I care about how the MB community feels about this, so one thing I’d genuinely like input on: are there known edge cases in the URL-relationship data I should be handling better? Any concerns with the API usage? (It does set the user-agent and respect rate limits). Any constructive feedback welcome; just post below!