Muffle is a fast, expressive Spotify desktop client built with Svelte and Sabine. It talks to Spotify directly from its Rust host and plays audio through an embedded librespot engine, so there is no Electron process, browser token storage, Web Playback SDK, or sidecar executable.
- Home recommendations, mixes, recently played music, releases, artists, podcasts, and personal playlists
- Search across tracks, artists, albums, playlists, shows, and episodes
- A streaming playlist sidebar and paged playlist tracks that stay responsive with large libraries
- Artist, album, show, playlist, and Liked Songs pages
- Local high-quality playback with gapless playback, autoplay, normalisation, repeat, shuffle, queue control, audio caching, and Spotify Connect device transfer
- Native OAuth with PKCE, system media controls on Linux, single-instance handling, tray behaviour, and native playlist cover selection
- Keyboard media controls and shortcuts for search, volume, seeking, shuffle, repeat, lyrics, queue, home, and settings
Requirements:
- Bun 1.3 or newer
- Rust 1.95 or newer
- The platform prerequisites listed by Sabine
- A Spotify Premium account for local playback
Install and check the project:
bun install
bun run check
cargo check --manifest-path desktop/Cargo.tomlRun the desktop development workflow:
bun run desktopBuild the web bundle or native installers:
bun run build
bun run bundleMuffle uses two native PKCE grants. The Web API grant provides the library, recommendations, search, and remote-control surfaces. The playback grant authorizes the embedded Connect player. Tokens and reusable playback credentials remain in the operating system's per-user application directories.
The shared Web API application works by default. To use your own Spotify application, add this redirect URI in the Spotify developer dashboard and enter its client ID in Muffle's settings:
http://127.0.0.1:8989/login
Local playback uses:
http://127.0.0.1:8898/login
Spotify requires an explicit loopback IP for desktop callback URLs. No client secret is used or stored.
desktop/ Rust host, OAuth, Spotify transport, playback, MPRIS
src/lib/components/ Muffle's Svelte interface
src/lib/stores/spotify/ UI state and Spotify feature models
src/lib/native.ts Typed Sabine bridge
Sabine.toml Desktop and bundling configuration
Tagged releases are built by the Sabine release workflow for the supported desktop platforms.
Third-party attribution is recorded in THIRD_PARTY_NOTICES.md.
