RDS BRIDGE Decoding

Free · Open source · MIT · Built by M0EUK

RDS BRIDGE An FM RDS decoder that runs in your browser.

One HTML file. Download it, double-click it, and it opens in your browser and starts decoding. There is no installer, no server and no account — and nothing leaves your machine. It reads the RDS (and RBDS) off an SDRplay receiver through SDRConnect, off an IQ recording, off the composite MPX from any SDR application, or off a networked rtl_tcp or SpyServer radio. Hand it a band recording and it will map the whole thing as a picture, so an opening you slept through is something you can see — and leave it scanning overnight and it will save you a recording of every station it catches.

New to this? The guide walks you through it with pictures.
Grab index.html from the release. That's the install.
Needs a Chromium browser — Chrome, Edge, Opera or Brave. Firefox and Safari aren't Chromium.

The RDS Bridge interface decoding BBC Radio 3 on 92.100 MHz: programme service name BBC R3, PI code 0xC203, radiotext, an alternative frequency list, a live RF waterfall across the FM band, the MPX composite spectrum, the 57 kHz constellation, lock and quality read-outs, and a DX log.
Bridge in Normal view, decoding BBC R3 on 92.100 MHz from an RSPdxR2 via SDRConnect. Tap to enlarge.

What it is

An RDS decoder built for chasing weak signals

Bridge exists because catching a distant station is mostly a race against a signal that won't stay. It shows the identity as it firms up — programme service, PI, PTY, radiotext, alternative frequencies — and it shows you how much of that to believe, rather than presenting a guess as a fact.

The decoder runs an NDA open-loop acquisition front-end that feed-forwards symbol timing, so it locks weak FM signals from cold without hunting. That's the core of the project; everything else on the screen is there to tell you what it's doing.

DX log138 exports to CSV
92.10xC203 BBC R307:01:50
19.6 dB · pilot 100% · Q 75% · FEC 46% · 0.4s to ID · Serious Classical
88.10xC202 BBC R206:46:56  ×4
12.9 dB · pilot 99% · Q 56% · FEC 73% · 0.8s to ID · Easy Listening
88.50xC202 BBC R206:25:30  ×4
51.6 dB · pilot 99% · Q 92% · FEC 3% · 0.2s to ID · Pop Music

Every catch is logged with the numbers that let you judge it later — including how long it took to give up its ID.

Four ways in

Whatever your signal arrives on, Bridge decodes it

The four connection modes are the tabs down the left of the window. Pick the one that matches your setup — everything to the right of them works the same way.

SDRConnect

Straight to the radio

Bridge talks to SDRConnect over its WebSocket API on your own machine. Choose the device and the antenna, tune from the page, and watch the RF waterfall across the band. Bridge's decode sits alongside SDRConnect's own built-in RDS in the same window, so you can see the difference for yourself.

Best for: everyday DXing at an SDRplay RSPdx or RSPdxR2.

IQ File

Work the band after the event

Load an IQ recording and decode it as though it were live. The opening you recorded at three in the morning can be worked properly at the weekend — one frequency at a time, as many passes as you like, with the settings you wish you'd used. Or map the whole recording first and go straight to what was there.

Best for: post-processing band recordings; testing settings against a signal that never changes.

MPX Stream

Bring Bridge to the radio you already use

Feed Bridge the composite MPX from any SDR application through a virtual audio cable — SDR Console, SDR++, whatever you run — and it decodes the 57 kHz subcarrier out of the composite. The helper can tell Bridge what frequency you're tuned to, so the log comes out right.

Best for: a receiver or an application Bridge doesn't talk to directly.

Network SDR

A radio in the loft, a decoder at the desk

The helper connects to an rtl_tcp or SpyServer source on your network and streams the IQ to Bridge. With SpyServer it also relays a wideband FFT, which Bridge paints as the RF waterfall. rtl_tcp doesn't offer one, so you get the decode without the waterfall.

Best for: an RTL-SDR in the loft, or a SpyServer that isn't next to the computer.

Recordings, mapped

See a whole recording at once

A band recording holds far more than you heard while it was playing. The band map turns one into a picture — time running down the page, channels running across, each cell showing how far that channel stood above its own noise floor at that moment. A two-minute opening on 90.7, half an hour in, becomes something you can see rather than something you had to be listening for.

Build

Seconds, not a re-listen

The map samples the file rather than reading it end to end, so even a very large capture maps quickly. A 66 GB, 32-minute, 9 MHz recording built a 91-channel by 396-row map in about 1.4 seconds on an Apple Silicon Mac mini — that machine's figure, not a promise about yours.

Best for: finding out what is actually in a recording before deciding how to work it.

Click

Straight to the moment

Click any cell and the recording seeks to that time, tunes that channel and starts playing with the audio armed. A playhead marks the time you're at and the channel you're on, follows the playback, and gets out of the way as soon as you scroll off to read the map.

Best for: working the lit cells one at a time instead of hunting for them.

Loop

Another go at a marginal signal

Mark a start and an end and loop that stretch of the recording, with the looped section drawn on the map. Each pass starts a fraction of a second later than the last and works through a short list of channel bandwidths, so every lap is a genuinely independent attempt rather than a rerun — and the station assembles across them, character by character, at the strength of its evidence.

Best for: a station that nearly identified itself and then faded.

Work the whole band

Let it find the stations for you

In SDRConnect mode Bridge can sweep the FM band on its own. It reads the carriers off the RF spectrum, tunes each one, and logs the ones that actually decode RDS — through the same PI commit guard as everywhere else, so a scan can't invent a station. Catches stream into the DX log as it goes, strongest first.

Full band

One pass, everything logged

Sweep the band once from 87.5 to 108 and log every station it finds. The quickest way to see what's actually on air right now, without touching the dial yourself.

Best for: a snapshot of the whole band, or checking an opening as it builds.

DX watch

Loop the band, chase what's new

Sweep the whole band on a loop, skipping your skip-list, your locals and the channels it has measured as empty — so each pass spends its time on what's changing. A channel that shows a pilot is never set aside, and neither is a signal you've already caught.

Best for: leaving it running through an opening to catch stations as they surface.

Watch list

Keep an eye on your spots

Rapid-loop just the frequencies you name — the clear DX spots you want checked often — with the odd full-band sweep folded in so you don't miss an opening somewhere else.

Best for: monitoring a handful of known frequencies for the moment a distant station comes up.

It can save you the audio, too

Point the scan at a folder and tick one box, and every station it identifies gets a short WAV written into it. The scan keeps listening for a few seconds after the catch, so what you get is the station saying its name rather than the instant its PI decoded — and one clip per station per scan, so a night's worth is the number of stations you caught, not the number of channels it checked. Your speakers stay off if they were off.

And it can work each of your antennas in turn

If your SDRplay receiver has more than one antenna port, Bridge will remember what each one needs — its RF gain and its spectrum scale — and put those settings back whenever it switches to it. Tick two or more ports and a scan sweeps each in turn: a looping scan cycles round them, a full band sweep does one pass on every antenna and stops. Every catch is logged against the port that heard it, and clips are written per port, so you can compare the same station on both. Each port keeps its own record of which channels were dead, so a channel written off on one antenna is still checked on the others — that is the whole point, and it means early passes take longer than a single-antenna scan.

One thing Bridge can't do: SDRConnect's interface doesn't let any application read or set the IF gain, so that one is yours to set. Bridge shows you what each port would ideally have and tells you when you've switched to one that wants something different. In practice one IF setting that suits all your ports is the simplest arrangement.

The scan needs a live SDRConnect stream with hardware control, because it tunes the radio for you — press Start first. The decoder is the detector: every catch is a real RDS decode through the normal commit guard, never a guess from the spectrum.

On screen

What Bridge shows you

The same read-outs in every mode. Five display densities — Compact, Essentials, Pano, Normal and Advanced — so you can strip it back to the identity, watch a whole band, or open the whole instrument up. Dark or light, whichever you read more comfortably.

Optional companion

The helper

Two jobs a browser tab can't do on its own. You only need it for MPX Stream and Network SDR — SDRConnect and IQ File don't use it at all. It's in the same release as Bridge, so you're already in the right place.

Windows, macOS (Intel and Apple Silicon) and Linux. macOS needs one extra step the first time you run it; the release notes have it.
Setting it up: the guide has step-by-step walkthroughs for MPX Stream and Network SDR.

Before you download

What this is, and what it isn't

Bridge is a hobby project made by an FM DXer for FM DXers. It is not a commercial product and it isn't pretending to be one.

Get in touch

Questions, catches, and bug reports

If you're using Bridge to chase signals, I'd like to hear about it — especially when it doesn't work.

Discord
Join the server

Chat, settings help, and the odd screenshot of something rare.

Email
info@rdsbridge.com

For anything that doesn't suit a public thread.

Bugs & ideas
GitHub Issues

The best place for a fault — it doesn't get lost.