Technical Overview · November 2026

RadioA for Linux

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.

One engine: LibVLC 3 C# 13 / .NET 10 Avalonia UI .deb, signed sums No telemetry No ads · no account
Under the hood
One engine, not a hybrid

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.

🌐

Protocols

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.

LibVLC 3 from your system, amd64
🧩

LibVLC from your system

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.

Smaller package, updated by the system
🎚️

The sound is measured, not faked

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.

pulseaudio-utils
🏷️

Metadata from two sources

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.

Same title the phone shows
🖼️

Cover art

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.

Plain HTTP, no account anywhere
🧵

One command thread

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.

Inherited from the Android engine
When streams misbehave
The watchdog watches the audio, not the status

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.

📉

Silence is detected by counting

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.

Buffering never feeds the watchdog
🔁

Reconnect with a hard reset

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.

Timeouts: 20 s for HLS, 15 s for ICY
⏳

A 5-second buffer

Long enough to ride out a hiccup, short enough that pressing play does not feel broken. The number came out of measurements, not taste.

ICY network cache
Why this is written down at all: the rules above were paid for on the phone version — in a car, where a stream that quietly stops is not a bug report but a silent radio on a motorway. The Linux version kept them rather than starting over: the engine is the same code, and the same state tester runs against it.
Sound
A real 10-band equalizer

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 Hz – 16 kHz

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.

💾

Presets as files

Saved to Documents/RadioA/EQ, loaded from there, shared with the other versions. Removing the package never touches them.

⚡

Attached before playback

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.

The package
A .deb you can check yourself

.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.

🔏

Signed sums, as distributions do 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.

sha256sum + gpg
🧹

Removing it leaves your files

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.

🚫

No background service

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.

What leaves your computer
Only what a radio has to send

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.

📁

Your files, in the open

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.

📜

Licences in the package

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.

Honest assessment
What it does well — and what it doesn't

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.

✅ Strengths
🔊
One engine for every streamLibVLC handles ICY, MP3, AAC, Ogg and HLS — no hybrid, nothing to configure
🛡️
Failure handling built for carsReconnect and a watchdog that counts audio buffers, brought over from the Android app
🐧
Behaves like a Linux programResizable window, two-column player, system tray, keyboard shortcuts, media keys and the sound applet through MPRIS
🎚️
Equalizer inside the audio pipelineWorks on every format, presets shared with the other versions
💾
Files you can readPlaylists in PLS and JSON, in Documents, portable between all three versions
📦
A plain .debNo runtime to install first, dependencies through apt, signed checksums
🤫
No telemetry at allNo analytics, no crash service, no account
🎨
Skins and VU metersSix colour skins plus custom colours, five measuring VU styles, a Vintage hi-fi style with needle meters
🆓
Free, no adsNothing is sold, nothing is shown, nothing is tracked
⚠️ Limitations
🧪
A young versionExpect rough edges, and please report them on GitHub
🔄
The first install is by handOne .deb from the Releases page; after that, new versions come through apt
💻
amd64 and .deb onlyNo ARM or 32-bit build, no Flatpak, Snap or RPM
🔍
No built-in station catalogueSix example stations to start with; the rest you add yourself, import from a playlist or find through fmstream.org in your browser
☁️
No cloud syncPlaylists live on the machine; moving them is a file copy
🎙️
No podcastsLive streams only — no RSS feeds, no episode lists
📼
No recordingThe app plays streams, it does not save them
🚗
None of the car featuresAndroid Auto, the Bluetooth media session and the Wi-Fi to mobile-data switch belong to the phone and were not ported
👤
One developerUpdates arrive when there is time to make them
Android, Windows and Linux — full table
FeatureAndroidWindowsLinux
Audio engineLibVLC + ExoPlayerLibVLC onlyLibVLC only, from the system
ICY metadata and cover artyesyesyes
10-band equalizer with presetsyesyesyes
Skins, VU meters, sleep timeryesyesyes
PLS / JSON playlists, same formatyesyesyes
Reconnect and watchdogyesyesyes
Keeps playing in the backgroundforeground servicesystem traysystem tray
Keyboard shortcuts and media keys—yesyes (MPRIS)
Resizable window, two-column player—yesyes
Mouse: wheel volume, drag to reorder—yesyes
Android Autocertifiednot applicablenot applicable
Wi-Fi → mobile data fallbackyesnot applicablenot applicable
DistributionGoogle PlayMicrosoft Store.deb from GitHub Releases, then apt
🐧

Want to try it?

Free, no ads, no tracking. A .deb for amd64, your playlists stay yours.

📦 Download 📱 Android version