Point it at the mess.
Get back a library.
MusicHoarder is a self-hosted pipeline that fingerprints every track, reaches consensus across seven providers, grades the result with a quality LLM, dedupes, and writes a tidy library to your own disk.
git clone https://github.com/Jeffreyyvdb/MusicHoarder.git cd MusicHoarder cp .env.example .env # set MUSIC_SOURCE_PATH, MUSIC_DESTINATION_PATH, secrets docker compose up -d --build
Seven stages on one conveyor — watch it move.
Files flow left to right — scanned, fingerprinted, matched against providers, graded by an LLM, deduped, then written to your library. Click any stage to see what's flowing through it right now.
When the pipeline can't decide, you do — and only then.
The automatic stages handle the boring 90%. Everything ambiguous — disagreeing providers, look-alike duplicates, anything the quality LLM distrusts — collects in one Inbox, so you review dozens of items, not thousands.
Providers couldn’t agree, or none cleared the confidence threshold. You pick the right candidate or override the fields by hand.
ReviewSame acoustic fingerprint, no obvious winner — usually a live vs. studio cut or two near-identical bitrates. You choose what to keep.
CompareThe quality LLM graded a match Questionable or Wrong — a year drift, a rewritten title, a path that doesn’t fit. Worth a second look.
InspectWhat comes out the other side.
Correct titles, real artwork, consistent folders — Artist / Year - Album / NN - Track on your own disk. Browse it in a clean interface or just open the folder. No database to escape from.
In Rainbows
Radiohead · 2007
Blonde
Frank Ocean · 2016
Random Access Memories
Daft Punk · 2013
To Pimp a Butterfly
Kendrick Lamar · 2015
Currents
Tame Impala · 2015
Kid A
Radiohead · 2000
Discovery
Daft Punk · 2001
Channel Orange
Frank Ocean · 2012
DAMN.
Kendrick Lamar · 2017
OK Computer
Radiohead · 1997
Migration
Bonobo · 2017
Illinois
Sufjan Stevens · 2005
Every track remembers how it got here.
Click any track and see the whole story — where the raw file came from, every provider that touched it, what the AI graded it, and exactly where it lives now. Nothing is a black box.
Nude
- 14:32:01.842 SCAN Embedded tagsdiscovered track_047.flac · no usable ID3
- 14:32:01.903 FINGERPRINT AcoustIDChromaprint fingerprint computed
- 14:32:01.903 FP LOOKUP AcoustID 94AcoustID matched · Nude
- 14:32:02.046 METADATA MusicBrainz 96MusicBrainz matched · Nudesearched “Radiohead Nude”
- 14:32:02.180 METADATA Spotify 94Spotify matched · Nudesearched “Radiohead Nude In Rainbows”
- 14:32:02.240 METADATA DeezerDeezer returned no matchsearched “Radiohead Nude”
- 14:32:02.418 AI GRADE Quality LLM 94Quality grade · Excellent (94/100) — Fingerprint + 3-provider consensus all agree; paths and tags are consistent.
- 14:32:02.521 WRITEwritten to destination library
Self-host it in three steps.
No account, no SaaS. Clone the repo, point it at two folders, open a browser. An AcoustID key is optional but sharpens matching.
- 1 Clone and configure
Copy .env.example to .env and point MUSIC_SOURCE_PATH at your messy folder and MUSIC_DESTINATION_PATH at an empty one for the clean library. Set a POSTGRES_PASSWORD and OWNER_EMAIL.
- 2 Bring it up
Run docker compose up -d --build. It builds the API + frontend images, starts PostgreSQL, applies migrations, and the scanner begins walking your source tree immediately.
- 3 Open the dashboard
Visit the frontend on :3000 (the API is on :5050), watch the conveyor fill, and clear anything that lands in your Inbox. An AcoustID key is optional but makes matching far more confident.
services:
postgres: # metadata + cache
image: postgres:17
musichoarder: # API + the whole pipeline
build: .
ports: ["5050:8080"]
volumes:
- ${MUSIC_SOURCE_PATH}:/music/source:ro # read-only — never modified
- ${MUSIC_DESTINATION_PATH}:/music/destination # your clean library
environment:
- MusicEnricher__SourceDirectory=/music/source
- MusicEnricher__DestinationDirectory=/music/destination
- MusicEnricher__AcoustIdApiKey=${ACOUSTID_API_KEY:-}
depends_on: [postgres]
frontend: # the web UI you're looking at
build: ./frontend
ports: ["3000:3000"]
depends_on: [musichoarder]Abridged — the full compose file (with Postgres, env, and healthchecks) lives in the repo. docker-compose.yml →
Your library is one command away.
Pull the image, point it at your folders, and let the conveyor do the cataloguing.
git clone https://github.com/Jeffreyyvdb/MusicHoarder.git cd MusicHoarder cp .env.example .env # set MUSIC_SOURCE_PATH, MUSIC_DESTINATION_PATH, secrets docker compose up -d --build