Harmonist: a self-hosted tagger that matches Bandcamp purchases to MusicBrainz releases

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!

5 Likes

Nice and interesting tool, thanks for sharing.

About API, I wrote some time ago a modern alternative to musicbrainzngs : GitHub - zas/musicbrainzpy: Python bindings to use MusicBrainz Web Service (json/async/modern approach) · GitHub

3 Likes

Very interesting - I will take a look! Thanks