4.3 KiB
Quintodrome Desktop
A Tauri desktop wrapper that hosts Navidrome as its own web app.
On launch the app:
- Checks whether a Navidrome server is already listening on
127.0.0.1:4533(via its/pinghealth endpoint). If so, it reuses it as-is. - Otherwise it spawns the bundled
navidromebinary as a separate sidecar process, pointed at the OS app-data/music directories, and waits for it to become ready. - Loads the Navidrome UI in the content webview, below a thin toolbar with back/forward/reload buttons and an address bar.
- On exit, sends
SIGTERMto the spawned server so it shuts down gracefully (falls back to a hard kill after 3s).
On a fresh install (no existing Navidrome data) the app also auto-creates
the initial admin user (admin / admin) behind the scenes, so you skip
Navidrome's "create an admin user" first-run screen. Change the password in
Navidrome settings afterwards; override it via QUINTODROME_ADMIN_PASSWORD.
How to launch
From the repo root:
# 0. one-time: make sure Node >= 24 is active (already pinned in .nvmrc)
nodenv local 24.15.0 # or `nvm use` / ensure `node --version` is v24+
# 1. build the Navidrome server + stage it as the sidecar
./desktop/scripts/build.sh --skip-tauri
# 2. launch the app
cd desktop/src-tauri && cargo run
A window opens on the splash screen, the app starts Navidrome (or reuses a running one), then loads the UI. Navidrome is reachable at http://127.0.0.1:4533 for the first-run admin setup.
To build a standalone .app instead:
./desktop/scripts/build.sh
# → desktop/src-tauri/target/release/bundle/macos/Quintodrome.app
Layout
desktop/
├── src/ # toolbar.html (nav bar) + index.html (loading splash)
├── src-tauri/
│ ├── src/ # Rust: sidecar spawn, health-check, lifecycle, toolbar
│ ├── binaries/ # navidrome-<target-triple> sidecar (built, not committed)
│ ├── icons/ # App icons
│ ├── tauri.conf.json
│ └── Cargo.toml
└── scripts/
├── build.sh # Build navidrome + stage sidecar + tauri build
└── gen_icon.go # Regenerates the source icon (optional)
Prerequisites
- Rust (stable) with the
aarch64-apple-darwin/x86_64-apple-darwin(or matching host) target. - Node.js >= 24 (the repo already pins this in
.nvmrc; vianodenvyou can runnodenv local 24.15.0). - Go >= 1.26 (for building the Navidrome binary).
Build
./desktop/scripts/build.sh
This builds the Navidrome server (make build), stages it under
src-tauri/binaries/navidrome-<target-triple> (with the executable bit set),
then runs npx tauri build. The packaged app lands in
desktop/src-tauri/target/release/bundle/.
To build the sidecar without running the full Tauri bundle:
./desktop/scripts/build.sh --skip-tauri
Run (development)
# 1. build + stage the sidecar binary
./desktop/scripts/build.sh --skip-tauri
# 2. run the app
cd desktop/src-tauri && cargo run
The Rust build.rs copies the staged sidecar next to the dev binary
(target/debug/navidrome) automatically, so plain cargo run works — no
tauri dev CLI needed.
Configuration
Environment variables override the defaults:
| Variable | Default | Purpose |
|---|---|---|
QUINTODROME_HOST |
127.0.0.1 |
Address the webview connects to |
QUINTODROME_PORT |
4533 |
Port for the Navidrome server |
QUINTODROME_MUSIC_FOLDER |
OS music dir (e.g. ~/Music) |
Where your music lives |
QUINTODROME_ADMIN_PASSWORD |
admin |
Password for the auto-created admin user (fresh installs only) |
QUINTODROME_PUBLIC_URL |
http://quintodrome |
Friendly origin shown in the address bar |
The data folder (DB, cache) is always the OS app-data directory
(e.g. ~/Library/Application Support/com.quintodrome.desktop on macOS).
Note: if a Navidrome server is already running on the configured host/port, the app simply loads it and does not start a second instance.