Desktop-first music library orchestrator — Import, compare, download, and organize your music from multiple streaming services.
- 🎵 Multi-Service Import — Spotify, Qobuz, Tidal, Deezer, SoundCloud
- 🔄 Smart Matching — ISRC-based track matching across services
- ⬇️ Quality Downloads — Hi-res FLAC from Qobuz/Tidal, MP3/AAC fallback
- 📝 Synced Lyrics — Apple Music word-sync, line-sync fallback
- 🏷️ Metadata Enrichment — MusicBrainz, Last.fm, Spotify
- 🔍 Audio Fingerprinting — AcoustID identification & duplicate detection
- 📁 Auto-Organization — Artist/Album folder structure
- 🎚️ Format Conversion — FLAC → MP3/AAC/OGG via FFmpeg
- Rust 1.70+ with
cargo - Node.js 18+ with
npm - Python 3.10+ with
pip
# Clone the repository
git clone https://github.com/yourname/syncify.git
cd syncify
# Install Python dependencies
python -m venv .venv
.venv\Scripts\activate # Windows
# source .venv/bin/activate # Linux/Mac
pip install -r requirements.txt
# Install frontend dependencies
cd ui
npm install
cd ..
# Copy environment template
copy .env.example .env # Windows
# cp .env.example .env # Linux/MacEdit .env with your API credentials:
# Spotify (required for Spotify import)
SPOTIFY_CLIENT_ID=your_client_id
SPOTIFY_CLIENT_SECRET=your_client_secret
SPOTIFY_REDIRECT_URI=http://127.0.0.1:8888/callback
# Qobuz (required for Qobuz downloads)
QOBUZ_APP_ID=your_app_id
QOBUZ_APP_SECRET=your_app_secret
# Tidal (OAuth - no credentials needed)
# Deezer (browser login - no credentials needed)
# Optional: AcoustID for fingerprinting
ACOUSTID_API_KEY=your_key # Get free key at https://acoustid.org/api-key
# Optional: Last.fm for metadata
LASTFM_API_KEY=your_key# Development mode
cargo tauri dev
# Build for production
cargo tauri build┌─────────────────────────────────────────────────────────┐
│ Tauri Desktop App │
├─────────────────────────────────────────────────────────┤
│ Vue/React UI ←→ Tauri Commands (55+) ←→ SQLite DB │
├─────────────────────────────────────────────────────────┤
│ Python Bridges (9) │
│ auth │ lyrics │ download │ metadata │ fingerprint │
│ conversion │ scanner │ organizer │ playlist │
├─────────────────────────────────────────────────────────┤
│ External Tools (auto-downloaded) │
│ FFmpeg │ Chromaprint/fpcalc │
└─────────────────────────────────────────────────────────┘
- Click Add Service → Select Spotify/Qobuz/Tidal
- Complete OAuth authentication
- Library imports automatically to local database
- Select tracks in library view
- Click Download → Choose quality preference
- Background worker processes queue automatically
- Go to Playlists tab
- Select source service and playlist
- Export or match to another service
import { invoke } from '@tauri-apps/api/core';
import { listen } from '@tauri-apps/api/event';
// Library
const tracks = await invoke('get_library');
const stats = await invoke('get_library_stats');
// Queue Management
await invoke('add_to_queue', { trackId: 123, priority: 80 });
await invoke('add_batch_to_queue', { trackIds: [1, 2, 3] });
const queue = await invoke('get_queue');
const queueStats = await invoke('get_queue_stats');
// Worker Control
await invoke('pause_downloads');
await invoke('resume_downloads');
const status = await invoke('get_worker_status');
// Listen for progress
await listen('syncify:download_progress', (event) => {
console.log(event.payload); // {title, artist, status, progress_percent}
});syncify/
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── main.rs # App entry point
│ │ ├── commands/ # Tauri commands (14 files, 6800+ lines)
│ │ │ ├── mod.rs, types.rs, library.rs
│ │ │ ├── service.rs, auth.rs, download.rs
│ │ │ ├── queue.rs, accounts.rs, settings.rs
│ │ │ ├── tools.rs, dashboard.rs, migration.rs
│ │ │ └── handlers.rs, url_import.rs
│ │ ├── download/ # Rust-native downloaders
│ │ ├── worker.rs # Background download worker
│ │ └── db.rs # SQLite connection
│ └── Cargo.toml
├── ui/ # Frontend (Vue 3 + TypeScript)
├── scripts/ # Python bridges
│ ├── auth_bridge.py
│ ├── lyrics_bridge.py
│ ├── download_bridge.py
│ └── ...
├── migrations/ # SQLite schema
└── .env # API credentials
# Rust tests
cd src-tauri && cargo test
# Python bridge tests
python -m pytest tests/
# Health check
python scripts/health_check.py| Tool | Purpose | Installation |
|---|---|---|
| FFmpeg | Audio conversion | Auto-downloaded on first use |
| Chromaprint | Audio fingerprinting | Auto-downloaded on first use |
Or install manually:
# Windows (winget)
winget install Gyan.FFmpeg
winget install AcoustID.Chromaprint
# macOS (brew)
brew install ffmpeg chromaprintMIT License - See LICENSE