Skip to content
kushiemoon-devPublic

About

Desktop app for downloading lossless FLAC music, multi-source with Soulseek P2P backbone. Built with Go + Svelte using Wails framework. Features metadata tagging and concurrent download queue.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

115 stars

Watchers

2 watching

Forks

Repository files navigation

FLACidal

Multi-source lossless FLAC downloader with a Soulseek P2P backbone

Website GitHub Release Stars License Go

Windows macOS Linux


Overview

FLACidal is a desktop app that grabs lossless FLAC files with full metadata and embedded cover art attached. It tries Tidal, Qobuz, Amazon Music, Bandcamp, and Soulseek P2P in sequence, automatically moving to the next source until one succeeds.

Note: Tidal, Qobuz, and Amazon have all tightened their APIs against third-party access. The community proxy pools FLACidal relies on to reach them go offline regularly, occasionally for days at a stretch. Soulseek is currently the source you can count on: it needs no proxy pool at all and takes about 5 minutes to set up. Tidal is tried first and Soulseek last by default (see source order below); to give Soulseek priority over the proxy-dependent sources instead, move it to the top under Settings -> General -> Source Mode.


Quick Start

1. Download FLACidal for your platform

2. Optionally set up Soulseek as a last resort that needs no proxy pool

3. Paste a URL or run a search, then hit download

Home tab  ->  paste a Tidal or Qobuz URL  ->  Fetch  ->  Download All FLAC
Search tab  ->  search by track / album / artist  ->  Download

Anytime, check Settings -> Status to see which sources are online.


How It Works

Download chain

FLACidal works through sources one at a time, in order, until one succeeds:

Priority Source Quality Notes
1 Tidal FLAC / Hi-Res (24-bit) Through the community proxy pool
2 Qobuz FLAC / Hi-Res (24-bit) Through the community proxy pool (optional)
3 Amazon Music FLAC / UHD Through the community proxy pool
4 Bandcamp FLAC Direct
5 Soulseek P2P FLAC Built-in client (needs a free account, or leave the fields empty for a throwaway one)

Sources can be reordered under Settings -> General -> Source Mode, and whatever order is set gets followed top to bottom with no exceptions. Soulseek is last by default; an order you choose is kept as is, Soulseek first included.

Community extensions add more download sources and metadata providers. Manage them under Settings -> General -> Extensions (or /api/extensions/* on the headless server): an extension is installed disabled, you review its permissions before enabling it, and an enabled download extension is tried right before Soulseek unless you drag it elsewhere in the order.

Two things called "proxy": they are different

The community proxy pool is relay infrastructure FLACidal maintains for Tidal, Qobuz, and Amazon. It comes built in, needs no setup, and if these servers go down, those sources stop working along with them.

Separately, an outbound proxy (HTTP / SOCKS5) routes FLACidal's own traffic through a network proxy you control: a corporate VPN, a SOCKS5 tunnel, whatever you already run. Most people can skip this entirely; when needed, it's configured under Settings -> General -> HTTP / SOCKS5 Proxy.

Self-hosted / private endpoints

Every FLACidal user shares the community proxy pool, and that's exactly why it struggles: rate limits and cooldowns land on everyone at once. Run your own Tidal HiFi API or Qobuz proxy instance and point FLACidal at it, and it gets tried before the community pool, with no shared rate-limit queue and no dependence on pool uptime.

Set this up under Settings -> General:

  • tidalPriorityEndpoints: one or more self-hosted Tidal HiFi API URLs, tried in order ahead of the public pool
  • qobuzPriorityEndpoints: one or more self-hosted Qobuz proxy URLs, tried in order ahead of the public pool
  • amazonPriorityEndpoints: one or more self-hosted Amazon proxy URLs, tried in order ahead of the public pool

Tidal and Qobuz also keep their old single-URL fields (tidalCustomEndpoint, qobuzCustomEndpoint) for backward compatibility. For new setups, though, the priority-list fields are the better pick, since they allow more than one fallback instance.

Leave these blank to stick with the default community pool.

Source availability: what to expect

Major streaming platforms actively push back against unofficial API access, so expect the following:

  • Proxy pools may drop offline with no warning
  • Downloads can quietly fall through to Soulseek as a last resort
  • Soulseek does not depend on the proxy pools, which is why it is the last resort by default

You can check endpoint health live at any time under Settings -> Status.


Features

  • Multi-Source Fallback: cascades automatically across Tidal, Qobuz, Amazon, Bandcamp, and Soulseek
  • Soulseek P2P stays unaffected by streaming-proxy uptime; it is tried last by default and can be moved up in Source Mode
  • Smart Dedup checks every source plus an optional external library path (a Navidrome/Jellyfin library, say) and skips anything already on disk, matched by ISRC
  • Jellyfin Integration: triggers a library scan automatically once a download batch finishes
  • Streaming sources deliver Hi-Res and Lossless quality: 24-bit up to 192 kHz for Hi-Res, 16-bit / 44.1 kHz for Lossless
  • Full Tidal and Qobuz coverage: playlists, albums, tracks, mixes, and artist pages
  • Built-in Search across Tidal (Tracks / Albums / Artists) or Deezer via the Universel tab, which keeps working even when Tidal is down
  • Up to 10 Concurrent Downloads in parallel, with live queue progress
  • Smart Metadata handling: Vorbis comment tags, embedded cover art, and lyrics
  • ReplayGain tagging toggle in Settings
  • An Audio Tools Suite covering Quality Analyzer, Resampler, FFmpeg-powered Converter, and File Manager
  • Custom Filename Templates, so you set your own naming format, e.g. {artist} - {title}
  • Artist Artwork pulled in alongside the music
  • A Source Status Panel showing live endpoint health under Settings -> Status
  • Outbound Proxy Support for every outbound request, HTTP or SOCKS5
  • A Multilingual Interface in English, French and German, switchable under Settings -> Language (System follows your OS language)

Download

Download Latest Release

Platform File
Windows x64 flacidal_windows_amd64.exe
macOS Universal flacidal.dmg
Linux x64 flacidal_linux_amd64.AppImage
Android FLACidal.apk
iOS FLACidal.ipa (via AltStore)

Linux: The AppImage bundles its own WebKit and GTK, so you do not need webkit2gtk installed, and it needs glibc 2.35 or newer (Ubuntu 22.04, Debian 12, Fedora 36 or later). No AUR package exists yet. Grab the AppImage directly, or build from source.

An Android and iOS build exists too: FLACidal Mobile

Find every release on GitHub


Setting up Soulseek

Right now, Soulseek is FLACidal's most dependable source, and getting it running takes about 5 minutes.

Step 1: Get a Soulseek account

  • Already using Nicotine+? Use your existing username and password; FLACidal shares the same account system.
  • New user: Sign up for a free account at slsknet.org (no email needed) or through the Nicotine+ app.

FLACidal downloads without sharing files.

Step 2: Connect your account

  1. Open FLACidal -> Settings -> General
  2. Scroll to Soulseek (Fallback P2P)
  3. Switch Enable Soulseek on
  4. Fill in your username and password, or leave both empty to use a throwaway account created automatically
  5. Click Login; FLACidal checks the connection live and reports success or an error
  6. Click Save Changes
Settings, General tab showing Soulseek configuration

Step 3: Verify in Settings -> Status

Head to Settings -> Status. The Soulseek row shows "not tested" until a login or download succeeds, then turns green. If any proxy pool endpoints turn red, Soulseek automatically picks up the slack.

Settings, Status tab showing endpoint health

Usage

Home: download by URL

FLACidal Home tab
  1. Paste a URL into the field and hit Fetch
  2. FLACidal pulls the track list and shows it on screen
  3. Click Download All FLAC to add the tracks to the Queue
  4. URLs you've fetched before show up as cards under the input, ready for a quick re-download

Supported URL types:

Service Types
Tidal Playlist · Album · Track · Mix · Artist
Qobuz Album · Playlist · Track
Spotify Track · Album · Playlist (metadata only, routed to Tidal/Qobuz/Amazon/Soulseek for the actual FLAC)
Deezer Track · Album · Playlist

Other services (Apple Music, YouTube Music, Deezer short links, ...): FLACidal can't parse these directly. Instead it resolves them automatically through Odesli/song.link into an equivalent Tidal or Deezer URL before fetching, so pasting the link is all that's needed.

Search: find music without leaving the app

FLACidal Search tab

Open the Search tab, where four sub-tabs live:

Tab What it searches Works when Tidal is down?
Tracks Tidal track catalog No
Albums Tidal album catalog No
Artists Tidal artist pages No
Universel Deezer public catalog (by ISRC) Yes

Universel runs on Deezer's public API, so it keeps working regardless of Tidal proxy health. Reach for it whenever a Tidal search turns up empty.

Queue: monitor and control downloads

FLACidal Queue tab

The Queue tab lists every active and pending download:

  • A live progress bar per track
  • Pause / Resume for the whole queue at once
  • Retry a single failed download, or retry every failure in one go
  • An export option for the list of failed downloads

History and Files

History logs every download and URL fetch. Click any past entry to re-fetch it instantly.

Files shows every FLAC file in your download folder, with a button to open the folder in your system's file manager.

Audio Tools

Reach the Tools panel through the grid icon in the sidebar:

Tool What it does
Quality Analyzer Examines actual frequency content to confirm true lossless status, reports BPM/musical key, and can retag from Deezer (album/tracknumber/discnumber/year/genre/cover)
Resampler Adjusts sample rate (192 kHz down to 44.1 kHz, for instance)
Converter Transcodes to other formats (MP3, AAC, OGG, Opus, Vorbis, ALAC, WAV, AIFF) through FFmpeg
File Manager Batch-renames files based on metadata templates
Lyrics Manager Batch-fetches and embeds lyrics into FLAC files via LRCLIB

Converter, Resampler, and the Quality Analyzer's lossless check all need FFmpeg. Get it through your system's package manager, or use the in-app installer under Settings -> Status.

The Quality Analyzer's BPM/key detection needs aubio and keyfinder-cli on PATH, and both are optional (on Arch, for example: pacman -S aubio libkeyfinder, then yay -S keyfinder-cli for the AUR package). Skip them and BPM/key show blank, while the rest of the analysis still runs.


Output Structure

~/Music/
└── Playlist Name/
    ├── Artist - Track One.flac
    ├── Artist - Track Two.flac
    └── cover.jpg

Both the download folder and the filename template can be fully customized under Settings -> File Management.


Configuration

Settings live at ~/.flacidal/config.json and can be edited from within the app via the Settings panel. The Open Config Folder button in Settings jumps straight to that directory.

Setting Default Options
Quality Lossless Hi-Res (24-bit/48kHz+) · Lossless (16-bit/44.1kHz) · High (320kbps, lossy) · Atmos (lossy, .m4a, Tidal only)
File naming {artist} - {title} Custom template with metadata variables
Embed cover art true true · false
Concurrent downloads 4 1 – 10
Outbound proxy (none) http://host:port or socks5://host:port
Language System System · English · Français · Deutsch
Date format full full (YYYY-MM-DD) · year (YYYY), for the DATE tag of FLAC and MP3 files. ORIGINALDATE always keeps the full date

The config file sits at ~/.flacidal/config.json.

The log file is next to the config, at ~/.flacidal/flacidal.log, and Settings shows its path. It rotates at 5 MB and keeps two backups (flacidal.log.1 and flacidal.log.2). Credentials in URLs, bearer tokens and values written as password=, token=, secret= or api_key= are masked, but a secret separated from its keyword by a plain space is not, so skim it before attaching it to a bug report.


Build from Source

Requirements: Go 1.26+ and Wails v2

go install github.com/wailsapp/wails/v2/cmd/wails@latest
git clone https://github.com/kushiemoon-dev/FLACidal.git
cd FLACidal
wails build
# Binary: build/bin/flacidal

For hot-reload development mode:

wails dev

Headless / Run in browser

FLACidal can also run as a plain HTTP server, with no Wails and no desktop shell, controllable from any browser on the machine or the LAN. That fits a NAS, a home server, or anywhere a desktop UI doesn't make sense.

Docker

The image bundles the server, the built frontend, ffmpeg, and aubio (BPM), so nothing extra needs installing. keyfinder-cli (musical key) isn't bundled yet, since there's no Debian package for it and it needs a source build, so key detection stays empty in Docker for now.

curl -O https://raw.githubusercontent.com/kushiemoon-dev/FLACidal/main/docker-compose.yml
export FLACIDAL_AUTH_TOKEN=$(openssl rand -hex 32)   # or put it in a .env file next to docker-compose.yml
docker compose up -d

The container listens on all interfaces, so the token is mandatory: docker compose refuses to start without FLACIDAL_AUTH_TOKEN. Keep any .env file out of version control.

Then open http://localhost:8080; the browser asks for the token on first access and keeps it in its localStorage. Downloads go to ./music/FLACidal, while config and the database persist across restarts in the flacidal-config volume. Port and volume layout details are in docker-compose.yml.

From source

git clone https://github.com/kushiemoon-dev/FLACidal.git
cd FLACidal
cd frontend && npm install && npm run build && cd ..
go run ./cmd/server
# or: make serve

Then open http://localhost:8080.

The server reads from the same ~/.flacidal/config.json as the desktop app. It's controlled by five optional environment variables:

Variable Default Purpose
PORT 8080 HTTP port the server listens on
LISTEN_HOST 127.0.0.1 Address the server binds to
AUTH_TOKEN empty Access token for /api and /ws; required when LISTEN_HOST is not a loopback address
CORS_ORIGINS empty Comma-separated list of origins allowed to call the API from another site (* is refused)
FRONTEND_DIST_DIR frontend/dist Where to find the built SPA on disk

Access control. By default the server only listens on 127.0.0.1. With no AUTH_TOKEN on a loopback address, authentication is off, a warning is logged, and requests whose Host header is not localhost, 127.0.0.1 or ::1 are refused. Binding any other address without a token makes the server refuse to start (refusing to listen on <host> without authentication: set AUTH_TOKEN ...). When a token is set, send it as Authorization: Bearer <token> (WebSocket clients may use ?token= instead). GET /api/health and the web app itself stay public. The token is never stored in config.json or returned by GET /api/config.

File confinement. In headless mode, file routes (delete, rename, convert, lyrics, analyzer by path) only accept paths under the download folder and the externalLibraryPaths entries. Symlinks that lead outside are refused.

Note that GET /api/config still returns the Qobuz and Soulseek credentials to any authenticated client.

Running go run ./cmd/server before the frontend is built works fine: the server still comes up and the API works on its own, though requests to / return a 503 nudging you to run npm run build first.


FAQ

Is a Tidal or Qobuz account required? Not for the streaming sources: FLACidal handles authentication itself through the community proxy pools. Soulseek is a different story though: Soulseek P2P needs an account, and given how the proxies have been behaving lately, setting one up for free is well worth it.

Everything fails or times out; nothing downloads. What now? Check Settings -> Status first. Red proxy pool endpoints mean the streaming sources are down right now, which happens and is usually temporary. Make sure Soulseek is set up too (see Setting up Soulseek); it doesn't depend on proxy pool health at all.

What quality can I actually expect? Tidal gives Hi-Res (24-bit, up to 192 kHz) or Lossless (16-bit, 44.1 kHz). Qobuz goes up to 24-bit depending on what's available for a given album. Soulseek is entirely dependent on what other users are sharing, though FLACidal specifically searches for FLAC there.

Why is my antivirus flagging the binary? That's a false positive. Heuristic scanners flag Go binaries for no real reason sometimes. Build from source instead if it bothers you.

What does the outbound proxy setting do, and do I need it? It routes FLACidal's traffic through a personal proxy of your choosing: a corporate VPN, a SOCKS5 tunnel, whatever you already run. Most people can skip it entirely, and it has nothing to do with the community proxy pool that Tidal and Amazon rely on.

Does Arch Linux get an AUR package? Not yet. A flacidal-bin PKGBUILD exists in the repo (packaging/aur/) but isn't published to aur.archlinux.org. Grab the AppImage directly, or build from source for now.


Star History

Star History


Disclaimer

FLACidal exists strictly for educational and personal use. It has no affiliation with, endorsement from, or connection to Tidal, Qobuz, or any other streaming service. Making sure your use stays within local law and each platform's Terms of Service is entirely on you. The software comes "as is," with no warranty of any kind.


MIT License · Releases · Mobile App · YouFLAC · OpenDrop-VJ

Built with love by KushieMoon

About

Desktop app for downloading lossless FLAC music, multi-source with Soulseek P2P backbone. Built with Go + Svelte using Wails framework. Features metadata tagging and concurrent download queue.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

115 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages