SELF-HOSTED · MIT · YOUR HARDWARE

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.

your-server : ~
curl -fsSLO https://raw.githubusercontent.com/Jeffreyyvdb/MusicHoarder/main/docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/Jeffreyyvdb/MusicHoarder/main/.env.example -o .env
# edit .env — set your two folders, a Postgres password, owner email + public URL
docker compose up -d
View on GitHub
runs on your hardware source mounted read-only open files on disk
live pipeline ~/Downloads/music_dump_2024
[scan] discovered 47 new audio files
[fp] AcoustID match (0.94) → 9c1ecd05…
[match] 7 providers queried · 240ms avg
[decide] consensus: Radiohead — In Rainbows
[grade] quality LLM scored "Nude" → 94/100
[dedupe] duplicate → keeping FLAC over 320
[write] → /music/destination/Radiohead/2007 - In Rainbows/03 - Nude.flac
[decide] low consensus (0.62) → sent to Inbox
processed 8,955 remaining 3,892 eta 00:14:32
THE PIPELINE

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.

Providers querying in parallel · avg 240ms
AcoustID
fingerprint
99%
MusicBrainz
metadata
96%
Spotify
metadata
94%
Deezer
metadata
88%
Apple Music
metadata
no match
Community Tracker
community
no match
YeTracker
community
no match
+47 tracks landed per hour 0 errors in 24h live throughput needs a human
HUMAN REVIEW · INBOX

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.

THE PAYOFF · LIBRARY

What 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.

8,955 tracks catalogued 412 albums · 168 artists 90.4% fully enriched Open the library in the demo →
THE RECEIPTS · PROVENANCE

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.

IR
Track

Nude

Radiohead · In Rainbows · 2007
Duration 4:17 Format FLAC 1024kbps Size 31.8 MB AI grade 94/100
Source · raw
/music/source/Downloads/music_dump_2024/track_047.flac
Destination · clean
/music/destination/Radiohead/2007 - In Rainbows/03 - Nude.flac
Providers that contributed 3 of 4 providers returned data this track used.
AcoustID MusicBrainz Spotify
Full timeline 8 events · 679ms end-to-end
  1. 14:32:01.842 SCAN Embedded tags
    discovered track_047.flac · no usable ID3
  2. 14:32:01.903 FINGERPRINT AcoustID
    Chromaprint fingerprint computed
  3. 14:32:01.903 FP LOOKUP AcoustID 94
    AcoustID matched · Nude
  4. 14:32:02.046 METADATA MusicBrainz 96
    MusicBrainz matched · Nude
    searched “Radiohead Nude”
  5. 14:32:02.180 METADATA Spotify 94
    Spotify matched · Nude
    searched “Radiohead Nude In Rainbows”
  6. 14:32:02.240 METADATA Deezer
    Deezer returned no match
    searched “Radiohead Nude”
  7. 14:32:02.418 AI GRADE Quality LLM 94
    Quality grade · Excellent (94/100) — Fingerprint + 3-provider consensus all agree; paths and tags are consistent.
  8. 14:32:02.521 WRITE
    written to destination library
QUICKSTART · ~2 MINUTES

Self-host it in three steps.

No account, no SaaS. Grab two files, point it at two folders, open a browser. An AcoustID key is optional but sharpens matching.

  1. 1
    Download and configure

    Grab docker-compose.yml and .env.example — no repo clone needed. Point MUSIC_SOURCE_PATH at your messy folder and MUSIC_DESTINATION_PATH at an empty one for the clean library, then set a POSTGRES_PASSWORD, OWNER_EMAIL, and PUBLIC_BASE_URL.

  2. 2
    Bring it up

    Run docker compose up -d. It pulls the prebuilt API + frontend images from GHCR, starts PostgreSQL, applies migrations, and the scanner begins walking your source tree immediately.

  3. 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.

docker-compose.yml
services:
  postgres:                       # metadata + cache
    image: postgres:17

  musichoarder:                   # API + the whole pipeline
    image: ghcr.io/jeffreyyvdb/musichoarder/api:latest
    ports: ["5050:8080"]
    volumes:
      - ${MUSIC_SOURCE_PATH}:/music/source:ro        # read-only
      - ${MUSIC_DESTINATION_PATH}:/music/destination # 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
    image: ghcr.io/jeffreyyvdb/musichoarder/frontend:latest
    ports: ["3000:3000"]
    depends_on: [musichoarder]

Abridged — the full compose file (with Postgres, env, and healthchecks) lives in the repo. docker-compose.yml →

01
Identified by sound
Chromaprint + AcoustID fingerprint every file — even when it is named track_047.mp3 with empty tags.
02
Consensus across seven providers
AcoustID, Spotify, MusicBrainz, Deezer, Apple Music and two community trackers vote; MusicHoarder takes the agreement, not the first hit.
03
Graded by an LLM
A quality LLM scores every match 0–100 and only escalates what it distrusts to your Inbox — so you review dozens of tracks, not thousands.
04
Bit-aware dedupe
Groups by acoustic fingerprint, keeps the highest-quality copy, and logs every decision so you can audit any choice later.
05
Your files, untouched
The source folder is mounted read-only. MusicHoarder writes a clean copy to a separate library; the originals are yours to keep or delete.
06
Plain files, no lock-in
Output is Artist / Year - Album / NN - Track on disk, with real artwork and synced lyrics embedded. No proprietary database, no cloud.
START HOARDING

Your library is one command away.

Pull the image, point it at your folders, and let the conveyor do the cataloguing.

your-server : ~
curl -fsSLO https://raw.githubusercontent.com/Jeffreyyvdb/MusicHoarder/main/docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/Jeffreyyvdb/MusicHoarder/main/.env.example -o .env
# edit .env — set your two folders, a Postgres password, owner email + public URL
docker compose up -d
View on GitHub
© 2026 MusicHoarder · self-hosted release v1.0.0 · no music files were harmed