Your terminal audio companion for streaming internet radio stations, built with Node.js, React, and Ink.
- 🎧 Stream thousands of radio stations from around the world
- 🔍 Search stations by name, country, genre, or language
- ⭐ Favorite stations for quick access
- 🎚️ Volume control
- 📻 Live metadata display (now playing information)
- 💾 Persistent settings and favorites
- ⌨️ Intuitive keyboard controls
Before installing, make sure you have:
- Node.js (v18 or higher)
- MPV (media player for audio playback)
macOS:
brew install mpvLinux:
# Ubuntu/Debian
sudo apt install mpv
# Fedora/RHEL
sudo dnf install mpv
# Arch Linux
sudo pacman -S mpvWindows:
- Download from mpv.io
- Or use Chocolatey:
choco install mpv
Why MPV? MPV is a lightweight, cross-platform media player that handles all audio formats and provides real-time volume control. It includes FFmpeg internally.
npm installThis will install all required packages for the terminal UI and API integration.
npm run devThis uses tsx to run TypeScript directly with hot-reload enabled. Best for development.
npm run build # Compile TypeScript to JavaScript
npm start # Run compiled versionThe compiled output goes to the dist/ folder.
"MPV not found" error:
- Make sure MPV is installed (see Prerequisites above)
- Verify MPV is in your PATH:
mpv --version - Restart your terminal after installing MPV
- Adorable Radios will show OS-specific installation instructions
Audio not playing:
- Check your system audio settings and volume
- Make sure no other application is blocking audio output
- Verify the station URL is working by testing in your browser
- Some stations may have geo-restrictions
Installation issues:
- If
npm installfails, make sure you have Node.js v18 or higher - Try clearing npm cache:
npm cache clean --force
- ↑/↓ - Navigate through station list
- Enter - Play selected station / Pause current station
- Space - Stop playback
- +/- - Increase/decrease volume
- f - Toggle favorite for selected station
- s - Search for stations
- b - Browse all stations
- v - View favorites
- q - Quit application
For new developers, see the detailed Architecture Guide which includes:
- Complete system diagram
- Component interaction flows
- Audio pipeline explanation
- Design patterns used
- Data flow examples
-
Audio Player Service (
src/services/player.ts)- MPV-based audio playback for all formats (MP3, AAC, OGG, FLAC, etc.)
- Real-time volume control via IPC (Inter-Process Communication)
- Handles HTTP stream connections and ICY metadata parsing
- Event-driven architecture for state updates
-
Radio Browser API Client (
src/services/radio-browser.ts)- Integrates with Radio-Browser.info API
- Discovers and searches thousands of stations
- Provides filtering by country, genre, and language
-
Storage Manager (
src/services/storage.ts)- Persists user favorites and settings
- Manages last played station
- Stores volume preferences
-
React/Ink UI Components (
src/components/)- Terminal-based UI using React and Ink
- Real-time updates and interactive controls
- Clean, intuitive interface
adorable-radios/
├── src/
│ ├── components/
│ │ ├── App.tsx # Main application component
│ │ ├── StationList.tsx # Station browser
│ │ ├── NowPlaying.tsx # Playback display
│ │ ├── SearchInput.tsx # Search interface
│ │ └── HelpBar.tsx # Keyboard controls help
│ ├── services/
│ │ ├── player.ts # Audio playback service
│ │ ├── radio-browser.ts # API client
│ │ └── storage.ts # Data persistence
│ ├── types.ts # TypeScript interfaces
│ └── cli.tsx # CLI entry point
├── package.json
├── tsconfig.json
└── README.md
- Node.js - Runtime environment
- TypeScript - Type safety
- React - UI component framework
- Ink - Terminal UI rendering
- MPV - Media player for audio playback
- axios - HTTP client for streaming and API requests
- conf - Configuration management
This application uses the Radio-Browser.info API, a community-driven catalog of radio stations.
MIT