A modern internet radio player for the terminal and desktop.
FluxTuner combines:
- a fast keyboard-oriented TUI
- an experimental GTK4 desktop GUI
- smart favorites and playlists
- theming support
- modular playback backends
- lightweight live metadata support
into a lightweight application designed for daily use.
Built with Python and focused on speed, usability and modularity.
- Search internet radio stations by name, genre and country
- Modular playback backend support (
mpvandffplay) - Favorites with custom names and tags
- Smart Play by tag or playlist
- Persistent playlists and dynamic tag playlists
- Full theming system with live preview
- Structured table view
- Playback control, with live volume and mute support when the selected backend supports it
- Estimated data usage tracking
- Experimental GTK desktop GUI
- Clean modular architecture
- Live stream metadata display (artist and track when available)
FluxTuner requires:
- Python 3.11+
mpvorffmpeg/ffplay- A terminal emulator with good Unicode support
The GTK desktop GUI currently requires:
- GTK4
- PyGObject
sudo prt-get depinst mpvsudo apt install mpvsudo pacman -S mpvsudo dnf install mpvbrew install mpvffplay is included with FFmpeg and can be used as a lightweight fallback backend.
sudo prt-get depinst ffmpegsudo apt install ffmpegsudo pacman -S ffmpegsudo dnf install ffmpegbrew install ffmpegVerify:
ffplay -versionFluxTuner currently provides two interfaces:
- TUI (Terminal User Interface) → fast, lightweight and keyboard-oriented
- GTK Desktop GUI → visual desktop experience with playlists, favorites and responsive layout
Both interfaces share the same playback backend, favorites system and playlist data.
FluxTuner uses a modular playback backend architecture.
FluxTuner automatically detects the best available playback backend.
Current priority order:
mpv(recommended)ffplay(lightweight fallback)
Backend capability notes:
mpvsupports play/stop, live volume and live mute controls.ffplayis a lightweight fallback focused on play/stop. It does not provide live volume or live mute control in FluxTuner.
Inspect detected playback backends with:
fluxtuner --list-playersor, when running from source:
python -m fluxtuner --list-playersAdditional backends may be added in future versions.
The TUI is ideal for:
- SSH sessions
- low-resource systems
- keyboard-driven workflows
- tiling window managers
- fast station browsing
This is the simplest and least invasive way to test or run FluxTuner from a checkout:
git clone https://github.com/pitill0/fluxtuner.git
cd fluxtuner
python -m venv .venv
source .venv/bin/activate
pip install -e .
python -m fluxtunerfluxtunerEquivalent to:
python -m fluxtunerThe TUI is the default interface:
fluxtuneror:
python -m fluxtuner- Fast search
- Country filtering
- Minimum bitrate filtering
- Favorites support
- Dynamic playlists
- Random playback by tag
- Theme support
- Session data usage tracking
- Modular backend support
FluxTuner also includes an experimental GTK4 desktop interface.
The GUI focuses on:
- responsive layout
- playlist workflows
- favorites management
- visual station browsing
- desktop-friendly playback controls
- live metadata display
fluxtuner --guior:
python -m fluxtuner --gui- GTK4 desktop interface
- Responsive dark theme
- Fast station search
- Favorites management
- Tag playlist filtering
- Random playback by tag
- Session data usage tracking
- Playback status indicators
- Volume and mute controls when supported by the active backend
- Live artist / track metadata
- Active backend display
For testing or running FluxTuner without installing it globally:
git clone https://github.com/pitill0/fluxtuner.git
cd fluxtuner
python -m venv .venv
source .venv/bin/activate
pip install -e .
python -m fluxtuner --player mpv
python -m fluxtuner --gui --player mpvYou can also rely on backend autodetection:
python -m fluxtuner
python -m fluxtuner --guiThis workflow is especially useful for development, CRUX Linux and systems where you prefer to avoid global installation.
Recommended if you want FluxTuner available as a standalone command:
pipx install git+https://github.com/pitill0/fluxtuner.gitRun:
fluxtunerInstall a specific version:
pipx install git+https://github.com/pitill0/fluxtuner.git@v0.1.0Upgrade:
pipx upgrade fluxtunerUninstall:
pipx uninstall fluxtunerFluxTuner currently supports:
mpv(recommended)ffplay(lightweight fallback backend)
FluxTuner automatically selects the best available backend by default.
Backend capability notes:
mpvsupports play/stop, live volume and live mute controls.ffplayis focused on play/stop and does not provide live volume or live mute control in FluxTuner.
Inspect detected playback backends with:
fluxtuner --list-playersExamples:
fluxtuner --player autofluxtuner --player mpvfluxtuner --gui --player mpvfluxtuner --player ffplayfluxtuner --gui --player ffplayWhen running from source, use:
python -m fluxtuner --player mpv
python -m fluxtuner --player ffplay
python -m fluxtuner --gui --player mpv
python -m fluxtuner --gui --player ffplayList available themes:
fluxtuner --list-themesRun with a theme:
fluxtuner --theme nordSave a theme as default:
fluxtuner --theme nord --save-themeor:
fluxtuner --save-theme nord# Show help
fluxtuner --help
# Show version
fluxtuner --version
# List available playback backends
fluxtuner --list-players
# Run the legacy numbered CLI
fluxtuner --cli
# Clear search cache
fluxtuner --clear-cache
# Export favorites
fluxtuner --export-favs favorites.json
# Import favorites
fluxtuner --import-favs favorites.json
# Export playlists
fluxtuner --export-playlists playlists.json
# Import playlists
fluxtuner --import-playlists playlists.jsonWhen running from source, replace fluxtuner with:
python -m fluxtunerWhen using a Python virtual environment, PyGObject installed via Homebrew may not be visible inside the venv.
Install dependencies:
brew install gtk4 pygobject3 mpv ffmpegIf your shell aliases python to a system interpreter, the virtual environment may be bypassed.
Check:
which pythonIf needed:
unalias pythonIf the GUI fails with:
ModuleNotFoundError: No module named 'gi'
run FluxTuner with Homebrew's PyGObject path:
PYGOBJECT_SITE_PACKAGES="$(dirname "$(find "$(brew --prefix)" -path "*/site-packages/gi/__init__.py" 2>/dev/null | head -n 1)")"
PYTHONPATH="$PYGOBJECT_SITE_PACKAGES" python -m fluxtuner --gui --player mpvOn Apple Silicon this often resolves to:
PYTHONPATH=/opt/homebrew/lib/python3.14/site-packages \
python -m fluxtuner --gui --player mpvFind the correct path with:
find "$(brew --prefix)" -path "*site-packages/gi/__init__.py" 2>/dev/null| Key | Action |
|---|---|
/ |
Focus search |
Enter |
Play selected station |
x |
Stop playback |
Space |
Play / Stop selected station |
+ / - |
Volume up / down when supported by the active backend |
m |
Mute / unmute when supported by the active backend |
a |
Add to favorites |
f |
Open favorites |
d |
Remove favorite |
e |
Edit favorite name |
g |
Edit favorite tags |
p |
Open playlists |
n |
New playlist |
b |
Add to playlist |
t |
Filter by tag / open theme selector depending on context |
h |
History |
l |
Play last station |
q |
Quit |
Built-in themes:
- default
- nord
- dracula
- amber
- ptmtrx
Features:
- Live preview in selector
- Apply with
Enter - Save with
y
FluxTuner stores new user data in XDG-style locations.
These base directories respect XDG_CONFIG_HOME, XDG_DATA_HOME and XDG_CACHE_HOME when they are set, which also makes the same layout suitable for sandboxed environments such as Flatpak.
- Config:
~/.config/fluxtuner/config.json - Favorites:
~/.local/share/fluxtuner/favorites.json - Playlists:
~/.local/share/fluxtuner/playlists.json - History:
~/.local/share/fluxtuner/history.json - Data usage:
~/.local/share/fluxtuner/usage.json - Search cache:
~/.cache/fluxtuner/search_cache.json
Legacy files such as ~/.fluxtuner_favorites.json, ~/.fluxtuner_playlists.json, ~/.fluxtuner_history.json and ~/.fluxtuner_usage.json are copied into the new location when needed and kept in place as a conservative migration.
- Improved GTK desktop experience
- Better playlist workflows
- Responsive layouts
- Packaging and distribution
- Persistent GUI settings
- Live stream metadata improvements
- MPRIS/media key support
- Improved backend capability reporting
- More advanced station history views
- Import/export improvements
- Flatpak packaging
- AppImage builds
- Mobile-oriented interface experiments
PRs are welcome.
Issues, feature requests and feedback are always appreciated.
FluxTuner is open source and available under the MIT license.
You are free to use, modify, and distribute it, including for commercial purposes.
That said, if you plan to integrate FluxTuner into a commercial product, service, or distribution, please consider reaching out.
Contributions, attribution, or collaboration are always appreciated.
MIT
If you find FluxTuner useful:
- Star the repository
- Report issues
- Suggest improvements
- Share screenshots or workflows
Your support helps shape the future of the project.




