Why does this exist
I spend hours at a desk with my playlists and the odd podcast. Even someone else’s playlist is one I went looking for. Some days I want something new that I didn’t choose or curate, and some days something other than music.
Radio gives you that. You don’t know if the next station is playing music, news or people talking. I designed Off-Band and built it with Claude Code to wander through the stations I’ve saved.
Platforms
Phone first, desktop too
The dial is the interface
A list makes you choose, and a dial lets you wander. Each saved station gets its own frequency from 80.0, and you drag or skip to move them past a red needle. The station you land on grows and turns red while the last one slides away. I spent most of my time making that movement feel physical.
Starting with nothing to play
The first version opened on an empty dial, a red line and nothing to press. Now new visitors start with four stations saved, Rinse UK, The Lot Radio, dublab DE and UKG247, so the first press plays something real. Editor’s pick sits below with more. I tried 'Handpicked' and 'Editor’s choice' before settling on that name, which tells you a person chose these. Remove everything and the empty dial shows an illustration instead of looking broken.
One screen that never scrolls
On a phone Off-Band fits one screen that never scrolls. The player sits at the bottom by your thumb, and My stations fills the height left over. On small iPhones I hide Editor’s pick instead of pushing it under the player, and you can still reach it in search.
I built the player both floating and docked, with a switch to compare them on my phone, and settled on floating.
No accounts
You don’t sign up, and I store nothing. Your stations live in your browser, so clearing it resets your dial, a fair trade for something you open to listen to. The suggestions in For you send the mix of genres, countries and languages on your dial and leave the stations themselves out.
Real stations break
Stations come from Radio Browser, a free community directory, and play from their own source. Off-Band shows secure, working streams, but stations still go off air. A dead one used to say Tuning forever. Now after a few silent seconds it says No signal and offers retry or skip. When a logo is missing, Off-Band fetches it from the station’s website and shows a generated mark until it arrives.
Smooth on an old phone
My iPhone XS Max showed me what a laptop hid. Search, the dial and saving stuttered while music played, because the browser blurred the glow behind the playing logo again under the search blur on each frame. Drawing the glow once as an image fixed it with no visible change. Now I test on the oldest phone I have before I call anything done.
Small things
On desktop, tooltips appear without a delay, slide between buttons and ease to a stop near the screen edge. Space plays and pauses, and on a phone you can long press a station to remove it without playing it.
Trying to break it
I tested tiny phones, zoomed text, 300 stations, emoji names and going offline mid search, and found real problems. Anyone could swap a station’s logo for every visitor with one request, buttons overlapped on the narrowest phones, and search got stuck offline. I fixed all three.
What’s next
Next I want to show what’s playing now, for stations that share it.
What I learned
Each setting I added was a decision I hadn’t made yet. The versions with fewer choices kept coming out better.
An animation can look perfect in a mockup and still stutter on a real phone with music playing, so I treat feel as a performance problem.