In French, baladeur is a noun that means a personal stereo, portable music player, or walkman. Baladio is a combination for "baladeur" and "audio". Pronounciation: bah-LAH-dee-oh.
A self-hosted, privacy-first local music player with a glassmorphism UI, spatial audio, and listening analytics.
Features · Getting Started · Screenshots · Keyboard Shortcuts · License
- Local-first — plays audio files directly from your machine. No accounts, no streaming, no tracking.
- OS Media Controls — full Media Session API integration for hardware media keys, lock screen playback controls, and native OS overlay metadata (title, artist, cover art).
- Spatial 8D Audio — HRTF-based binaural panning using the Web Audio API. Rotation continues even when the browser tab is in the background (pre-scheduled via AudioContext automation).
- Reverb & Deep effects — convolution reverb with synthetic impulse response + pitch-shifted bass boost.
- Effect Config panel — live-tune 8D speed, reverb wet/dry, and reverb tail.
- Playback speed — 0.5× to 2× with a dedicated speed input that can also accept mouse scroll.
- Listening analytics — home dashboard with top song, top artist, hottest playlist, plays today, artists explored, and day streak. Songs are counted after 20 seconds of playback. History stored server-side in
data/history.json. - Recently Played — horizontal scroll strip on the home page.
- Download with effects — exports the song with the current effect chain applied (8D, reverb, speed) as an mp3 file using
OfflineAudioContext. - Cover art — reads embedded ID3 tags for MP3s, extracts the first frame of MP4s via ffmpeg, automatically fetches high-res artwork from the iTunes API if missing, and supports custom uploaded covers.
- Metadata editing — edit title/artist per song; writes to ID3 tags for MP3s.
- File rename — renames the audio file on disk to
{Artist} - {Title}.extfrom metadata. - App Settings Dashboard — centralized configuration for auto-play persistence, UI layouts, cover art priorities, and analytics management.
- Auto-Play Persistence — optionally resume playback automatically when launching the application.
- Synced Lyrics — real-time synchronized lyrics fetched silently in the background via LRCLIB. Displays a scrolling karaoke-style lyrics panel in the fullscreen view. Local
.lrcfiles in the songs directory are prioritised over online lookups. - Notification Centre — in-app notification system for background events.
git clone https://github.com/rxdwan/baladio.git
cd Baladionpm installCreate a songs/ folder one level above Baladio/ and drop your .mp3, .mp4, .flac, .wav, or .ogg files inside:
your-folder/
├── songs/ ← your audio files go here
│ ├── song1.mp3
│ └── song2.flac
└── Baladio/ ← this repo
├── covers/ ← auto-created on first run
├── data/ ← auto-created on first run
├── public/
├── server.js
└── package.json
node server.jsor
npm startThen open http://localhost:3000 in your browser.
Use the included .start-server.vbs script — it launches the server silently with no console window.
Place a shortcut to .start-server.vbs in your Windows Startup folder (Win + R → shell:startup) to auto-start on login.
Use .stop-server.bat to stop the server, and .view_logs.bat to watch live logs.
Use the included shell scripts:
# Make scripts executable (one-time)
chmod +x start-server.sh stop-server.sh view-logs.sh
# Start the server in the background
./start-server.sh
# Stop the server
./stop-server.sh
# Watch live logs
./view-logs.shTo auto-start on login, create a systemd user service:
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/baladio.service <<EOF
[Unit]
Description=Baladio Music Server
After=network.target
[Service]
Type=forking
WorkingDirectory=/path/to/music_player
ExecStart=/path/to/music_player/start-server.sh
ExecStop=/path/to/music_player/stop-server.sh
Restart=on-failure
[Install]
WantedBy=default.target
EOF
systemctl --user enable baladio
systemctl --user start baladioThe same shell scripts work on macOS. To auto-start on login, create a LaunchAgent:
mkdir -p ~/Library/LaunchAgents
cat > ~/Library/LaunchAgents/io.baladio.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key> <string>io.baladio</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/node</string>
<string>/path/to/music_player/server.js</string>
</array>
<key>WorkingDirectory</key> <string>/path/to/music_player</string>
<key>RunAtLoad</key> <true/>
<key>KeepAlive</key> <true/>
<key>StandardOutPath</key> <string>/path/to/music_player/logs/server.log</string>
<key>StandardErrorPath</key><string>/path/to/music_player/logs/server.log</string>
</dict>
</plist>
EOF
launchctl load ~/Library/LaunchAgents/io.baladio.plist![]() Home Page Light |
![]() Home Page Dark |
![]() Explore Page Light |
![]() Explore Page Dark |
![]() Playlist Page Light |
![]() Playlist Page Light |
![]() An example playlist |
![]() Fullscreen (same for light/dark theme) |
![]() Discovery Page to download songs, manage cover art, lyrics etc |
![]() Notification Centre |
![]() Settings Page |
| Key | Action |
|---|---|
Space |
Play / Pause |
F |
Toggle fullscreen |
M |
Mute / Unmute |
Esc |
Back |
→ |
Move 5 seconds ahead |
← |
Move 5 seconds behind |
Shift + → |
Next track |
Shift + ← |
Previous track |
Baladio/
├── covers/
│ ├── songs/ song cover images ({uuid}.jpg)
│ ├── playlists/ playlist cover images ({id}.jpg)
│ └── default_song_cover.jpg
├── data/
│ ├── metadata.json custom title/artist metadata and filename mappings
│ ├── playlists.json user created playlists
│ └── history.json server-side play history
├── public/
│ ├── app.js all frontend logic
│ ├── index.html app shell
│ ├── style.css all styles
│ └── icons.js SVG icon library
└── server.js Express API server
Built with:
- Express.js — Node.js web framework
- music-metadata — audio tag parsing
- node-id3 — MP3 ID3 tag writing
- fluent-ffmpeg — MP4 thumbnail extraction
- better-sqlite3 — local SQLite database for notifications & lyrics cache
- LRCLIB — free, open-source synced lyrics API
- Web Audio API — 8D spatial audio, reverb, and offline rendering










