yoink is a self-hosted music library manager that lets you search, download, tag, and organize your collection from multiple sources all from a single, clean web interface
Warning
yoink is under active development and is not production ready. Expect breaking changes, incomplete features, and rough edges. Do not point yoink at your main music library — use a separate copy or a fresh directory until the project stabilizes.
This project is built using AI tools like OpenCode and Codex. All code is reviewed and tested by me, but if you encounter any weirdness and don't hesitate to report any issues you find.
I ran my Lidarr instance for years, but it was really, thightly coupled to its metadata source. (MusicBrainz if I remember correctly?) Some of the stuff I like to listen to is not well represented there, as well as new stuff that artists just drop without any announcement. I also had issues finding good quality downloads for some of the less mainstream music on larger indexers.
yoink was created to solve these issues by leveraging a multi-provider architecture, where you can pull in metadata from multiple sources (currently Tidal, Deezer and MB are supported) and download them via hifi-api and SoulSeek. This way (just like in IT security) you can use multiple metadata sources to cover each other's gaps.
- Unified multi-provider search: you search artists/albums/songs across all providers at once
- Hi-res downloads: You can download the highest quality stuff directly from hifi instances. No need for indexers and external DL clients
- Artist profiles: Unified artist pages combine a single artist from all of your providers (you still have to manually add them)
- Lightweight & fast — Built with Rust for minimal resource usage; runs happily on a Raspberry Pi or a BEEFY COMPUTER
Other features and their status can be found in the roadmap.
| Provider | Type | Notes |
|---|---|---|
| Tidal | Streaming / Download | Uses a hifi-api proxy |
| Deezer | Metadata | Metadata only |
| MusicBrainz | Metadata | Open music database for enrichment |
| SoulSeek | P2P / Download | Via slskd |
Create a compose.yaml (or use the example included in the repo) and run:
docker compose up -dThe web UI will be available at http://localhost:3000. Data is persisted in a named volume and your music library is mounted at /music.
See the compose.yaml for all available environment variables and optional slskd integration.
git clone https://github.com/FlyinPancake/yoink.git
cd yoink
mise install # this installs bun which is required for development and running the app from source
cd frontend && bun install # installs frontend dependenciesCopy the example environment file and configure your providers:
cp .env.example .envThen start yoink dev server:
mise run devThe web UI will be available at http://localhost:5173.
If you want to run the release version you need to build the frontend first
mise build-frontend
mise run-server --releaseThe web UI will be available at http://localhost:3000.
To use SoulSeek as a download source, you'll need a running slskd instance. A convenience compose file is included:
docker compose -f compose.dev.yaml up -dThen enable SoulSeek in your .env:
SOULSEEK_ENABLED=true
SLSKD_BASE_URL=http://127.0.0.1:5030All configuration is done via environment variables. See .env.example for the full list. Here are the highlights:
| Variable | Description | Default |
|---|---|---|
MUSIC_ROOT |
Where tagged downloads are saved | ./music |
DEFAULT_QUALITY |
Preferred audio quality | LOSSLESS |
DOWNLOAD_LYRICS |
Auto-fetch lyrics from LRCLib | false |
DOWNLOAD_MAX_PARALLEL_TRACKS |
Concurrent track downloads (1–16) | 1 |
TIDAL_ENABLED |
Enable Tidal provider | true |
DEEZER_ENABLED |
Enable Deezer provider | true |
MUSICBRAINZ_ENABLED |
Enable MusicBrainz provider | true |
TIDAL_API_BASE_URL |
hifi-api URL | — |
SOULSEEK_ENABLED |
Enable SoulSeek via slskd | false |
yoink is built with Rust and React, Axum for the server and SQLite via SQLx for storage. The frontend is built with Tanstack Start and shadcn/ui for components.
Contributions are welcome! Whether it's a filing an issue, bug fix, new feature, or documentation improvement:
- Fork the repository
- Create a feature branch
- Use Conventional Commits for your commit messages
- Submit a pull request
