01
The product
Dhun (Hindi for melody) is a music streaming app for Indian music: search across songs, albums, artists, and playlists, with a persistent player, a queue, and keyboard shortcuts. No ads, no upsell screens — just the catalog and a player. It lives at play.rajkar.dev and I use it daily.
02
My role
Everything. Design, frontend, data layer, deployment. There's no team behind this one, which is part of the point — it's where I get to make every call myself and live with the consequences.
03
The hard part
Music apps have one non-negotiable: the audio must never stop when the UI moves. In a route-based framework like Next.js that means the player can't belong to any page — playback state, the queue, and the audio element live in a context above the route tree, so navigating through search, albums, and artists never interrupts the current track.
The other constraint was speed on a catalog I don't own. Browse, album, and artist pages are server components fetching from a JioSaavn catalog API, with tiered cache revalidation — short-lived for search, an hour for albums and artists — so most navigation lands on cached HTML instead of waiting on a third-party API.
04
How it was built
Next.js 16 App Router with React 19. Server components handle catalog fetching and caching; the client side is deliberately thin — one player context, a queue panel, hotkeys, and CSS Modules for styling. No state library, no CSS framework. A solo project survives on how little of it you have to maintain.
05
Outcome
It does what it was built to do: my music, no ads, instant navigation. It's also been a sandbox for patterns — persistent players above the route tree, server-component caching against third-party APIs — that I've since used in client work.