Orchestra
A desktop application for synchronizing music libraries between drives — NAS, DAP (digital audio player), laptop, or any mounted volume. Built with Tauri v2, Svelte 5, and Rust.
Features
Library
- Library Browser — Scan any directory and browse by Artist, Album, Genre, or Folder with full metadata (title, duration, format, size)
- Contextual Search — Search filters contextually based on the active view mode, matching at the top-level grouping while preserving the tree structure
- Browse / Manage Tabs — Browse tab for searching and playback, Manage tab for library maintenance (rescan, duplicates, metadata report, statistics)
- Duplicate Detection — Scan for duplicate tracks by content hash and review/remove them
- Metadata Report — Flag tracks missing key metadata fields (title, artist, album, album art)
- Metadata Editor — View and edit track metadata individually or in bulk for an album, writing changes back to audio files
- Library Statistics — Dashboard showing format breakdown, genre distribution, total size, artist/album/track counts, and average bitrate
- Rescan — Re-scan a loaded library to pick up new, changed, or deleted files incrementally
Playback
- Music Playback — Play individual tracks or full albums directly from the library
- Playlists — Create, manage, and reorder playlists with export to M3U/PLS formats
- Play Queue — View the current play queue, skip ahead, and reorder or remove upcoming tracks
- Visualizations — Real-time audio visualizations (waveform, frequency spectrum, radial) via Web Audio API
- Equalizer — 10-band graphic EQ with presets (flat, bass boost, vocal, etc.) and manual per-band adjustment
Sync
- Sync Profiles — Create named profiles linking a source and target directory, with configurable sync mode and exclude patterns
- One-Way Sync — Mirror source to target: adds, updates, and removals
- Two-Way Sync — Bidirectional sync with baseline-based three-way comparison to detect which side changed
- Sync by Album — Select individual albums to sync, not just entire artists
- Conflict Resolution — When both sides changed, choose per-file: keep source, keep target, keep both, or skip
- Live Progress — Real-time file-by-file progress with expandable detail panel and cancellation support
- Safe Writes — Copy-then-rename pattern prevents partial files on crash or cancel
- Eject Device — Safely unmount a connected device directly from the app
- Exclude Patterns — Glob-based filtering to skip files (e.g.,
*.tmp, .DS_Store)
UI
- Light / Dark Mode — Light and dark themes with system appearance detection and manual override
- Global Status Bar — Expandable progress bar showing current file, files completed/total, bytes transferred, and elapsed time
FLAC, MP3, AAC/M4A, WAV, ALAC, OGG, OPUS, WMA
Prerequisites
Getting Started
# Install dependencies
npm install
# Run in development mode (frontend HMR + Rust backend)
npm run tauri dev
# Build for production
npm run tauri build
Running Tests
# Rust unit tests (from project root)
cd src-tauri && cargo test
How Two-Way Sync Works
After each successful sync, the app snapshots the state (content hash, modification time, size) of every file on both sides. On the next sync, it performs a three-way comparison:
| Source |
Target |
Baseline |
Result |
| unchanged |
unchanged |
exists |
No action |
| changed |
unchanged |
exists |
Copy source to target |
| unchanged |
changed |
exists |
Copy target to source |
| changed |
changed (same hash) |
exists |
No action (convergent edit) |
| changed |
changed (different) |
exists |
Conflict |
| deleted |
unchanged |
exists |
Propagate delete |
| deleted |
changed |
exists |
Conflict |
| exists |
missing |
missing |
Copy to target (first sync) |
| missing |
exists |
missing |
Copy to source (first sync) |
| exists |
exists (different) |
missing |
Conflict (first sync) |
Tech Stack
- Backend: Rust with Tauri v2, rusqlite (bundled SQLite), lofty (metadata), blake3 (hashing), walkdir
- Frontend: Svelte 5, TypeScript, Vite
- IPC: Tauri commands with Channel-based progress streaming
License
MIT