Introducing Airshift
I wanted a radio I could leave on. Not a playlist I have to skip through. Not an algorithm that forgets the format the second I blink. Something that feels like a station: a frequency, a crate, a voice that comes in over the bed and tells you what just played.
That is Airshift.
What it is
Airshift is a personal web radio that lives in the browser. You pick a format, hit On Air, and it keeps going. Songs on most hours come from hardcoded YouTube lists in a visible iframe. Breaks duck the track instead of pausing it. The DJ reads canned liners, a Wikipedia or Genius fact, optional weather, and optional headlines.
There is no account. There is no YouTube Music login. Add it to the home screen if you want; Bluetooth lock-screen controls use Media Session. This is not Android Auto—the car sees whatever Chrome is playing.
The tuner
Presets are frequencies, not playlists:
- 88.3 Jazz through 103.5 Pop Hits, with 101.7 Rock as the default
- 90.3 The Wire — live mounts (KEXP, WWOZ, Jazz24, KUTX, Radio Paradise, Nightwave Plaza, KCRW Eclectic24, The Current, dublab, KXLU, WKCR)
- 89.7 OC ReMix — Rainwave’s video-game remix channels
- 104.7 Yours — paste video links or JSON onto the crate. Playlist URLs are not expanded on the public origin (that would be an open proxy).
Rock has subcrates (Classic, Grunge, Britpop, and so on) so you can park on one flavor the way The Wire parks on a city. Hits are the default library; Settings can swap the hour to deep cuts, or a mix. Shuffle is on unless you ask for in-order. The next YouTube hour avoids the last 12 songs on that station.
Keys: 1–9 presets, space pause, S skip, P prev, T talk, . end song.
The booth
The DJ is not a large language model making up a morning show. It is a clock: station IDs, frontsells, backsells, skip lines, time checks. Facts come from Genius when the sidecar has a token, Wikipedia when it does not. Weather is Open-Meteo. News is NPR, local, BBC World, or NPR Music.
Voice is either the browser’s speech engine or Kokoro running in the tab (ONNX, CPU by default, GPU if your machine likes it). Station intros are packed as WAV so On Air does not wait on the model. Uncached lines generate while a song plays, then they are ready when the break hits. If Kokoro fails, the hour keeps going on the browser voice.
Sleep timer fades the bed into Standby. Feedback in Settings goes to the booth.
Where it runs
airshift.fly.dev is the origin: phone, PWA, car. Playback is in the tab; Fly only has to serve the page and a few helpers, so scale-to-zero is fine.
A home box is still unsolved. I want the board on the LAN—always on, playlist URLs, maybe a custom news feed—without turning Fly into an open proxy, and without a self-signed cert that YouTube will not embed against. HTTPS at home, HTTP on the LAN, or something in between: that is next, not this launch.
I spend most of my product time in Phoenix LiveView. Airshift is not that. The hour has to keep playing while you lock the phone, and the DJ has to speak in the same tab as the iframe. The stack for that is in a follow-up.
Try it
Airshift is live at airshift.fly.dev. Pick 101.7, hit On Air, and leave the monitor visible on YouTube hours—some uploads refuse to embed and get skipped.
If a mount is dead or a videoId is wrong, send it through the feedback line. I listen to this thing too.