feat: implement radiodrift — keyboard-first terminal internet radio app#1
Open
Copilot wants to merge 5 commits into
Open
feat: implement radiodrift — keyboard-first terminal internet radio app#1Copilot wants to merge 5 commits into
Copilot wants to merge 5 commits into
Conversation
- Add Bubble Tea TUI with three-column layout - Add Radio Browser API client with search and random stations - Add mpv player backend with graceful fallback - Add JSON persistence for favorites, history, presets, crates - Add local search/filter and related station scoring - Add warm dark theme with Lip Gloss - Add keyboard-first navigation with full keymap - Add help overlay, now playing panel, station list views Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: cempack <73651345+cempack@users.noreply.github.com>
Change len(s.Country) > 3 to >= 2 so 2-character country codes without a CountryCode field are displayed correctly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: cempack <73651345+cempack@users.noreply.github.com>
- Set StatePlaying before goroutine launch to avoid race where process exits before state is assigned - Replace rune arithmetic for ViewID context with fmt.Sprintf for clarity Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: cempack <73651345+cempack@users.noreply.github.com>
Agent-Logs-Url: https://github.com/cempack/radio-cli/sessions/5b6e3389-4dac-4e20-aa8f-57f3e156e698 Co-authored-by: cempack <73651345+cempack@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Add features for discovering internet radio stations
feat: implement radiodrift — keyboard-first terminal internet radio app
Apr 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bootstrap a full TUI internet radio discovery app ("radiodrift") from an empty repo, implementing the complete MVP vertical slice: search → tune → favorite → persist.
Architecture
internal/appinternal/radiointernal/playerinternal/store~/.local/share/radiodrift/)internal/searchinternal/themeinternal/keymapinternal/ui/componentsinternal/ui/viewsLayout
Responsive column layout driven by terminal width:
Key interactions
/— incremental search (local pool: discover + favorites);Enterfires API fetchj/k/gg/G— list navigationEnter— tune;x— stop;f— toggle favorite1–6— switch views;?— help overlay;q— back/quitRelated-station scoring
Persistence
Favorites, history, presets, and crates are stored as indented JSON:
Original prompt
Internet Radio Crate Digger
A full product and engineering blueprint for a keyboard-first terminal app that helps users discover, save, and listen to internet radio stations from around the world.
Product vision
Internet Radio Crate Digger is a cozy, high-agency terminal application for music discovery. The product is not just a stream picker; it is a browsing environment built for serendipity, curation, and long-running sessions.
The app should feel like a late-night record shop inside the terminal: warm, tactile, fast, and deeply keyboard driven. Lip Gloss is the styling and layout layer, Bubbles provides reusable TUI components, and lazyspotify shows that a media app can feel elegant and premium in a terminal-first interface.[cite:1][cite:6][cite:13]
Core promise
The app should let a user do four things exceptionally well:
Experience principles
1. Discovery first
The product wins on browsing quality, not just playback. Every screen should help the user answer one of these questions:
2. Cozy, not corporate
Avoid the look of a dashboard. The interface should feel like a crafted music tool, not a developer admin panel.
3. Fast paths everywhere
Every major action should be available in one to three keystrokes:
4. Designed for dwell time
A great version of this app stays open in a terminal tab all evening. That means the idle state matters: the “now playing” view, metadata updates, station health, listening history, and visual rhythm should all feel alive.
User archetypes
Crate digger
A user who wants obscure stations, weird geography, and niche tags.
Needs:
Focus listener
A user who wants background audio while working.
Needs:
World explorer
A user who surfs by country, language, and city.
Needs:
Taste builder
A user who wants to cultivate a personal library of stations and moments.
Needs:
Feature set
MVP
V1
V2
Information architecture
The app should use a multi-view layout with one primary shell and focused subviews.
Global views
Recommended shell layout
Standard desktop terminal layout
Use a three-column structure:
Narrow terminal layout
Collapse into stacked or tabbed panes:
Modal overlays
Use modal or drawer-style overlays for:
Navigation model
Primary navigation
Suggested keys:
1Home2Discover3Favorites4History5Presets6Crates/Search?Help:Command paletteqBack or quit contextuallyList navigation
j/kmoveggtopGbottomentertune/openspacepreview or play/pause depending on contextffavoritepsave to presetcsave to craterrelated stationsoopen detailycopy station UR...