onda — wander the airwaves. An ethical, privacy-minded internet-radio TUI in the spirit of Radio Garden: browse stations by place, search, add your own, and listen — streaming directly from broadcasters, with nothing hosted, recorded, or rebroadcast by us. (onda is "wave" in Portuguese, Spanish, and Italian.)
Status: early v1. The bundled offline station list is a small starter set pending a full public-domain import (see Data sources).
![]() |
![]() |
![]() |
![]() |
onda behaves like a browser pointed at a stream you chose. It connects you
directly to the broadcaster's public server.
- No recording, ever.
- No geo-unblocking — region-locked streams simply fail.
- No proxy, no rebroadcast — one direct connection, nothing re-hosted.
- Silent by default — popularity tracking defaults to
never, soondareports nothing about what you listen to. You can opt in (opt-in/opt-out) in settings to contribute to community rankings if you want. - Local-only data — favorites, custom stations, config, and (opt-in) play history never leave your machine. No telemetry.
- Public-domain data — station data comes from the public-domain Radio Browser project plus a bundled CC0 list.
Streaming inherently exposes your IP to the broadcaster, the same as any
internet-radio app. Search is opt-in local. By default onda searches
Radio Browser over the network as you type (debounced — one query per typing
pause), exactly like other clients. If you opt in — from the first-run prompt,
the hint shown after a search finds nothing, or Settings — onda downloads the
full public station directory once (~30 MB, in the background with a live
progress readout) and from then on searches that local copy: it becomes
typo-tolerant (so raido eins still finds Radio Eins) and your queries are
not sent anywhere as you type. The local list refreshes about once a week,
or on demand with R. Turn it off anytime in Settings; the cached list is a
plain file you can delete.
onda runs on Linux, macOS, and Windows. It requires
mpv on your PATH for playback.
brew install pedrosousa13/tap/ondaThis also installs mpv.
scoop bucket add pedrosousa13 https://github.com/pedrosousa13/scoop-bucket
scoop install onda
scoop install mpvgo install github.com/pedrosousa13/onda@latestInstall mpv separately (brew install mpv, scoop install mpv, or your
distro's package manager).
Download the archive for your platform from the
Releases page and put onda
on your PATH. Ensure mpv is installed.
onda checks GitHub once a day for a newer release and shows a one-line banner when one is available. How you update depends on how you installed it:
- Homebrew:
brew upgrade --cask onda - Scoop:
scoop update onda - Prebuilt binary: press u on the banner to update in place — onda
downloads the matching release archive, verifies its SHA256 against the
release's
checksums.txt, and atomically replaces itself. Press U to dismiss the banner.
The check is a single request to the public GitHub API (no account, no token).
It's on by default; turn it off in settings (, then 5). Releases are
checksum-verified today; cryptographic signing is a planned follow-up.
Launch:
ondaBrowsing / favorites
| Key | Action |
|---|---|
↑/↓ or k/j |
Move selection |
enter |
Play selected station |
s |
Stop |
+ / - |
Volume up / down |
[ / ] |
Higher / lower bitrate (when a station offers several) |
f |
Toggle favorite on selected station |
F |
Show favorites |
r |
Recently played (when play history is on) |
c |
Clear play history (in the recents view) |
p |
Popular (top-voted worldwide) |
R |
Refresh the local station list from Radio Browser |
esc |
Back to Home |
/ |
Search |
b |
Browse by country / genre / language |
o |
Sort browse list (votes / name / trending) |
O |
Reverse sort order |
a |
Add a custom station |
, |
Settings |
u / U |
Update onda (when offered) / dismiss the update banner |
esc |
Back to browse |
q |
Quit |
Mouse — the scroll wheel moves the selection, a click selects a station, and clicking the selected station again plays it. Hovering marks the row under the cursor. (Keyboard remains fully supported; the mouse is optional.)
Search — results appear as you type, instantly, from a local copy of the
directory (no network round-trip, works offline). Use ↑/↓ to pick a result
and enter to play it; esc cancels.
One search box covers station name, country, and genre/tags — there are no prefixes or modes, just type what you know:
- By name —
kexp,radio eins - By country —
japan,portugal(country name, as Radio Browser labels it) - By genre / tag —
jazz,lo-fi,techno,news
Results are ranked best-match-first across all three fields, and small typos are
tolerated — raido eins still finds Radio Eins. The local list refreshes
from Radio Browser automatically about once a week; press R (in Home or a
browse list) to refresh it on demand.
While a stream connects, the now-playing panel shows connecting…, then the
song title once audio starts — or a clear message if the stream can't be reached.
Add a station — tab (or ↑/↓) to move between name, URL, and
bitrate (optional); enter to save; esc to cancel. Custom stations are saved
locally and appear alongside everything else.
Settings — 1 cycles audio quality (highest / balanced / lowest), 2 cycles
popularity tracking (never / opt-in / opt-out), 3 toggles play history, 4 cycles
the theme, 5 toggles the daily update check, 6 toggles live search
(search as you type; off → enter-to-search), 7 toggles loudness
normalization (evens out volume jumps between stations; off by default, applies
live); esc to go back. Changes are saved immediately.
Recently played — when play history is on (settings 3, off by default),
the stations you play are remembered locally and listed under r (newest first,
de-duplicated). The latest few also surface as a recent section on Home, above
your favorites. It never leaves your machine; c in the recents view clears it.
When a station offers multiple bitrates, onda auto-picks per your quality
setting (default: highest).
On launch you land on Home — your now-playing panel, a recent section when
play history is on, plus your favorites (or a Popular preview, the top-voted
stations worldwide, until you've saved any).
From anywhere: esc returns Home, p opens the full Popular list, F favorites,
b browse by country/genre/language (with o/O to sort), or / search. Browse and Popular
read the local station catalog and are richest once you've downloaded the full offline directory (see Settings / live search).
Popular comes from Radio Browser's open ranking — reading it reports nothing about you.
Switch in settings (, then 4). Bundled: Catppuccin (Mocha, Macchiato,
Frappé, Latte), Dracula, Nord, Gruvbox. Default is Catppuccin Mocha;
your choice is saved to config.toml.
Config and data live under your OS config directory (resolved via Go's
os.UserConfigDir):
- Linux:
~/.config/onda/ - macOS:
~/Library/Application Support/onda/ - Windows:
%AppData%\onda\
Files:
config.toml—quality(highest|balanced|lowest),tracking(never|opt-in|opt-out),history_enabled,theme,update_check(daily update check;trueby default),live_search(search as you type;trueby default — setfalsefor enter-to-search),volume(0–100, restored on launch),normalize(loudness normalization;falseby default)favorites.json,custom.json— your favorites and added stationsrecents.json— your play history (only written whenhistory_enabledis on)
Everything onda persists lives in this one directory in plain TOML/JSON, so you can symlink or sync it with your dotfiles to carry your config and favorites across machines.
The local station list lives under your OS cache directory (os.UserCacheDir,
e.g. ~/.cache/onda/ on Linux) as a gzipped snapshot of the Radio Browser
directory. onda searches it locally and refreshes it from Radio Browser only when
it's older than 7 days or you press R. The update check caches its result
there too (update-cache.json), so onda hits GitHub at most once a day.
Defaults are privacy-first: quality highest, tracking never, history disabled.
Radio Browser is crowd-sourced and has no canonical station IDs, so the same
station often appears many times (different bitrates, (Hi-Fi)/(metadata)
suffixes, broadcaster prefixes like RTP , punctuation). onda merges these
heuristically — normalizing names and grouping by name + country, then offering
the distinct bitrates as a [ ] chooser. It's best-effort: a few stragglers may
remain rather than risk merging genuinely different stations. Perfect grouping
isn't possible without canonical IDs the source doesn't provide.
- Radio Browser — public-domain station directory
deroverda/recommended-radio-streams— CC0 bundled station listmpv— audio playback backend- Charm — Bubble Tea & Lip Gloss, the TUI foundation
Requires Go 1.25+ and mpv.
git clone https://github.com/pedrosousa13/onda
cd onda
go build -o onda .
./ondaRun the tests with go test ./... (add -race if your Go has a C toolchain).
MIT © 2026 Pedro Sousa



