Eter
Internet radio for your menu bar or system tray, with a station library of your own.
- Status
- active
- Role
- author
- Year
- 2026

Context
An open-source desktop radio player with curated and custom stations, resilient streaming, and a compact menu-bar or system-tray interface. Built with Python and Qt 6 for macOS, Windows, and Linux.
eter is an open-source internet radio player for macOS, Windows, and Linux. I built it with Python and Qt 6 to keep radio close at hand: in the macOS menu bar or the Windows and Linux system tray, with a desktop-window presentation when a tray is unavailable.
A small player with a personal station library
The app includes curated Macedonian, ex-Yugoslav, and world station packs. Listeners can add their own streams, organize stations into packs, and collect favorites across the library. Station packs can update from GitHub independently of app releases.
The player combines volume controls, song-change notifications, and an audio-reactive waveform with a sleep timer and an option to resume the last station on launch. Light and dark themes follow the operating system.
Playback and metadata
eter supports MP3 and AAC streams and resolves common PLS, M3U, and M3U8 playlist URLs. Dropped streams trigger automatic reconnection with capped exponential backoff, keeping recovery inside the playback layer.
Radio stations expose track information in different ways. The now-playing resolver combines Qt stream metadata, ICY stream titles, and station-specific web fallbacks. Stream metadata takes precedence over the web fallback. The waveform is driven by measured audio levels from Qt’s audio buffers.
Separating the player from its presentation
Tray and window presenters expose the same interface to the application controller. Platform-specific menu behaviour stays in the presentation layer, while playback and station management remain shared. This accommodates differences between macOS menu bars, Windows trays, and Linux desktops without duplicating the player.
The station catalog is separate from its JSON storage. Saves use a temporary file followed by replacement, while editor commands capture catalog snapshots for undo and redo. Remote pack fetching runs in background threads and reports results through Qt signals.
Packaging and maintenance
PyInstaller packages the application with its Qt audio dependencies. The release workflow builds platform-specific downloads for macOS, Windows, and Linux. The repository includes automated tests for playback recovery, metadata parsing, playlist handling, catalog editing, and UI behaviour.
The project is MIT-licensed. Source code and downloadable releases are available on GitHub.
Delivered scope
- Menu-bar, system-tray, and desktop-window presentations across macOS, Windows, and Linux
- Curated and custom station packs, cross-pack favorites, and editing with undo/redo
- MP3/AAC playback, playlist resolution, and automatic reconnection with exponential backoff
- Now-playing metadata from multiple sources and an audio-reactive waveform
- Sleep timer, resume on launch, and station-pack updates independent of app releases