Self-hosted music request manager

Muzikk

Your albums, lossless, effortlessly

Muzikk sits between your MusicBrainz catalogue and your Jellyfin library. Ask for an album, and it finds it on Soulseek or BitTorrent, checks it, tags it, files it under your own naming scheme and tells Jellyfin to look again.

  • One container
  • SQLite only
  • Lossless first
  • Jellyfin accounts

What it is

A request manager for music, in the spirit of Overseerr

Your users search a real catalogue rather than a scraped index, see at a glance what the library already holds, and request whole albums. Muzikk queries each source in the order you chose, scores every candidate it gets back, and only downloads one it can defend.

What arrives is verified, tagged from MusicBrainz, given its artwork and filed where Jellyfin expects it. FastAPI serves both the API and the interface, an internal worker drains a queue kept in SQLite. No Redis, no Postgres, nothing to babysit.

  • One container to run

    FastAPI, the React interface and the background worker ship together. Three volumes, and you are done.

  • Jellyfin is the gatekeeper

    No second password to manage. Jellyfin administrators become Muzikk administrators, and secrets are encrypted at rest.

  • Lossless by default

    Accepted formats are ranked, a lossy fallback is opt-in, and an album you already own in MP3 can be upgraded on request.

Features

Everything Muzikk does

Grouped the way the application itself is: find the music, play it, fetch it, repair its tags, and keep the whole thing configurable.

01

MusicBrainz catalogue search

An album is identified before it is ever downloaded, which is what makes everything downstream reliable.

  • Runs against your own self-hosted MusicBrainz server first, with musicbrainz.org kept as an automatic fallback when it is unreachable.
  • Separate rate limits for the local instance and the public server, so neither is ever hammered.
  • Search by album, by track, by artist or by label — a label page unfolds its entire catalogue, ready to request.
  • A song title is enough: track search finds the album that contains it, in your library and in MusicBrainz alike.
  • Cover art from the MusicBrainz Cover Art Archive, cached on disk and resized once, with the release falling back to its release group.
  • AcoustID support: an audio fingerprint identifies a folder whose tags say nothing at all.
  • Albums you already own are flagged in the results — a solid tick on a MusicBrainz identifier match, a lighter one on a fuzzy match, and an amber badge when the copy you hold is not lossless.
  • A specific MusicBrainz release can be forced from the album page when the default edition has the wrong track count.

02

Jellyfin library built in

Jellyfin provides the accounts and the library. Muzikk adds a player on top and never asks for a second password.

  • Sign in with your Jellyfin account. Administrators there are administrators here, and access can be limited to a chosen list of Jellyfin users.
  • Playback directly inside the application, with a queue, shuffle and repeat. Click a track on an album page and it starts there.
  • Files are read straight from the music folder when Muzikk can see it — faster, and independent of any Jellyfin playback policy. Otherwise the stream is relayed through the API and the browser never receives a Jellyfin token.
  • Full Jellyfin playlist management: listen, create, delete, add a single track or a whole album in disc and track order, and remove a track.
  • Playlists are written with the listener's own token, never the server API key, so a list created from Muzikk is an ordinary Jellyfin playlist visible in every client.
  • Plays can be reported back to Jellyfin, credited to the listener who started them.
  • Thirty second previews from Deezer, then iTunes, for a track you do not own yet — relayed by the API, so the browser contacts neither service.
  • A background index keeps the ownership badges fresh, and a Jellyfin rescan is triggered once an album has been filed.

03

Integrated downloading

Providers are queried in the order you set. The first one with a candidate above the score threshold wins; the others are never touched.

  • Soulseek through slskd, with per-peer filters on speed and queue length.
  • Torrents through Prowlarr and qBittorrent, each indexer carrying its own priority, public or private classification and seeder floor.
  • Upgrade option: replace an album you own in MP3 — or any other lossy format — with a FLAC copy, as a permission granted per user.
  • Requests cover a whole album, never a single track, with optional administrator approval and weekly quotas per account.
  • Every candidate is scored on artist and title similarity, track count, track titles, detected format, size per track and seeders or peer speed. Below the threshold, Muzikk moves on.
  • A torrent's file list is read before the torrent is handed to qBittorrent, which is what kills most false positives.
  • Up to four search wordings are tried per provider, each dropping something a peer may not have written — release type first, then edition mentions.
  • The slskd download folder is inspected before any search: an album already sitting there complete is imported without touching the network.
  • After download: integrity check with flac -t or ffmpeg, full MusicBrainz tagging, embedded artwork and cover.jpg, filing under your naming template, a hardlink so seeding continues, then a Jellyfin rescan.
  • An upgrade pauses for approval before anything is deleted: both versions are listed file by file with format, bitrate, resolution, duration and size, and each side has a play button so you can actually compare them.
  • Failures are retried on their own schedule, and everything can be requeued at once from the requests page.
  • Each request keeps a log of every candidate evaluated, its score and the reason it was turned down, streamed live over server-sent events.
  • Artist watchlist and wishlist list what is missing without ever downloading it by themselves — new releases only, or a whole discography, per artist.
  • Local import: drop an album folder from the home page and Muzikk identifies it, writes the tags, lays down the artwork and files it like any other import — refusing to overwrite a lossless copy you already have.

04

Full metadata management

A Picard-style workshop that runs on your own server: it reads the music folder itself, tells you what is wrong, and writes nothing you have not simulated first.

Library analysis

  • Walks the library folder straight from disk — including what Jellyfin skipped — groups files per album folder and folds multi-disc sets back together.
  • Flags seven anomalies: no MusicBrainz tag, uncertain match, no artwork, incomplete tags, doubled tags, duplicate album, missing from Jellyfin.
  • Every pass leaves a report: folders found, folders kept, and exactly why the others were skipped, with the first offenders named.
  • Runs in the background worker, so it survives a closed tab and even a container restart, which requeues it.
  • Optional nightly analysis at an hour you choose.
  • Filter by anomaly, search by album, artist or path, and follow each album through three states: to fix, fixed, ignored.

Identification

  • Search MusicBrainz for the album, every candidate carrying a relevance score.
  • Force the search wording when the folder is named oddly.
  • Paste a MusicBrainz MBID or URL — Muzikk tries it as a release group, then as a release.
  • AcoustID audio fingerprint over a configurable number of sampled tracks, with the results voted across them.
  • A stored match writes nothing on its own: it only unlocks the simulation.

Reading and writing tags

  • Simulate first: every field, before and after, file by file, with a count of what would change.
  • Read every tag of a single track, value by value, the way Picard shows them. A field written twice appears twice, in amber.
  • A full Picard-style tag set is written: titles, artists, album artist, date and original date, track and disc numbers with their totals, up to eight genres, label, catalogue number, barcode, ISRC, media, release country, status and type, sort names, compilation flag and every MusicBrainz identifier.
  • Per container: Vorbis comments for FLAC, Ogg and Opus, ID3 for MP3, WAV and AIFF, iTunes atoms for MP4, M4A and ALAC, and WM attributes read for WMA.
  • Files are paired to the tracklist by number, by name, then by fuzzy title, and anything left unpaired is reported instead of guessed.
  • Artwork from the Cover Art Archive, embedded in the files and written as cover.jpg and folder.jpg — each one a separate toggle.
  • Writing is destructive and says so: one explicit confirmation per album, never a silent batch.

Jellyfin reconciliation

  • Pair up the artwork files so every album folder holds both cover.jpg and folder.jpg, copying whichever exists and extracting the embedded picture when neither does.
  • Repair the Jellyfin covers: ask Jellyfin to look again, then upload the image directly for the albums still showing empty — from the folder, then the tags, then the Cover Art Archive.
  • Align Jellyfin on the tags: compare album title, artist and year plus every track title and number, then write them back through the API. It also runs by itself after each tag write.
  • Reindex Jellyfin so the folders it had ignored are finally picked up.

05

Administration for Jellyfin admins

Fifteen sections, saved one at a time. Each integration has a Test connection button that uses what is on screen, even unsaved, and every secret is encrypted at rest.

General behaviour

  • Default language and default weekly quota for accounts imported from Jellyfin.
  • Administrator approval required, and whether administrators bypass it.
  • Delay before a new attempt, and the maximum number of attempts per request.
  • Library index interval, followed artists check interval, log retention in days.

Integrations, each with a connection test

  • Jellyfin — URL, API key, the music libraries to watch, a scan triggered after import, and an optional allow-list of Jellyfin user ids.
  • MusicBrainz — local instance URL, public fallback and its URL, one rate limit for each, and the contact sent in the User-Agent.
  • Cover Art Archive — URL, preferred size, embedding in files, cover.jpg and folder.jpg.
  • slskd — URL, API key, URL prefix, the download folder as Muzikk sees it, search duration, response limit, minimum peer speed, maximum peer queue length, transfer and stall timeouts, and removal of finished transfers.
  • Prowlarr — URL, API key, Torznab categories, result limit, the dedicated music search, and fetching the .torrent to check its file list before adding it.
  • Indexers — synchronised from Prowlarr, then enabled, prioritised, classified public or private and given their own seeder floor, one by one.
  • qBittorrent — URL, credentials, category, download folder, transfer and stall timeouts, keep seeding after import, add torrents paused.
  • AcoustID — fingerprinting on or off, API key, and how many tracks each fingerprint samples.

Quality rules

  • Accepted lossless formats, in order of preference.
  • Optional lossy fallback, its accepted formats and a minimum bitrate.
  • A preference for 24 bit, and the minimum score a candidate must reach.
  • Tolerated track count difference, minimum seeders, minimum and maximum size per track.
  • Audio integrity verification, rejection of incomplete albums, and a rule requiring the artist to appear in the candidate path.

Naming and filing

  • The naming template, with a live preview on three examples — a plain album, a multi-disc set and a compilation.
  • Library folder, replacement character for unsafe ones, maximum component length, and the name used for compilations.
  • Hardlinks when the filesystem allows them, so Soulseek downloads keep seeding.
  • Whether an upgrade deletes the old copy, and whether that deletion needs validating first.

Player and providers

  • Playback on or off, reading files directly from the music folder, thirty second previews, a maximum relay bitrate, and play reporting to Jellyfin.
  • Provider order: reorder Soulseek, public trackers and private trackers as a ranked list.

Users and permissions

  • Import accounts from Jellyfin in one click; administrator status always follows Jellyfin.
  • Per account: account active, request albums, upgrade to lossless, import a folder.
  • Automatic approval as a three-way choice — follow the global setting, always, or never.
  • A weekly quota per account, zero meaning unlimited, with administrators exempt.
  • Last sign-in shown next to each account.

System and maintenance

  • Version, configuration directory, library folder, worker count, and which services are actually configured.
  • Run any task by hand: index the library, import users, sync indexers, check followed artists, check the wishlist, retry failures, prune logs.
  • Clear the cover cache, which is also purged on its own when the artwork URL changes.
  • Watch the last forty background jobs with their state, their request and their error message.

Screenshots

A look at the interface

Dark by design, built for a browser you keep open next to your music.

The home page: one search field for albums, artists, tracks and labels.
The home page: one search field for albums, artists, tracks and labels. 1 / 9

Ready to run it?

A compose file, three volumes and a Jellyfin API key. The documentation walks through each service, the naming template and the usual mistakes.