An open API service indexing awesome lists of open source software.

https://github.com/instazdll/waveflow

๐ŸŒŠ WaveFlow โ€” Spotify-style desktop music player for your local library. Lock-free Rust audio (FLAC/MP3/DSD up to DSD1024), 6-band EQ, ReplayGain, gapless, crossfade, synced lyrics (LRCLIB), Last.fm scrobbling, DLNA server.
https://github.com/instazdll/waveflow

audio-player desktop-app dlna dsd equalizer flac hi-res-audio lastfm local-music lrclib lyrics music-player react replaygain rust scrobbling spotify-clone tauri tauri-app typescript

Last synced: 27 days ago
JSON representation

๐ŸŒŠ WaveFlow โ€” Spotify-style desktop music player for your local library. Lock-free Rust audio (FLAC/MP3/DSD up to DSD1024), 6-band EQ, ReplayGain, gapless, crossfade, synced lyrics (LRCLIB), Last.fm scrobbling, DLNA server.

Awesome Lists containing this project

README

          


WaveFlow logo

WaveFlow


Local music player for desktop โ€” built with Tauri 2, React 19 & Rust


Version
Downloads
Tauri 2
React 19
Rust
License
Platform

---

WaveFlow is a local music player desktop app with a Spotify-inspired 3-panel UI. It scans your local audio folders, organizes tracks by album/artist/genre, and plays them with a real-time audio engine โ€” no streaming, no cloud, your music stays on your machine.

## Download

Pre-built bundles for every tagged release are on the [GitHub Releases page](https://github.com/InstaZDLL/WaveFlow/releases/latest). Pick the one that matches your environment:

### Linux

**Recommended โ€” use your distro's package manager** so updates flow through the same tool you already use for the rest of your system:

- **Arch / Manjaro / EndeavourOS** โ€” install [`waveflow-bin`](https://aur.archlinux.org/packages/waveflow-bin) from the AUR:
```bash
yay -S waveflow-bin # or paru, etc.
```
- **Fedora / RHEL / Rocky / Alma / CentOS Stream** โ€” enable the [InstaZDLL/waveflow COPR](https://copr.fedorainfracloud.org/coprs/instazdll/waveflow/) once, then install via `dnf`:
```bash
sudo dnf copr enable instazdll/waveflow
sudo dnf install waveflow
```
- **Debian / Ubuntu / Mint / Pop!\_OS** โ€” add the apt repo once, then install via `apt`. Note the package name is `wave-flow` (kebab-case, required by Debian naming rules โ€” Tauri bundles it that way from the `WaveFlow` product name):
```bash
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://packages.buildkite.com/instazdll/waveflow/gpgkey \
| sudo gpg --dearmor -o /etc/apt/keyrings/waveflow.gpg
echo "deb [signed-by=/etc/apt/keyrings/waveflow.gpg] https://packages.buildkite.com/instazdll/waveflow/any/ any main" \
| sudo tee /etc/apt/sources.list.d/waveflow.list
sudo apt update && sudo apt install wave-flow
```

Standalone bundles (for everything else, or if you'd rather skip a repo):

- `WaveFlow__linux-x86_64.deb` โ€” Debian / Ubuntu / Mint / Pop!\_OS. Native install via `apt`/`dpkg`, integrates with the system menu.
- `WaveFlow__linux-x86_64.rpm` โ€” Fedora / RHEL / openSUSE / Rocky / Alma. Native install via `dnf`/`rpm`.
- `WaveFlow__linux-x86_64.AppImage` โ€” Anything else (Calculate Linux, Oracle Linux, NixOS, โ€ฆ). `chmod +x` then run; no install required.

### Windows

- **One-liner via [winget](https://github.com/microsoft/winget-cli)** โ€” `winget install InstaZDLL.WaveFlow`. Auto-tracks updates with `winget upgrade`.
- `WaveFlow__windows-x86_64-setup.exe` โ€” NSIS installer, **per-user** install under `%LOCALAPPDATA%`, doesn't need admin. This is what the in-app updater patches.
- `WaveFlow__windows-x86_64.msi` โ€” MSI installer, **system-wide** install under `Program Files`, suitable for IT deployment via GPO/SCCM. Requires admin.

Both are Authenticode-signed. SmartScreen may still warn the first few users while a fresh certificate accumulates reputation โ€” click **More info โ†’ Run anyway**.

### macOS

- `WaveFlow__macos-universal.dmg` โ€” Intel + Apple Silicon in one bundle.

The macOS build is **not Apple-Developer-signed yet**, so Gatekeeper will block the first launch:

- macOS 14 (Sonoma) and earlier: **right-click the app โ†’ Open**, confirm the dialog.
- macOS 15 (Sequoia) and later: launch normally, then go to **System Settings โ†’ Privacy & Security** and click **Open Anyway** next to the blocked app.
- Terminal escape hatch (any version): `xattr -cr /Applications/WaveFlow.app`

### Auto-updates

Once installed (any of the above), the in-app updater fetches future versions automatically โ€” but only the AppImage and the NSIS setup are auto-updatable. DEB / RPM / MSI are managed by their respective package managers and stay on the version you installed until you upgrade them externally.

## Features

| Area | Highlights | Deep dive |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- |
| **Playback** | Symphonia + cpal, lock-free 3-thread engine, real dual-decoder crossfade, ReplayGain, variable playback speed (0.5ร—โ€“2ร—), output-device picker, OS media controls (SMTC / MPRIS / MediaRemote), persistent queue with shuffle / repeat / auto-advance | [docs](docs/features/playback.md) |
| **Library** | Folder scanning + filesystem watcher, on-demand audio analysis (peak, loudness, ReplayGain, BPM), Hi-Res badges, multi-artist split, POPM 5-star ratings, A-Z navigator, multi-select action bar | [docs](docs/features/library.md) |
| **Playlists** | Drag-and-drop reorder (virtualised), bulk add from any source, M3U import / export with basename-fallback matching, likes, recently-played | [docs](docs/features/playlists.md) |
| **Smart playlists** | Auto-generated **Daily Mix** family bucketed by tempo, with composite artist-photo covers rendered from your Deezer cache | [docs](docs/features/smart-playlists.md) |
| **Integrations** | Deezer (artwork + labels), Last.fm (bios + scrobbling with retry queue), LRCLIB (synchronised lyrics), Discord Rich Presence ("Listening to WaveFlow" with cover + progress bar) โ€” all cached locally for offline use | [docs](docs/features/integrations.md) |
| **UI & UX** | Spotify-style 3-panel layout, system tray, statistics dashboard with JSON export, **WaveFlow Wrapped** year-in-review (story-style overlay), virtual scroll for 6000+ tracks, dark mode (View Transitions API), 17 locales (RTL-aware), per-profile isolated DB with scheduled auto-backup, signed auto-updater | [docs](docs/features/ui.md) |

## Tech Stack

| Layer | Technologies |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| **Desktop shell** | Tauri 2.10 (tray icon, opener, dialog, updater plugins) |
| **OS media controls** | souvlaki 0.8 (SMTC / MPRIS / MediaRemote bridge) |
| **Discord Rich Presence** | discord-rich-presence 1.1 (local IPC named pipe, no auth) |
| **Frontend** | React 19, TypeScript, Vite 8, Tailwind CSS 4, Lucide icons, `@dnd-kit` (drag-and-drop), `@tanstack/react-virtual` (virtualization) |
| **Backend** | Rust, SQLite (sqlx), FTS5 contentless full-text search |
| **Audio** | symphonia 0.5 (decode), cpal 0.17 (output), rubato 2.0 (resample), rtrb 0.3 (SPSC ring) |
| **Metadata extraction** | lofty 0.24 (tags, embedded art, POPM, INITIALKEY) |
| **Imaging** | image 0.25 + fast_image_resize 6 (SIMD thumbnails) |
| **Filesystem watcher** | notify 8 (debounced rescans of watched folders) |
| **External APIs** | Deezer public API (no auth) + Last.fm (read + signed methods via md-5 + reqwest 0.12 with rustls) + LRCLIB (synchronized lyrics) |
| **Package manager** | Bun |

## Getting Started

```bash
# Install dependencies
bun install

# Run the desktop app in development mode
bun run tauri dev

# Build for production
bun run tauri build
```

## Development Commands

```bash
bun run dev # Vite dev server only (no Tauri shell)
bun run typecheck # TypeScript check
bun run lint # ESLint
bun run lint:fix # ESLint with auto-fix
bun run format # Prettier

# Rust backend
cargo check --manifest-path src-tauri/Cargo.toml --all-targets
cargo test --manifest-path src-tauri/Cargo.toml
```

## Documentation

Per-feature deep dives, architecture and storage layout live under [`docs/`](docs/README.md):

- **Features** โ€” [playback](docs/features/playback.md) ยท [library](docs/features/library.md) ยท [playlists](docs/features/playlists.md) ยท [smart playlists](docs/features/smart-playlists.md) ยท [integrations](docs/features/integrations.md) ยท [UI & UX](docs/features/ui.md)
- **Architecture** โ€” [audio engine](docs/architecture/audio.md) ยท [database & paths](docs/architecture/storage.md)
- **Contributing** โ€” [CONTRIBUTING.md](CONTRIBUTING.md) ยท [RELEASING.md](RELEASING.md)

## License

```
Copyright (C) 2026 InstaZDLL

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see .
```

See [LICENSE](LICENSE) for the full text.