Viora
LiveMy own music streaming service, on my own servers




Viora is my own music streaming service. It works like Spotify, but for my own music collection, and it runs on servers in my own data center in Malaysia. I built it for me and my family.
What it does
- Upload once, play anywhere: add a song or a whole folder in the admin dashboard, and Viora turns it into streaming versions for every device.
- Tags itself: it reads the file's tags, cleans up messy titles, and matches the audio's fingerprint against MusicBrainz to fill in the artist, album and cover art. If a match isn't certain, it goes to a review queue.
- Synced lyrics: lyrics are fetched automatically and highlighted line by line as the song plays.
- Your library: favorites, playlists with folders, smart playlists that fill themselves, listening history, stats and a listening recap.
- Search and browse: typo-tolerant search with filters for year, mood, genre and quality, and browsing by genre, mood and decade.
- Offline and across devices: download albums and playlists to the phone, and start a song on one device and continue it on another.
- Made to fit you: dark and light themes, accent colors, larger text, high contrast, and a separate audio quality for Wi-Fi and mobile data.
Where it runs
- Web: at vioramusic.com. It installs on a phone like an app, and supports keyboard shortcuts and media keys on a computer.
- Phone: a Flutter app for iOS and Android with background playback and lock-screen controls. It isn't in the app stores.
- Admin: a separate dashboard for uploads, metadata, artwork, lyrics and users.
How it works
The backend is one NestJS app split into modules: accounts, catalog, media, streaming, playlists, lyrics and analytics. It's built as a media platform that starts with music, so podcasts or audiobooks can be added later without a redesign.
When a song is uploaded, the original is stored untouched and a background job runs FFmpeg to make AAC versions at three bitrates plus adaptive HLS, and FLAC when the source is lossless. The same job measures loudness, draws the waveform and pulls out the cover art.
Audio never passes through the API. A player gets a short-lived signed link and streams straight from storage, an S3-compatible Garage server. PostgreSQL holds the catalog, Redis runs the job queues, Meilisearch powers search, and Caddy handles HTTPS.
What's next
On the roadmap: an equalizer, crossfade and gapless playback, a sleep timer, sign-in with Google, Apple and passkeys, casting to speakers and TVs, CarPlay and Android Auto, shared playlists, AI playlists and recommendations, and later, podcasts and audiobooks.
Get Viora
- WebOpen Viora
Built with
- NestJS
- Next.js
- Flutter
- TypeScript
- PostgreSQL
- Prisma
- Redis + BullMQ
- Meilisearch
- FFmpeg
- Garage (S3)
- Caddy
- Turborepo
Changelog
- 0.41.0
Storage calls time out and retry, so a slow storage server slows transcoding down instead of freezing it.
- 0.39.0
Start a song on one device and pick it up on another.
- 0.31.0
The web app installs on a phone like an app, with a phone layout and a redesigned home screen.
- 0.27.0
Themes, audio quality settings, accessibility, and the new brand design on web and mobile. Viora went live on vioramusic.com.
- 0.16.0
Favorites and playlists (with folders and smart playlists), listening history, stats and recap, filtered search, and browsing by genre, mood and decade.
- 0.23.0
Synced lyrics from LRCLIB, automatic tagging by audio fingerprint (AcoustID and MusicBrainz), and offline downloads.
- 0.5.0
The backend works end to end: upload a song, transcode it with FFmpeg, add it to the catalog and search, and stream it over adaptive HLS with resume.
- 0.8.0
First versions of the web app, the admin dashboard and the Flutter phone app.
Posts about Viora
Started 16 Jul 2026