Vibe-coded, but not slop. A whole SDR ecosystem optimised for mobile that scales from a tiny Apple Watch to a large desktop. And with VibeServer, share your radio with the world from a spare Android phone or a Linux box in a drawer.
π β Share yours
Every receiver on that list is somebody's spare dongle. A Raspberry Pi, an old Android phone, a Linux box in a drawer β plug a radio in, run VibeServer, and anyone can listen from a browser. It takes about five minutes, and the more of us who do it, the better the map gets.
| π¬ Discord | Where the testing, the bug reports and the DX chat happen. |
| π€ Android test group | Join this to get the Android app from Play. |
| π± VibeSDR on the App Store | iPhone + iPad, with the Apple Watch remote included. |
| β VibeSDR Jr on the App Store | The standalone Apple Watch receiver β no phone involved. |
| π₯ VibeServer downloads | macOS app, and apt for Linux. |
| π vibesdr.net Β· demo receiver | The site, and our own radio to try right now. |
Building it yourself is free, forever β the App Store price is Apple's fee, not a paywall.
Four things that share one DSP engine and one design:
- The app β iPhone, iPad and Android. Connect to a shared receiver, or plug an RTL-SDR straight into an Android phone and run the whole radio on the handset.
- The watch β the live spectrum drawn on the watch, tuned with the Digital Crown. Either as a remote for your phone, or as Jr, a standalone receiver with its own connection and audio.
- VibeServer β turns a Raspberry Pi, a Linux box, a Mac or a spare Android phone into a
receiver anyone can listen to in a browser. Roughly 25Γ lighter on the wire than raw
rtl_tcp. - The web client β served by VibeServer itself. No install, works on any modern browser.
It speaks UberSDR, OpenWebRX / OpenWebRX+, KiwiSDR, FM-DX Webserver, SpyServer, plain rtl_tcp, and its own VibeServer protocol.
Most SDR clients are a socket and a picture β they ask the server for a waterfall image, put it on screen, and tune with a slider. If that's the category, VibeSDR isn't in it.
- It renders its own waterfall, from raw FFT bins in a GPU shader, synthesising the lines between data frames and repainting your whole history the instant you change a palette.
- It demodulates on the device. A clean-room ARM-NEON DSP engine written from scratch β no SDR++, no FFTW, no VOLK β with true Weaver SSB, FM stereo with a 19 kHz pilot PLL, RDS, and MMSE noise reduction.
- The tuning is a flywheel with mass, detents and speed-adaptive haptics, not a slider. It's modelled on an analogue dial because that's what it's meant to feel like.
- The waterfall runs on your wrist. Not media buttons β the real spectrum, about a third of one CPU core, phone locked in your pocket.
Judge it on the feel. That's the part a screenshot can't show, and the part we care most about.
VibeServer shares one or more receivers to anyone with a browser, with server-side DSP, compressed audio, an optional PIN, per-band gain ceilings and session limits. It runs on a Raspberry Pi, any Linux box, a Mac, or an Android phone with the radio plugged into it.
Linux (arm64 and amd64):
curl -fsSL https://apt.vibesdr.net/KEY.gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/vibesdr.gpg
echo "deb [arch=arm64,amd64 signed-by=/usr/share/keyrings/vibesdr.gpg] https://apt.vibesdr.net stable main" \
| sudo tee /etc/apt/sources.list.d/vibesdr.list
sudo apt update && sudo apt install vibeservermacOS β download from the latest release, unzip, drag to Applications. Notarised, so it opens without a Gatekeeper warning.
Android β install the app, plug in the radio, tap Use as server.
![]() |
|---|
| A rugged Android phone and a Β£30 dongle, serving to the world β a listener connected, 8 KB/s of audio, and a public address that stays the same. |
Supported hardware β four radios, though not all of them on every host:
| Radio | Linux Β· macOS | Android |
|---|---|---|
| RTL-SDR β all the usual dongles, including the Blog V4 | β | β |
| Airspy HF+ β Discovery and Dual Port | β | β |
| SDRplay RSP β needs SDRplay's own API installed | β | β |
| HackRF One β |
β | β |
SDRplay is desktop-only because the RSP API is SDRplay's own closed-source library and there is no Android build of it β nothing we can fix at this end. On a phone, use one of the other three.
The HackRF is experimental: nobody on the VibeSDR side owns one, so the driver was written from the documentation and has been tested by a single listener. It works β FM stereo with RDS, the lot β it just has not had the miles the other three have. Reports very welcome.
Optionally publish your receiver to the public directory through a Cloudflare tunnel β your home address is never exposed.
β¦and this is what the listener gets, in a browser, with nothing installed:
![]() |
|---|
| The web client on a Mac, on a Raspberry Pi's dongle: server-side DSP, the waterfall drawn from raw bins, and the Advanced RDS analyser reading a station's pilot deviation and constellation. |
It's in the name. VibeSDR is vibe-coded β one curious listener working with Claude β and it's called that on purpose, so nobody has to discover it, suspect it, or be told by someone in a comments section.
The scepticism is earned, though. There's a pattern about: a closed-source app, an AI-generated feature list longer than one person could have tested, decoders that "work" with no antenna plugged in, someone else's GPL code quietly folded in without credit, and a price on the end. That's not a tooling problem β it's an honesty problem, and the AI made none of those choices.
So the fix isn't to hide the tooling. It's to be checkable:
- The source is open. GPLv3, all of it. The store binary is this tree.
- Everyone who contributed is credited and the licences are honoured β see Credits.
- Nothing is claimed that isn't there. Every feature here exists, on a device, used on the air. Find one that doesn't work and that's a bug I want β open an issue.
- It leaves features on the table on purpose β no DAB+, DRM, HD Radio or DMR, because those codecs are patent-encumbered, and no WebSDR, because its author doesn't sanction third-party clients. Both cost real features. Saying no is the expensive option, and the one nobody fakes.
Not a spec sheet β the devices every feature has actually been driven on, on the air:
| iPhone 17 Pro Max | the easy one, where everything works |
| iPhone SE (2nd gen) | a 2020 A13 with a 4.7β³ screen β the layout floor |
| Moto G35 Β· Galaxy XCover 4s | budget Android β the thermal and DSP floor |
| Galaxy Tab A9 Β· iPad Air 13β³ | tablet layouts, landscape decoders |
| Apple Watch Ultra | the wrist waterfall |
| Raspberry Pi 500 Β· x86 Linux Β· macOS | VibeServer hosts |
The ones that matter are the SE and the budget Androids. Anyone can test where everything already works.
![]() |
![]() |
![]() |
|---|
![]() |
![]() |
![]() |
|---|
![]() |
![]() |
![]() |
|---|
npm install
cd ios && pod install && cd .. # iOS only
npx expo run:ios # or: npx expo run:androidVibeServer builds with CMake from vibeserver/ (Linux and macOS) β see vibeserver/linux/INSTALL.md.
Design notes and specifications for individual features live in briefs/.
| Name | Role |
|---|---|
| Stuart Carr (Stuey3D) | UI/UX design, concept & testing |
| madpsy (M9PSY) | Creator of UberSDR β protocol, DSP algorithms (NR2 / noise blanker / WebSDR-NR), colour palettes, band plans and bookmark format |
| Phil Karn (KA9Q) | ka9q-radio β the SDR engine underneath UberSDR, and (GPL-3.0) the design reference for VibeSDR's front-end automatic gain: IF-power level targeting, proportional correction and snap-to-hardware-steps. Read and credited, never copied |
| John Seamons (ZL/KF6VO) | Creator of KiwiSDR |
| Jakob Ketterl (DD5JFK) & the OpenWebRX+ project | OpenWebRX / OpenWebRX+ servers |
| NoobishSVK & contributors | FM-DX Webserver + the servers.fmdx.org receiver map β protocol reference for the FM-DX backend and its 3LAS MP3 audio (GPL-3.0) |
| Hans van Eijsden (FMDX.org) | Calibration and validation of the Advanced RDS analyser against a Pira FM broadcast analyser β he found that our phase reading was its own reflection and that the deviation figures were scaled wrong, and kept testing until they agreed |
| Oona RΓ€isΓ€nen (windytan) | redsea (MIT) β the reference for VibeDSP's weak-signal RDS block recovery: syndrome-table burst correction, rhythm-based sync acquisition and error-rate sync dropping. No redsea code is used; the ideas are hers |
| Konrad Kosmatka | librdsparser β reference for the RDS PI + ECC β country mapping (IEC 62106) behind the RDS country flags |
| radio-browser.info | Community station directory used to look up FM-DX / RDS station logos |
| Osmocom / librtlsdr | RTL-SDR USB driver (Android local hardware + rtl_tcp) |
| Airspy | libairspyhf (BSD-3) β the Airspy HF+ driver |
| Great Scott Gadgets | libhackrf (GPL-2.0-or-later) |
| SDRplay Ltd | The RSP API β headers only; the closed-source library is never bundled |
| Mark Borgerding (KissFFT) | BSD-licensed FFT vendored in the VibeDSP engine |
| Karlis Goba (ft8_lib) | FT8 / FT4 decoding |
| Xiph.Org Foundation | Opus audio codec |
| Ethan Halsall | opus-decoder / wasm-audio-decoders (MIT) β libopus in WebAssembly, which is how VibeServer's web client decodes Opus on a plain http:// LAN address |
| EiBi | Shortwave broadcast schedules for live station bookmarks |
| Leaflet & OpenStreetMap | Map rendering and tiles |
| Braille Institute | Atkinson Hyperlegible typeface |
| Claude (Anthropic) | AI coding and development assistant |
| Expo, React Native, Hermes, Skia, Reanimated, Gesture Handler, OkHttp | App framework and native stack |
Why no WebSDR support? WebSDR is closed-source and its author has not sanctioned third-party clients. VibeSDR only implements platforms that welcome independent clients. Out of respect for that, WebSDR support will not be added.
Why no native DAB+, DRM, HD Radio or DMR? Patents, not difficulty. HD Radio is Xperi's; DAB+ and DRM need HE-AAC / xHE-AAC licensing; DMR, D-STAR, System Fusion and NXDN need the AMBE/IMBE vocoders (DVSI). Shipping unlicensed implementations in store builds is a risk VibeSDR won't take. Where an OpenWebRX server decodes those modes server-side, VibeSDR simply plays the PCM it sends β no codec ships in, or runs inside, the app. Codec2-based FreeDV and M17 are unencumbered and remain candidates.
Why do the skip buttons vanish on FM-DX? An FM-DX Webserver is one physical tuner shared by everyone connected β tuning it retunes it for all of them. Lock-screen and in-car skip buttons would let you change the station for people you can't see, so they're disabled out of courtesy. On the watch, the Crown is disarmed until you deliberately arm it.
No personal data, no analytics, no ads, no tracking. Location is optional and used only to sort
receivers by distance. See PRIVACY.md.
GNU General Public License v3. Redistribute and modify it under those terms; it comes with no warranty. Full text: https://www.gnu.org/licenses/gpl-3.0.html
Official App Store / Google Play builds carry an additional permission under GPLv3 Β§7 β see
APPSTORE-EXCEPTION.md. The complete source for every released build
stays here under the GPLv3.
UberSDR, OpenWebRX / OpenWebRX+, KiwiSDR and FM-DX Webserver are the property of their respective creators and subject to their own licence terms.










