WaveShark

433.920 MHz · span 2400 kHz · 45 scanners running

Wireshark for the radio spectrum

Leave a cheap dongle on a band and WaveShark tells you what is transmitting around you, instead of what is on the one frequency somebody already told you about.

GPL-3.0 · RTL-SDR, HackRF, Airspy, LimeSDR, PLUTO · no account, no cloud · source

TIMEFREQMODSNRDECODED AS

    The dial is where you look. The span is what you collect.

    Decoding does not follow the dial. Every scanner inside the sampled span runs all the time, so a sensor that transmits once a minute is caught whether or not you were pointing at it when it fired.

    Everything heard goes in the list along the bottom, decoded or not: frequency, modulation, RSSI, SNR and what was made of it. Click a row for its envelope, its instantaneous frequency and a hex dump. A burst nothing claims still gets its coding inferred and its bits sliced out, which is enough to recognise the same device again and start reversing it.

    app.waveshark.io

    Or skip the download

    The same receiver is compiled for the browser. Open app.waveshark.io in Chrome or Edge, plug in an RTL-SDR, a HackRF or an Airspy and hand the page the dongle over WebUSB. The decoders run on your own processor, across every core, and nothing is uploaded.

    No radio? The page reads the public tuner directory from nostr and opens somebody else’s antenna over WebTransport or WebRTC. What the browser version can and cannot do.

    The ones with nowhere else to go, first

    What it hears

    • 2.4 GHz

      Wi-Fi and drones

      802.11a/g/b and single-stream n: network names, the addresses talking, the rate each frame arrived at and whether an address is randomised. A drone broadcasting Remote ID gives up its serial, position and operator, and a DJI airframe gives up its home point too. Needs a HackRF or a LimeSDR, since one channel is 20 MHz wide.

    • UHF and Ku band

      Television

      A DVB-T multiplex, or a DVB-S2 transponder off a dish and LNB, read from its carriers down to its transport stream: the transmission parameters, every programme with now and next, and whichever one you pick playing in the window with its sound in step.

    • Band III and shortwave

      DAB and DRM

      A DAB ensemble and the stations in it, with the one you pick playing, DAB or DAB+, and a DRM multiplex on shortwave or medium wave with its services, languages and labels.

    • 390-400 MHz

      TETRA

      The network, its cells and who is called, with clear calls heard as speech and a call carried by several sites listed once. The tea feature links the ciphers and a wgpu key search, so an enciphered channel can be worked on rather than only counted.

    • 136-174 / 400-470 MHz

      P25 and NXDN

      P25 phase 1 gives the talkgroup, the radio id and the key a call is under. NXDN on the 12.5 and 6.25 kHz channels gives the system number, who called whom and whether the speech is enciphered, and the speech itself in a build with the ambe feature.

    • 2.4 GHz

      Bluetooth LE

      Advertising, Bluetooth 5 Long Range included, and Open Drone ID carried in it.

    • 2.4 GHz

      Zigbee, Thread and Matter

      IEEE 802.15.4 under all three: the addresses talking and the networks they belong to, on the channel each sits on, and under Zigbee each hop’s EUI-64 and vendor and the key in use.

    • 868 / 908 MHz

      Z-Wave

      Door locks, sensors and plugs at 9.6, 40 and 100 kbit/s, on the European and US channels.

    • 700 MHz - 2.7 GHz

      GSM and LTE

      Every cell on every carrier in the span: network, cell id, location or tracking area, band, bandwidth and level, drawn as hexagons on a map of the towers around you. GSM adds who a page is calling and the channel a phone is sent to.

    • 2.4 GHz / 868 / 915 MHz

      RC links

      ExpressLRS with the sticks read live on the control view, plus FrSky ACCST, FlySky AFHDS-2A and XN297 remotes, address and payload included.

    • Any band

      Voice

      WFM with stereo and RDS, NFM, AM, USB, LSB and CW, several channels at once, with a noise blanker, noise reduction and an auto notch on the strip, and a local Whisper or Qwen3-ASR model writing the words down as they are spoken. Every over can be kept as Opus and played back from the call list.

    • 1.2 / 2.4 / 5.8 GHz

      FPV video

      An analogue camera’s picture straight off the span, PAL or NTSC, in colour, with its audio subcarrier heard alongside, named with its channel: R1, F4, A5. A Walksnail Avatar digital link gives its channel, frame rate, modulation and MER, and the goggles’ bursts.

    • 144.500 MHz

      SSTV

      Martin 1 and 2, Scottie 1, 2 and DX, Robot 36 and 72, drawn line by line as they arrive and saved to disc when the picture ends.

    • 137 MHz and HF

      Weather satellites

      NOAA APT passes and Meteor-M LRPT, drawn on the video pane as they come down, plus HF weather fax charts. The satellites view has the passes over the station for the next day, and listening follows the downlink through Doppler until the satellite sets.

    • 400-406 MHz

      Radiosondes

      Vaisala RS41, Graw DFM, Meteomodem M10 and M20, iMet, Meisei, MRZ and LMS6 balloons on the map with serial, height, climb rate and the air they were sent up to measure. The channel follows the transmitter as it drifts, and launch sites from SondeHub say when the next one goes up.

    • 131.5 / 136.7 - 137 MHz

      Airline datalink

      ACARS on the airband channels and VDL Mode 2, the datalink most European traffic uses: the aircraft, the flight and the message it sent to the ground. Inmarsat Aero brings the satellite side of the same traffic off an L-band patch, the 10500 bit/s long-haul channels included.

    • 1090 / 978 MHz

      Aircraft

      ADS-B and Mode S onto a map with a track table: callsign, altitude, speed, track, position. UAT at 978 MHz adds light aircraft and the ground stations’ weather and traffic uplink.

    • Marine VHF and L band

      Shipping

      AIS positions and vessel identity, on the same map as the aircraft, with Inmarsat STD-C carrying the EGC and SafetyNET broadcasts sent to them.

    • 406 MHz

      Distress beacons

      COSPAS-SARSAT EPIRB, PLB and ELT identities, with the position they encode drawn on the map.

    • 433 / 868 / 915 MHz

      ISM devices

      About 130 device descriptions, most from rtl_433’s family. Weather stations, thermometers, TPMS including Ford and Renault, door contacts, gate remotes, security sensors, shelf labels, mostly with a stable device ID you can follow.

    • 868.95 / 915 MHz

      Utility meters

      Wireless M-Bus mode T with manufacturer, meter number, version and type, and Itron ERT SCM, SCM+ and IDM readings on the US band.

    • 433 / 868 / 915 MHz

      LoRa mesh

      LoRaWAN join requests and addresses, Meshtastic text under the public keys, MeshCore adverts.

    • Amateur VHF and UHF

      M17 and DMR

      Who called whom, for how long, and on which talkgroup. M17 packet messages arrive in full with Codec 2 speech; DMR speech needs the ambe feature.

    • 144.800 / 144.390 / 144.640

      APRS and packet

      Packet stations and vehicle trackers, Mic-E included, on the EU, US and JP calling frequencies. A KISS TNC on --kiss-listen hands the same traffic to any packet program, and keys AX.25 back through the radio.

    • Wherever you point it

      Pagers and tones

      POCSAG at 512, 1200 and 2400 bit/s and FLEX at 1600 and 3200 baud, message text in clear, plus the two-tone pair that opens a fire or ambulance pager and the MDC-1200 unit id a Motorola radio sends when its key goes down.

    • HF and VHF

      Morse and teleprinter

      A CW channel read as text at the speed it was sent, and RTTY in Baudot from 45.45 to 200 baud, either way up. EAS and SAME alert headers are read on the seven NOAA Weather Radio channels.

    • On a radio that can

      Transmit

      A microphone, a tone or a recorded capture into NFM, WFM or AM, keyed by hand or by voice, and six protocols this receiver already reads sent back out: POCSAG pages, APRS beacons, RTTY overs, BLE advertisements, SSTV pictures and RDS names. An over can end on a Quindar tone or the roger beep of a real radio, Flipper .sub files key at the frequency they name, and a whole DVB-T multiplex can be built from any file ffmpeg can open.

    ISM coverage is the thin part: rtl_433 has roughly 250 device decoders and matching it is the job. Each protocol has a page of its own saying what it gives you, and the band guides say what is transmitting where. The registry is every protocol the receiver can reach, and the changelog is what landed last.

    WaveShark decoding a weather station on 433.92 MHz: spectrum and waterfall above, packet list below.
    Decoding a weather station on 433.92 MHz. The tab strip swaps the spectrum for the signal chain, the map and its track table, the call list, the transcript, the messages, the picture or the keys.

    Ten tabs, Ctrl and a digit for each, Ctrl+` to go back

    Sixteen views on one stream

    Every decoded frame arrives in one place, and each view is a different reading of it. None of them knows a protocol: a DMR call, a TETRA call and an M17 call are the same row with different fields filled in, and an aircraft, a vessel and a mesh node are the same track. The packet list runs along the bottom of all of them, newest last, with the selected burst’s envelope, instantaneous frequency and hex dump beside it.

    DashboardSpectrumSignal chainCallsTranscriptMessagesVideoMapDevicesTrilaterationData linksChannelsControlKeysSatellitesAgent

    What each view holds, from the dashboard a fresh receiver opens on to the satellite passes nobody has heard yet.

    One receiver, a different antenna and a different dial

    What people use it for

    All 14 use cases, from a device survey to letting an agent drive the radio.

    MCP on the loopback, and MQTT to the house

    Something else can drive it

    Every run serves the receiver over the Model Context Protocol at http://127.0.0.1:8931/mcp. It is the receiver on the screen, not a second one: what an agent tunes, opens or switches on appears in the window, and it can take a picture of that window to see what it did. It reads the spectrum, the packets, the calls, the transcript and the tracker, changes anything in the signal chain and draws the chain itself, and it reaches the settings: the scanner table, the memory bank, the station and the datasets. --mcp-listen off stops it listening.

    A channel’s transmit source can be the agent itself. Give it a name and it answers when called: it hears the over, replies in its own voice and keeps the conversation going for half a minute without being named again.

    Point --ha-broker at the MQTT broker Home Assistant already uses and every transmitter the decoders can name becomes a device there: a weather station’s temperature and humidity, a meter’s reading, a tyre sensor’s pressure, and the level each was heard at. --ha-spaces ism,wmbus keeps it to your own sensors and meters rather than a street full of passing phones.

    Five radios, and any number over the network

    Hardware

    • from about €30

      Any RTL2832U dongle

      Does the narrowband half of this page, driven by WaveShark’s own USB driver with no librtlsdr. On Linux the rtl-sdr package brings the udev rules; on Windows, bind WinUSB with Zadig first.

    • R2, Mini, HF+

      Airspy

      The R2 and Mini give the dongle’s range four times the span at 12 bit. The HF+ and HF+ Discovery read shortwave with no upconverter. No libairspy either.

    • 1 MHz - 6 GHz

      HackRF One

      Spans wide enough for Wi-Fi, Bluetooth LE, DroneID, LTE and television, a transmitter, and a bias tee for a mast head amplifier.

    • USB and Mini

      LimeSDR

      Both of those below 3.8 GHz, plus full duplex and a span that holds two satellite transponders, on Linux, macOS and Windows.

    • USB or network

      ADALM-PLUTO

      Full duplex up to 4 MS/s, plugged in or sitting at the mast on the network.

    • --stream <host>

      A tuner on another machine

      IQStream, rtl_tcp, SpyServer and KiwiSDR servers show up as local radios, and the public ones are listed on a map. This receiver serves IQStream too, and several matching tuners stitch into one wider span.

    Capture once, decode forever

    A capture that decodes is a test fixture

    --record writes each burst as an rtl_433 style capture, so both WaveShark and rtl_433 can read it back. Capture a band once, then replay after every change: no radio, same answer every time.

    $ waveshark --tune 868.3 --record captures
    $ waveshark --replay captures
    
    --tune <mhz>          start tuned and listening
    --mode <mode>         wfm, nfm, am, usb, lsb or cw
    --span <khz>          nearest span, narrowed in software
    --stream <host>       read a remote tuner: iqstream, rtl_tcp, spyserver, kiwisdr
    --iqstream-listen     serve this span to another machine, or a browser
    --headless            run with no window, scanning and logging
    --mcp-listen <addr>   where to serve MCP, or off
    --kiss-listen <addr>  serve a KISS TNC to packet software
    --ha-broker <host>    publish what is heard to Home Assistant
    --survey              keep a database of devices and where
    --print-log           print every packet as it arrives

    Status

    Checked against other people’s decoders

    97 recordings from rtl_433’s corpus are replayed field for field against what rtl_433 25.02 made of them, plus ADS-B against dump1090, ACARS against acarsdec, VDL Mode 2 against dumpvdl2, SSTV against colaclanth’s decoder, DAB against welle.io and a radiosonde against SDRangel. Off-air captures of M17, DMR, TETRA, Meshtastic, LTE and DVB-S2 are checked against what the transmission itself says.

    About 130 ISM device descriptions where the goal is hundreds is the part that needs to grow. The code is the documentation: crates/app/src/chain.rs draws the graph the receiver runs.

    GitHub Sponsors

    Support the work

    WaveShark is GPL-3.0 and free, with no account and nothing phoning home. Sponsorship pays for the radios, the test gear and the hours that go into the next batch of decoders.

    Not in a position to sponsor? Filing a good bug with a capture attached is worth just as much, and a decoder that is wrong on real signals is the most useful thing you can send.

    Plug in a radio and press play.

    It opens on a dashboard, and the dial starts at 433.92 MHz where the devices it decodes are.

    Download WaveShark