How the Linux version actually works — the engine, the failure handling, the package, and the things it deliberately does not do. Written for people who want to know before they install. You decide.
The Android app runs two engines: LibVLC for ICY streams and ExoPlayer for HLS. On Linux there is only LibVLC — the same engine VLC Media Player is built on, and here it plays HLS as well. One engine means one set of rules for buffering, metadata and errors, instead of two that behave differently on the same stream.
HTTP and HTTPS, ICY metadata, MP3, AAC, Ogg Vorbis, HLS (.m3u8), RTSP. Paste a URL — there is no engine to pick and no format to declare.
The package does not carry its own copy of the engine: libvlc5 and vlc-plugin-base come from your distribution's repositories as dependencies, and receive its security updates.
The VU meters read the monitor of the app's own audio stream through PulseAudio or PipeWire (parec) — only its own sound, never other programs and never the microphone, in memory, a fraction of a second at a time.
LibVLC reports what the stream announces, and a separate ICY probe reads the title directly — because LibVLC only surfaces ICY titles over plain http://. Whichever answers first wins.
The artist and title are looked up at iTunes, Deezer and AudioAddict; the first cover found is shown. Station logos and covers are cached on disk, and the cache is capped at 100 MB so it cannot grow without limit.
Every call into LibVLC — play, stop, volume, equalizer — is queued onto a single thread. Calling a media player from two threads at once is how a desktop app disappears without a message, and this is the discipline that stops it.
A dead stream usually does not report an error. The server keeps the connection open, the player still says "playing", and the music simply stops — that is the failure that matters, because it is the one nobody notices until the room goes quiet.
Two counters are watched: bytes pulled from the stream and audio buffers actually played. Both flat for six seconds means the stream is wedged, whatever the player claims about its state.
A wedged or dropped stream is reconnected on its own. If reconnecting is not enough, the whole player is torn down and rebuilt — the same recovery the car version uses, where nobody can pick up a phone and press a button.
Long enough to ride out a hiccup, short enough that pressing play does not feel broken. The number came out of measurements, not taste.
Ten bands from 60 Hz to 16 kHz, ±20 dB each, applied inside the LibVLC pipeline — so it works on every stream format, not only on the ones a system effect happens to support. Presets are saved as files you can copy between machines, and the format is the same one the phone app uses.
60, 170, 310, 600 Hz, then 1, 3, 6, 12, 14 and 16 kHz. Bands can be linked so one slider moves the neighbours with it.
Saved to Documents/RadioA/EQ, loaded from there, shared with the other versions. Removing the package never touches them.
The equalizer is set up before the stream starts. Attaching it mid-playback costs about a second of silence — not a crash, just a gap, and the kind of detail that only shows up if you measure it.
.NET 10 and the interface libraries travel inside the package, so there is no runtime to fetch or match. LibVLC comes from your system. The Releases page of this project and its APT repository are the only places to get it.
Every release has SHA256SUMS and a detached GPG signature. Compare the key's fingerprint with the one on the app page, verify the signature, then the sum. The commands are in the Download section.
As with every Debian package, apt remove takes the program and the project's APT source and leaves your home folder alone: stations, settings, playlists and presets are still there after a reinstall. Delete them yourself for a clean start.
Nothing runs at login unless you switch on Start with the system, which writes one entry in ~/.config/autostart, and nothing phones home. The app does not update itself: your system's package manager does, through the APT source the package adds.
The app connects to the stations you choose, to iTunes or Deezer to look up the cover of the track that is playing, and to radio-browser.info or AudioAddict to find a station's logo. Nothing else: no analytics, no crash reporting service, no account, no ads. The full list is in the privacy policy.
Playlists and equalizer presets you save are plain files in Documents/RadioA, in the same formats as the other versions. Copy them across and they work. Your station list and settings stay in your home folder, in the standard XDG locations.
LibVLCSharp under LGPL-2.1, Avalonia UI, .NET and Tmds.DBus under MIT, Material Icons under Apache-2.0, the Inter and Doto fonts under the SIL OFL. The texts install to /usr/share/doc/radioa.
This is a young version of a mature phone app. Here is the state of it, so you can decide whether it is worth your disk space.
| Feature | Android | Windows | Linux |
|---|---|---|---|
| Audio engine | LibVLC + ExoPlayer | LibVLC only | LibVLC only, from the system |
| ICY metadata and cover art | yes | yes | yes |
| 10-band equalizer with presets | yes | yes | yes |
| Skins, VU meters, sleep timer | yes | yes | yes |
| PLS / JSON playlists, same format | yes | yes | yes |
| Reconnect and watchdog | yes | yes | yes |
| Keeps playing in the background | foreground service | system tray | system tray |
| Keyboard shortcuts and media keys | — | yes | yes (MPRIS) |
| Resizable window, two-column player | — | yes | yes |
| Mouse: wheel volume, drag to reorder | — | yes | yes |
| Android Auto | certified | not applicable | not applicable |
| Wi-Fi → mobile data fallback | yes | not applicable | not applicable |
| Distribution | Google Play | Microsoft Store | .deb from GitHub Releases, then apt |
Free, no ads, no tracking. A .deb for amd64, your playlists stay yours.