This project is in an alpha state!
A Subsonic API server that proxies Tidal.
Prerequisites: Docker with Compose support.
- Copy
docker-compose.ymlandsettings.toml - Run
docker compose up -d. - The first start prints a Tidal device-code URL. Open
docker compose logs -f subtidaland complete the login once. The session persists in thesubtidal-datavolume. - Point a Subsonic client at
http://localhost:8000and log in withadmin/admin.
The server reads ./settings.toml through the Compose mount. Edit the file and run docker compose restart, or map any other file:
- /path/to/your/settings.toml:/config/subtidal/settings.toml:roAdjust the log level with RUST_LOG=subtidal=debug docker compose up -d.
To run the published image directly:
docker run -d -p 8000:8000 \
-e APP_USERNAME=admin -e APP_PASSWORD=admin -e APP_PORT=8000 \
-v subtidal-data:/data \
ghcr.io/frostplexx/subtidal:latest
APP_* env vars are the settings for this path. The image stores the Tidal token at /data/tokens.json.
If no image is published yet, clone the repo and run docker compose up -d --build from it.
Prerequisites: a recent Rust nightly toolchain (edition 2024). The Nix flake provides one via rustup, pinned in rust-toolchain.toml: nix develop.
- Run
just devorcargo run. - Complete the device-code login on first start.
- Connect with
admin/adminfromsettings.toml.
Source layout:
src/
├── main.rs # startup, settings, login, server bind
├── settings.rs # settings file discovery + APP_* env overrides
├── navidrome/ # Subsonic protocol layer
│ ├── routes.rs # /rest/* routes
│ ├── auth.rs # credential checks, body cap, rate limiting
│ ├── params.rs # query param structs
│ ├── models/ # Subsonic DTOs
│ └── handlers/ # one module per endpoint group
└── tidal/
├── client/ # Tidal API calls
├── mapping/ # Tidal JSON -> Subsonic DTOs
└── embedded.rs # Tidal app credentials