A desktop music player you fill yourself. Paste a YouTube, SoundCloud or Spotify link, Vodka downloads the audio into a local library, and from there you play it, like it, queue it and sort it into playlists. No accounts, no streaming, just files on your disk.

? in the app).ffmpeg and ffprobe on your PATH)On Linux you also need GStreamer codecs for playback, and the app indicator library for the tray icon:
# Arch
sudo pacman -S webkit2gtk-4.1 libayatana-appindicator gst-plugins-good gst-libav ffmpeg cmake base-devel
# Debian / Ubuntu
sudo apt install libwebkit2gtk-4.1-dev libayatana-appindicator3-dev \
gstreamer1.0-plugins-good gstreamer1.0-libav ffmpeg cmake build-essential
git clone https://github.com/zOrpheas/vodka.git
cd vodka
npm install
npm run sidecars # downloads yt-dlp, copies ffmpeg/ffprobe, builds whisper-cli (a minute or two)
npm run sidecars uses a POSIX shell. On Windows, run it from Git Bash or WSL.
npm run tauri dev
The first run compiles the Rust side, which takes a few minutes. After that it starts in seconds.
sh scripts/install-linux.sh
This builds a release version and installs it for your user in ~/.local/share/vodka, with an entry in your app launcher. No root needed. Run it again to update, or remove it with sh scripts/install-linux.sh --uninstall (your library and music stay).
To build an installer package for your platform instead:
npm run tauri build
The output lands in src-tauri/target/release/bundle/.
···) to queue it, like it or add it to a playlist.Typing plain text in the bar searches your library instead.
Press LYRICS in the player bar (or Y). The current line lights up as the song plays and the view scrolls with it; click a line to jump to that moment. If you scroll to read ahead, it waits a few seconds before following the song again.
The first time a song with synced lyrics plays, Vodka matches the lyrics to your file: it transcribes the song on your computer (nothing is uploaded), finds where each line is sung, and re-times the lines. This takes around 10 to 30 seconds in the background, and the lyrics header shows matching to your file while it works and matched to your file when done. Lines from parts of the song your version doesn't have (a cut intro, a shorter outro) are left out. The very first time, Vodka downloads the 148 MB speech model it needs.
Vodka also keeps the lyrics in step with what you actually hear. Some systems play audio slightly later than the player reports, so Vodka measures that delay automatically each time a track starts and corrects for it. If the words still feel a touch early or late, fine-tune with EARLIER / LATER at the top of the lyrics. The adjustment is remembered. When no lyrics are found, SEARCH AGAIN looks again. LRCLIB grows every day.
| Action | Key |
|---|---|
| Play / pause | Space |
| Search or paste | Ctrl K (⌘K on macOS) |
| Next / previous track | Shift → / Shift ← |
| Seek 5 seconds | ← / → |
| Volume | ↑ / ↓ |
| Like the current track | L |
| Now playing panel | Q |
| Shuffle / repeat | S / R |
| Mute | M |
| Lyrics | Y |
| Speed down / up (0.1×) | [ / ] |
| Show all shortcuts | ? |
| Close menus, clear search | Esc |
| Setting | What it does |
|---|---|
| Save to | Folder new downloads go to (default ~/Music/Vodka) |
| Format / Bitrate | MP3, M4A, Opus or FLAC (lossless), 128 to 320 kbps |
| Parallel downloads | 1 to 5 downloads at the same time |
| Auto-tag | Embed title, artist and cover art in the file |
| Skip duplicates | Ignore links already in your library or queue |
| Crossfade | Blend tracks together, 0 to 12 seconds |
| Speed | Playback speed, 1.0× to 2.5× (also the 1.0× button in the player bar) |
| Keep pitch | On: faster at the same pitch. Off: the sped-up sound |
| Normalize volume | Even out loudness between tracks |
| Match lyrics to your file | Re-time lyrics to your exact recording with local speech recognition |
| Gapless playback | Start the next track without a pause |
| Notify | Show a notice when a download lands in your library |
| Close to tray | Keep playing after you close the window |
| Launch on startup | Open Vodka when you log in |
~/Music/Vodka).library.json in the app data folder (the lyrics sync model lives in models/ next to it):
~/.local/share/app.vodka.player/~/Library/Application Support/app.vodka.player/%APPDATA%\app.vodka.player\Deleting a track from the library also deletes its file, a few seconds later so Undo still works.
YouTube downloads suddenly fail. YouTube changes often, and yt-dlp keeps up. Run npm run sidecars again to get the newest yt-dlp. YouTube extraction also works best with Node.js or Deno installed.
"File is missing." The audio file was moved or deleted outside Vodka. Delete the track from the library and paste its link again.
Lyrics are off for one song. If it says matched to your file, the timing comes from your recording, so the rest is usually a fixed delay: use EARLIER / LATER. If it doesn't, the song was too hard to transcribe (heavy effects, very dense mix, or a language whisper struggles with) and the LRCLIB timing is kept.
No lyrics for a song. Lyrics come from LRCLIB, a community database. Very new or obscure songs may not be there yet. Messy YouTube titles like "Song (Official Video)" are cleaned up before searching.
A track won't play on Linux. Make sure the GStreamer packages above are installed.
Closing the window doesn't quit. That's Close to tray. Use the tray icon's Quit Vodka, or turn the setting off.
| Part | Where |
|---|---|
| UI (React + TypeScript + Vite, CSS modules) | src/ |
| State, persistence and backend events (Zustand) | src/store.ts |
Audio engine: two <audio> decks through Web Audio for crossfade, volume and normalization | src/engine.ts |
| Download queue: parallel workers running yt-dlp and ffmpeg, Spotify lookup, waveform and loudness analysis | src-tauri/src/dl.rs |
| Local media server that streams library files to the player | src-tauri/src/media.rs |
| Lyrics lookup (LRCLIB search, quality checks, LRC parsing) | src-tauri/src/lyrics.rs |
| Lyrics sync: whisper.cpp transcription and line alignment | src-tauri/src/sync.rs |
| App shell: window, tray, saving | src-tauri/src/lib.rs |
| Original design handoff and interactive prototype | design_handoff_vodka/ |
Run the Rust tests with:
cd src-tauri && cargo test
cargo test -- --ignored # also runs a live lyrics lookup (needs internet)
Vodka is a tool for building a personal library. Only download content you have the right to download, and respect the terms of the services you download from.
1 commits
HTML
28.2%
TypeScript
25.2%
JavaScript
21.3%
Rust
16.1%
CSS
8.2%
Shell
1.1%
A desktop music player you fill yourself. Paste a YouTube, SoundCloud or Spotify link, Vodka downloads the audio into a local library, and from there you play it, like it, queue it and sort it into playlists. No accounts, no streaming, just files on your disk.

? in the app).ffmpeg and ffprobe on your PATH)On Linux you also need GStreamer codecs for playback, and the app indicator library for the tray icon:
# Arch
sudo pacman -S webkit2gtk-4.1 libayatana-appindicator gst-plugins-good gst-libav ffmpeg cmake base-devel
# Debian / Ubuntu
sudo apt install libwebkit2gtk-4.1-dev libayatana-appindicator3-dev \
gstreamer1.0-plugins-good gstreamer1.0-libav ffmpeg cmake build-essential
git clone https://github.com/zOrpheas/vodka.git
cd vodka
npm install
npm run sidecars # downloads yt-dlp, copies ffmpeg/ffprobe, builds whisper-cli (a minute or two)
npm run sidecars uses a POSIX shell. On Windows, run it from Git Bash or WSL.
npm run tauri dev
The first run compiles the Rust side, which takes a few minutes. After that it starts in seconds.
sh scripts/install-linux.sh
This builds a release version and installs it for your user in ~/.local/share/vodka, with an entry in your app launcher. No root needed. Run it again to update, or remove it with sh scripts/install-linux.sh --uninstall (your library and music stay).
To build an installer package for your platform instead:
npm run tauri build
The output lands in src-tauri/target/release/bundle/.
···) to queue it, like it or add it to a playlist.Typing plain text in the bar searches your library instead.
Press LYRICS in the player bar (or Y). The current line lights up as the song plays and the view scrolls with it; click a line to jump to that moment. If you scroll to read ahead, it waits a few seconds before following the song again.
The first time a song with synced lyrics plays, Vodka matches the lyrics to your file: it transcribes the song on your computer (nothing is uploaded), finds where each line is sung, and re-times the lines. This takes around 10 to 30 seconds in the background, and the lyrics header shows matching to your file while it works and matched to your file when done. Lines from parts of the song your version doesn't have (a cut intro, a shorter outro) are left out. The very first time, Vodka downloads the 148 MB speech model it needs.
Vodka also keeps the lyrics in step with what you actually hear. Some systems play audio slightly later than the player reports, so Vodka measures that delay automatically each time a track starts and corrects for it. If the words still feel a touch early or late, fine-tune with EARLIER / LATER at the top of the lyrics. The adjustment is remembered. When no lyrics are found, SEARCH AGAIN looks again. LRCLIB grows every day.
| Action | Key |
|---|---|
| Play / pause | Space |
| Search or paste | Ctrl K (⌘K on macOS) |
| Next / previous track | Shift → / Shift ← |
| Seek 5 seconds | ← / → |
| Volume | ↑ / ↓ |
| Like the current track | L |
| Now playing panel | Q |
| Shuffle / repeat | S / R |
| Mute | M |
| Lyrics | Y |
| Speed down / up (0.1×) | [ / ] |
| Show all shortcuts | ? |
| Close menus, clear search | Esc |
| Setting | What it does |
|---|---|
| Save to | Folder new downloads go to (default ~/Music/Vodka) |
| Format / Bitrate | MP3, M4A, Opus or FLAC (lossless), 128 to 320 kbps |
| Parallel downloads | 1 to 5 downloads at the same time |
| Auto-tag | Embed title, artist and cover art in the file |
| Skip duplicates | Ignore links already in your library or queue |
| Crossfade | Blend tracks together, 0 to 12 seconds |
| Speed | Playback speed, 1.0× to 2.5× (also the 1.0× button in the player bar) |
| Keep pitch | On: faster at the same pitch. Off: the sped-up sound |
| Normalize volume | Even out loudness between tracks |
| Match lyrics to your file | Re-time lyrics to your exact recording with local speech recognition |
| Gapless playback | Start the next track without a pause |
| Notify | Show a notice when a download lands in your library |
| Close to tray | Keep playing after you close the window |
| Launch on startup | Open Vodka when you log in |
~/Music/Vodka).library.json in the app data folder (the lyrics sync model lives in models/ next to it):
~/.local/share/app.vodka.player/~/Library/Application Support/app.vodka.player/%APPDATA%\app.vodka.player\Deleting a track from the library also deletes its file, a few seconds later so Undo still works.
YouTube downloads suddenly fail. YouTube changes often, and yt-dlp keeps up. Run npm run sidecars again to get the newest yt-dlp. YouTube extraction also works best with Node.js or Deno installed.
"File is missing." The audio file was moved or deleted outside Vodka. Delete the track from the library and paste its link again.
Lyrics are off for one song. If it says matched to your file, the timing comes from your recording, so the rest is usually a fixed delay: use EARLIER / LATER. If it doesn't, the song was too hard to transcribe (heavy effects, very dense mix, or a language whisper struggles with) and the LRCLIB timing is kept.
No lyrics for a song. Lyrics come from LRCLIB, a community database. Very new or obscure songs may not be there yet. Messy YouTube titles like "Song (Official Video)" are cleaned up before searching.
A track won't play on Linux. Make sure the GStreamer packages above are installed.
Closing the window doesn't quit. That's Close to tray. Use the tray icon's Quit Vodka, or turn the setting off.
| Part | Where |
|---|---|
| UI (React + TypeScript + Vite, CSS modules) | src/ |
| State, persistence and backend events (Zustand) | src/store.ts |
Audio engine: two <audio> decks through Web Audio for crossfade, volume and normalization | src/engine.ts |
| Download queue: parallel workers running yt-dlp and ffmpeg, Spotify lookup, waveform and loudness analysis | src-tauri/src/dl.rs |
| Local media server that streams library files to the player | src-tauri/src/media.rs |
| Lyrics lookup (LRCLIB search, quality checks, LRC parsing) | src-tauri/src/lyrics.rs |
| Lyrics sync: whisper.cpp transcription and line alignment | src-tauri/src/sync.rs |
| App shell: window, tray, saving | src-tauri/src/lib.rs |
| Original design handoff and interactive prototype | design_handoff_vodka/ |
Run the Rust tests with:
cd src-tauri && cargo test
cargo test -- --ignored # also runs a live lyrics lookup (needs internet)
Vodka is a tool for building a personal library. Only download content you have the right to download, and respect the terms of the services you download from.
1 commits
HTML
28.2%
TypeScript
25.2%
JavaScript
21.3%
Rust
16.1%
CSS
8.2%
Shell
1.1%