WaveShark

app.waveshark.io · WebUSB · nothing to install

WaveShark in the browser

The same receiver, compiled for the browser. Open app.waveshark.io in Chrome or Edge, plug in a radio and hand the page the dongle. Every decoder runs on your own machine, and nothing is uploaded or installed.

This is not a web page talking to a receiver on a server. The whole program, decoders, signal chain and views, is compiled to WebAssembly and runs on your processor, spread across Web Workers the way the desktop build spreads across threads. The radio is driven over WebUSB by the same USB driver the desktop build uses, so an RTL-SDR, a HackRF or an Airspy opens with no library installed at all.

A radio on the desk is one way in. The other is a tuner somebody is sharing: the IQStream directory is read straight from nostr, and a station opens as a radio over WebTransport or WebRTC, which are the ways a page is allowed to reach a machine it has never met. The public tuners map is the same list.

Settings, memories and downloaded datasets are kept in the browser’s own storage, so a second visit opens where the first one left off, on the radio it was using. A capture opens from a file, and a HackRF transmits from the page as it does from the desktop.

A page is not allowed everything a program is. It cannot open a plain socket, so rtl_tcp, SpyServer and KiwiSDR tuners, the packet feeds and Home Assistant stay on the desktop. There is no speech model, no MCP server and no device survey, and pictures and sound off a broadcast multiplex need the ffmpeg only the desktop build carries.

First run

  1. Open it in a Chromium browser

    Chrome, Edge, Brave or Opera on a desktop. Firefox and Safari have no WebUSB, so a radio cannot be handed to them.

  2. Give the page the radio

    Pick Add USB device… in the radio list and choose the dongle in the browser’s prompt. The browser remembers the choice for this site, so it is asked once.

  3. Or open somebody else’s

    Add remote… has FIND, which lists the public IQStream tuners that answer a browser, and TUNE opens one as a radio. A tuner on the public tuners map opens straight into the app from its card.

  4. Press play

    It opens on the dashboard and the dial starts at 433.92 MHz. Click the spectrum to place a channel and listen.

Drivers, once

A browser asks the operating system for the device the same way any program does. On Windows that means WinUSB bound to the dongle with Zadig, exactly as for the desktop build. On Linux your user needs the udev rules, and an RTL-SDR needs the kernel’s television driver kept off it, because a page cannot take the device back from the kernel the way the desktop build does. The distribution package brings both. macOS needs nothing.

$ sudo apt install rtl-sdr

Letting a browser reach your tuner

A station listed from WaveShark answers a browser with nothing else to set up. It offers WebTransport on the port after its own and lists the hash of its certificate, and it answers WebRTC offers sent to the listing’s key over nostr, with the samples arriving on the UDP port it already uses. One behind a proxy with a real certificate can be added by its wss:// address instead. A wave1090 box does the same with --iqstream-webtransport and --iqstream-webrtc.

$ wave1090 --iqstream-listen 5555 --iqstream-list \
    --iqstream-webtransport 5556 --iqstream-webrtc

Links that open a tuner

The command line flags go in the address. stream opens a tuner as the radio, and anything else the desktop build takes on its command line, such as tune or span, rides along beside it, so a link to your own station can open it already listening. A listed station is reached by its key over WebRTC, and a WebTransport address carries its certificate hashes.

https://app.waveshark.io/?stream=webrtc://<listing key>&tune=1090

Want the whole receiver?

The desktop build has every radio, every remote protocol, speech to text and the agent server, on Linux, Windows and macOS.

Download WaveShark