- YouTube Music search (youtubei.js) with pagination (2 pages, 40 results)
- Audio playback via mpv + yt-dlp (bestaudio, ~83MB RSS)
- Podcast: iTunes search, RSS feed parsing, subscriptions (SQLite)
- Podcast: YouTube-backed playback for synced transcripts
- Two-section model: Music (Ctrl+1) / Podcast (Ctrl+2)
- 6 layout presets (Ctrl+L): default, compact, minimal, split, wide, focus
- 8 color themes (Ctrl+T): Tokyo Night, Catppuccin, Dracula, Nord, Gruvbox, Solarized, Rose Pine, Kanagawa
- Command palette (Ctrl+P) with 35 fuzzy-filterable commands
- Queue: user-controlled (q to add, x to remove, n/p to navigate)
- Favorites + History persisted in SQLite
- Synced lyrics (LRCLIB) + YouTube Music fallback
- Podcast transcripts: flowing text with inline phrase highlighting
- Smart paragraph splitting (sentence-ending punctuation + 20-segment cap)
- Custom transcript URL loading (SRT/VTT)
- Animated equalizer visualization in NowPlaying
- Playback speed control (0.5x-2x, preserves pitch)
- Jump-to-time (t key) with validation
- mpv crash recovery with resume
- Quit confirmation dialog
- Full Unicode support (CJK, Vietnamese, emoji)
- Page-based list scrolling
- Compiled binary (bun build --compile)
- 45 source files, 92 tests passing, strict TypeScript
- Click track row to select
- Double-click to play
- Click sidebar items
- Scroll wheel in lists
- Click progress bar to seek
- Click section tabs to switch
- useTerminalDimensions() for breakpoints
- Auto-switch layout by terminal width
- Collapse NowPlaying at small heights
- Dynamic title/artist truncation
- Debounced onInput in Header
- YouTube Music search suggestions as-you-type
- Dropdown below search bar
- Smooth color fade when phrase changes (300ms interpolation)
- Brief pulse on new phrase activation
- Smooth scroll interpolation
- Detect process.platform === 'win32'
- Use --input-ipc-server=tcp://127.0.0.1:PORT
- Use Bun.connect({hostname, port})
- ~20 lines across process.ts + ipc.ts
- Windows: %APPDATA%\tuimusic\
- macOS: ~/Library/Application Support/tuimusic/
- Linux: $XDG_CONFIG_HOME/tuimusic/
- Artist detail view (top tracks, albums)
- Album detail view (track listing)
- Navigate from search results to detail views
- Track scrobble on 50% playback
- "Now Playing" notification
- Config option
- IPC to Discord client
- Show currently playing track
- Curated station list (SomaFM, etc.)
- Custom URL input
<select>items invisible (buffered rendering bug)<scrollbox focused={true}>intercepts Enter<input>captures j/k/space as typed characters
- PO tokens may be required for direct URL access in future
- yt-dlp adds ~15s to first podcast episode play (YouTube search)
- Some podcast episodes have no YouTube match
- Crash recovery sometimes double-spawns (race in spawnMpv)
- "database is locked" during rapid recovery (concurrent SQLite)