Open Source internet-radio app for discovering, playing, organising and sharing stations from around the world.
Features
50,000+ stations from a community-curated global directory
Favourites & custom lists — saved locally on your device, never sent anywhere
Share lists via private link — recipient imports with one click, no account needed
Live now-playing info for stations that publish it
Install on phone, desktop, or as a browser extension
Background playback with lock-screen and Bluetooth-headphone controls
Works offline after first load — app shell is cached
No ads, no cookies, no tracking beyond opt-out-able anonymous usage counts
Station directory
The browseable directory comes from the Radio Browser API — a community-run database. Queries are sent directly from your browser; results are not stored anywhere by RadioDock.
"Now Playing" metadata
Most radio servers don't send a CORS header, so a browser can't read their stream metadata directly. RadioDock routes only the stream URL through a small open-source proxy (source) which:
parses the inline ICY metadata blocks Shoutcast / Icecast servers embed between audio frames,
or hits the station's JSON status endpoint (Airtime Pro, Radio King, NTS, etc.) where applicable,
and returns artist + title as JSON, cached for ~15 s.
For HLS streams the parsing happens client-side: hls.js exposes ID3 frames as the stream plays, no proxy involved.
Share-link encoding
When you share a list, the stations are serialised to JSON, gzipped, and base64url-encoded into the URL fragment (the bit after #). Fragments are never sent to the server by browsers, so neither GitHub Pages logs nor any analytics ever see the payload. The recipient's browser decodes and imports locally.
Tech stack
Vanilla JS + Vite — no framework, ~50 KB gzipped main bundle
IndexedDB for favourites, custom lists, prefs (everything stays on your device)
hls.js for HLS streams, native <audio> for ICY/MP3/AAC
MediaSession API for lock-screen controls + Bluetooth headphone buttons
Service Worker for offline shell + PWA install
Self-hosted Umami for anonymous, cookieless usage analytics — opt-out toggle on legal page