Skip to content

feat: implement radiodrift — keyboard-first terminal internet radio app#1

Open
Copilot wants to merge 5 commits into
mainfrom
copilot/add-radio-station-discovery-features
Open

feat: implement radiodrift — keyboard-first terminal internet radio app#1
Copilot wants to merge 5 commits into
mainfrom
copilot/add-radio-station-discovery-features

Conversation

Copy link
Copy Markdown

Copilot AI commented Apr 25, 2026

Bootstrap a full TUI internet radio discovery app ("radiodrift") from an empty repo, implementing the complete MVP vertical slice: search → tune → favorite → persist.

Architecture

Package Role
internal/app Bubble Tea root model, view routing, responsive layout
internal/radio Radio Browser API client (search, random, by-tag/country)
internal/player mpv subprocess backend; graceful no-mpv fallback
internal/store JSON persistence (~/.local/share/radiodrift/)
internal/search Local filter + weighted related-station scoring
internal/theme Warm dark Lip Gloss palette with semantic style tokens
internal/keymap Centralised vim-style bindings, context-aware footer
internal/ui/components NowPlaying card, station rows, help overlay
internal/ui/views Home, Discover, Search, Favorites, History, Presets, Crates

Layout

Responsive column layout driven by terminal width:

  • ≥120 cols: sidebar / station list / now-playing (3-column)
  • ≥80 cols: list / now-playing (2-column)
  • <80 cols: single stacked pane

Key interactions

  • / — incremental search (local pool: discover + favorites); Enter fires API fetch
  • j/k / gg / G — list navigation
  • Enter — tune; x — stop; f — toggle favorite
  • 16 — switch views; ? — help overlay; q — back/quit

Related-station scoring

// search.RelatedScore weights
// +3 same country, +3 same language
// +2 per shared tag, +2 similar name token
// +1 same codec, +1 similar bitrate range

Persistence

Favorites, history, presets, and crates are stored as indented JSON:

~/.config/radiodrift/config.json
~/.local/share/radiodrift/{favorites,history,presets,crates}.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:

  • Discover radio stations by country, city, language, tag, codec, bitrate, and popularity.
  • Drop into listening quickly with near-zero friction.
  • Build a personal crate of favorites, presets, and saved sessions.
  • Stay inside a rich “now playing” environment that is pleasant enough to keep open for hours.

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:

  • What should be played next?
  • What kind of station is this?
  • What similar stations exist nearby in the graph of genre, geography, and mood?
  • What did the user like enough to save?

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:

  • Search.
  • Tune.
  • Favorite.
  • Open queue/history.
  • Jump to related stations.
  • Toggle presets.
  • Start random mode.

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:

  • Deep search and filtering.
  • Good related-station recommendations.
  • Random exploration modes.
  • History and save tools.

Focus listener

A user who wants background audio while working.

Needs:

  • Reliable presets.
  • Quick resume.
  • Low-friction favorites.
  • Stable playback and reconnection.

World explorer

A user who surfs by country, language, and city.

Needs:

  • Region browsing.
  • Strong metadata display.
  • Country and language facets.
  • Easy backtracking.

Taste builder

A user who wants to cultivate a personal library of stations and moments.

Needs:

  • Tagging and notes.
  • Saved collections.
  • Listening journal.
  • Import/export.

Feature set

MVP

  • Station search.
  • Genre/tag filters.
  • Country/language filters.
  • Station detail panel.
  • Playback controls.
  • Favorites.
  • Recent history.
  • Presets.
  • Random station mode.
  • Related stations.
  • Stream health indicator.
  • Configurable external player backend.

V1

  • Local library of saved crates.
  • Smart “more like this” browsing.
  • Keyboard palette.
  • Session restore.
  • Notes on stations.
  • Sleep timer.
  • Recording buffer or clip bookmarks.
  • Mini mode for small terminals.

V2

  • Community station packs.
  • Shared crates.
  • Collaborative listening room.
  • Daily discovery ritual.
  • Reputation or taste profile.
  • Lightweight social layer.

Information architecture

The app should use a multi-view layout with one primary shell and focused subviews.

Global views

  • Home.
  • Discover.
  • Search results.
  • Station detail.
  • Now playing.
  • Favorites.
  • History.
  • Presets.
  • Crates.
  • Settings.
  • Help / shortcuts.

Recommended shell layout

Standard desktop terminal layout

Use a three-column structure:

  • Left column: navigation, filters, active facets, saved crates.
  • Center column: station list or search results.
  • Right column: now playing, station detail, metadata, related stations, shortcuts.

Narrow terminal layout

Collapse into stacked or tabbed panes:

  • Top: current view title and mode.
  • Middle: main list.
  • Bottom: player strip and context actions.

Modal overlays

Use modal or drawer-style overlays for:

  • Command palette.
  • Advanced filters.
  • Add note.
  • Rename preset or crate.
  • Confirm delete.
  • Help cheatsheet.

Navigation model

Primary navigation

Suggested keys:

  • 1 Home
  • 2 Discover
  • 3 Favorites
  • 4 History
  • 5 Presets
  • 6 Crates
  • / Search
  • ? Help
  • : Command palette
  • q Back or quit contextually

List navigation

  • j / k move
  • gg top
  • G bottom
  • enter tune/open
  • space preview or play/pause depending on context
  • f favorite
  • p save to preset
  • c save to crate
  • r related stations
  • o open detail
  • y copy station UR...

Copilot AI and others added 4 commits April 25, 2026 11:20
- 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>
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
Copilot AI requested a review from cempack April 25, 2026 11:25
@cempack cempack marked this pull request as ready for review April 25, 2026 14:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants