-
OFFgrid-SDR 2.2: aircraft datalink, DAB pictures, and a radio that holds up on old hardware
5 days ago • 0 commentsVersion 2.2 is out. It started as a tidy-up of the DAB receiver added in 2.1 and grew into the biggest release yet: a new aircraft datalink decoder, station text and pictures for DAB and DRM, a systematic test of every kind of DAB audio, and a lot of work making everything lighter on modest hardware. As always, it’s a single HTML file that runs offline in a Chromium browser with an RTL-SDR stick plugged in. No install, no server, no internet needed once it’s loaded.
The source, the full changelog and the licence notices (including the small pl_mpeg changes) are on GitHub at https://github.com/diddy-boy/OFFgrid-SDR, where you can also download the latest version.Requested on GitHub: VDL2 and full screen
Two features in this release came straight from GitHub requests.
VDL2 decoding. VDL Mode 2 is the digital successor to ACARS: aircraft and ground stations exchanging short D8PSK bursts at 10,500 symbols a second, around 136.6 to 137 MHz. OFFgrid-SDR now decodes every VDL2 channel in the stick’s view at once, picking the channel set from your locator (six channels in Europe, four in North America, or the worldwide common channel at 136.975 MHz). ACARS messages carried over VDL2 are shown in full, with registration, flight, label and text. The network traffic (CPDLC and friends) and the acknowledgements are summarised, and there’s a “Messages only” switch to hide the chatter. Each aircraft’s country is looked up from its 24-bit ICAO address using a built-in table, so it works with no internet connection at all.
The decoder was written from the standard rather than ported. To keep myself honest, I built dumpvdl2 locally and used it as an oracle: first to prove a VDL2 transmitter I wrote for the demo was correct, then to check the receiver against a real recording made near a local airport. On that recording, OFFgrid-SDR decodes the same four frames dumpvdl2 does, including a Ryanair position report. Along the way, the testing caught a Reed-Solomon bug, an HDLC framing bug, and a missing filter that was costing a few dB on weak bursts. The decoder runs in a Web Worker, and a shared channeliser plus some hot-loop tuning took six channels from 80% of a core down to around 11%.
Full screen / kiosk mode. Another requested feature. A button at the end of the top bar, or the F key. Handy for a tablet or a dedicated listening station. Should work for Android users.
DAB and DAB+: text, logos and SlideShow
The DAB receiver now shows each station’s “now playing” text and programme type. Station logos are decoded from the multiplex’s SPI service, the way the BBC sends them, and stored per multiplex, so a first visit collects them over a few minutes and later visits show them instantly. The SlideShow pictures a station sends inside its own audio stream (much more common in mainland Europe than in the UK) appear in the logo’s place: the latest slide if there’s no logo, or each new slide for ten seconds before the logo returns.
Testing on real multiplexes was revealing. The BBC’s national multiplex sends logos over the air; the two UK commercial multiplexes I recorded send no pictures at all, since their radios fetch logos online. So the tooltip now says plainly when a multiplex doesn’t broadcast logos, rather than implying they’re on their way.
The bugs a test matrix finds
A user recording of the Sound Digital multiplex showed four MP2 stations playing silence. They used MPEG-2’s 24 kHz mode, whose 48 ms frames span two DAB CIFs; the receiver was cutting them in half, and the MP2 decoder rejected them outright. Fixing that meant three small changes to pl_mpeg, including one to its frame-sync search, which only recognised 48 kHz headers.
That prompted a proper test matrix, so stations in other countries wouldn’t hit similar surprises: all 96 DAB protection profiles carried through a simulated transmission with noise, 51 MP2 combinations checked against ffmpeg, and 16 DAB+ profiles (AAC-LC, HE-AAC, HE-AAC v2 at 32 and 48 kHz, 24 to 192 kbit/s) checked end to end against native FAAD2. It found three more bugs: a special puncturing rule for EEP 2-A at 8 kbit/s, missing UEP profiles for 320 and 384 kbit/s, and joint-stereo MP2 frames being thrown away whenever an encoder switched a frame to plain stereo. All fixed, all now passing.
This may be less of an issue in other European countries where DAB is not so cluttered and uses higher bitrates.DRM: text and pictures
DRM stations’ text messages are now shown, and so are SlideShow pictures sent as a packet-mode data stream. Both demo DRM stations (AAC and xHE-AAC) now send text and a logo, so you can see it working without a live signal.
Lighter on old hardware
My test machine for this is a five-year-old Lenovo Chromebook, and I added a performance breakdown (hover over the CPU figure) to see where the time goes. That led to some unglamorous but effective fixes: skipping the analogue demodulator in DAB and DRM modes where its output was thrown away, stopping the drawing loop from forcing a browser layout every frame, a faster waterfall memory, and a DRM receiver that carries hints from one analysis window to the next instead of searching from scratch every time. On the Chromebook, AM dropped from 38% to 24% of a core, DAB+ from about 60% to under 50%, and MP2 DAB’s peaks from 110% to around 60%.
Smaller things
- The band tabs are now FM · DAB · MW · SW · Air, wrapping onto two rows on narrow screens.
- The More menu is grouped by kind: Voice, Digital radio, Aircraft, Ships, Ham digital, Pictures, Time signals.
- In the paused waterfall, dragging a selection towards the bottom edge now scrolls back in time on its own, the box stays anchored to the signal, and the arrow keys and a scroll bar move through the history.
- 108 to 118 MHz (VOR and ILS) now opens in AM, as it should.
- Accented station names (like “RTS Première+”) display correctly.
Thanks
Thanks to everyone who suggested features on GitHub, and to the projects this release leans on or was checked against: FAAD2, libxaac and pl_mpeg for audio decoding; welle.io and Dream for DAB and DRM tables; dumpvdl2 and libacars as the VDL2 reference; and tar1090’s listing of ICAO’s address allocations. The source, the full changelog and the licence notices (including the small pl_mpeg changes) are on GitHub. Bug reports and recordings are always welcome: several of this release’s fixes started with a recording someone sent in.
-
OFFgrid-SDR 2.1: DAB, DAB+ and xHE-AAC DRM, all in the browser
11/02/2026 at 18:18 • 0 commentsVersion 2.1 is out, and it’s the biggest update yet. OFFgrid-SDR now plays DAB and DAB+ digital radio and DRM in xHE-AAC, still from a single HTML file, with no installation and no internet connection needed once it’s downloaded.
![]()
I’ll be honest: these two features were a lot of work, far more than anything before.
DAB and DAB+, from scratch
There’s no DAB library you can drop into a web page, so the whole receiver is written from the DAB standard itself, in JavaScript running in a background worker:
- The radio side: locking onto the multiplex using its null symbol and phase reference, frequency correction to a fraction of a hertz, and differential QPSK demodulation of 1,536 carriers, with each carrier weighted by how reliable it is.
- The data side: Viterbi decoding, time de-interleaving across 16 frames, both of DAB’s protection schemes (EEP and the older UEP), and a Reed–Solomon decoder for DAB+.
- The sound: DAB+ (HE-AAC) through FAAD2, and the original DAB’s MP2 through pl_mpeg, both compiled to WebAssembly.
Then came the debugging. Real broadcasts found bugs that test signals never would: an 8-bit overflow that had me decoding a slice of Radio 2 while calling it Radio 1 Dance; a frequency correction quietly doubling the error instead of removing it; and a setting in FAAD2’s DRM support that threw away half of every real DAB+ station’s audio frames. I fixed that last one with a small, documented patch to FAAD2.
Tested off air on BBC National DAB (12B) with an ordinary RTL-SDR stick, on both a DAB+ station and an MP2 one. Tune anywhere in a multiplex with AUTO on, and it finds the channel, switches to DAB and lists the stations. Click one to listen, or let it start one for you. The box shows each station’s format, bit rate and channels, plus the signal in dB, and if the sound can’t be played, it tells you why.
xHE-AAC for DRM
More and more DRM broadcasters are moving to xHE-AAC, the newer, more efficient codec. OFFgrid-SDR now plays it using libxaac, the decoder inside Android, compiled to WebAssembly. Getting there meant translating DRM’s compact codec description into the standard form libxaac expects, building a stand-in for a C library feature WebAssembly lacks, and checking the result against a real broadcast recording: it matches Fraunhofer’s own decoder almost sample for sample, stereo included.
Try it without a stick
The demo mode now includes a real DAB multiplex (“OFFgrid DAB” on 12A, with a DAB+ and an MP2 station) and two DRM stations, one in AAC and one in xHE-AAC. These aren’t recordings: they’re genuine signals built from the standards, decoded by the same receivers that handle off-air signals. So the demo is a real test that everything works, and a way to try OFFgrid-SDR before buying any hardware.
Free and open
OFFgrid-SDR is free software under the GPL. Every decoder built in has its exact source and build script in the repository, and each one rebuilds byte-for-byte.
👉 Download it from GitHub: https://github.com/diddy-boy/OFFgrid-SDR
As always, feedback and reception reports are very welcome. I’d especially love to hear from anyone with DRM xHE-AAC stations in range, since I can’t receive any from the UK. 73!
-
OFFgrid-SDR 2.0: DRM digital radio in a single HTML file
10/30/2026 at 00:18 • 0 commentsOFFgrid-SDR 2.0 is out, and the headline feature is one I wasn’t sure was possible when I started: DRM (Digital Radio Mondiale) decoding, with sound, running entirely in the browser, still in a single offline
index.htmlfile, still driven by a plain RTL-SDR stick over WebUSB.Adding DRM was by far the most work in this whole project. Everything else in 2.0 (6 m and 4 m bands, a wider status line, a batch of fixes) took days. DRM took most of the development time, and it fought back at every stage.
Why DRM is hard
DRM is digital broadcasting on long, medium and short wave. On the waterfall it’s a flat block about 10 kHz wide, and when it’s received well it sounds close to FM. Under the hood, it’s a serious piece of engineering:
- OFDM with around 200 carriers, in four “robustness modes” (A to D) with different symbol and guard lengths, chosen by the broadcaster for the propagation it expects.
- Pilot cells scattered through every frame, with phases defined by formulas and tables in the ETSI standard (ES 201 980), which the receiver uses to measure and undo the channel.
- Three channels in every signal: the FAC (fast access channel: the signal’s settings), the SDC (service description: the station’s name and audio settings), and the MSC (main service channel: the audio).
- Multilevel coding: 16-QAM or 64-QAM, where each constellation point carries bits from two or three separately coded levels, decoded one after another, each re-encoded to help decode the next.
- Interleaving over up to 2 seconds, so a fade only damages scattered bits that the error correction can repair.
- The audio itself is AAC, usually with SBR and often parametric stereo, packed into DRM’s own “audio super frames”.
There’s no shortcut: you build the receiver, layer by layer, and every layer has to be bit-exact before the next one can even be tested.
How it came together
I built it in stages, testing each against real off-air DRM recordings from the Dream project’s sample set before moving on:
- Finding the signal: correlating the signal with itself one symbol later finds the guard intervals, which give the robustness mode and the symbol timing.
- Locking frequency and frames: the frequency pilots fix the carrier offset, and the time references mark each 400 ms frame.
- The FAC: channel estimation from the gain references, then 4-QAM, de-interleaving, Viterbi decoding and the CRC. Seeing 32 of 32 frames pass their CRC on a real broadcast was a great moment.
- The SDC: the 16-QAM multilevel decoding came next, and the first station name appeared: “RTL DRM”.
- The audio: cell de-interleaving across 5 frames, three-level 64-QAM decoding, and the audio super frames, then into FAAD2, compiled to WebAssembly with its DRM support and embedded in the page. The first decode gave 410 of 410 AAC frames, and actual audio.
The tables (pilot phases, cell positions, puncturing patterns) come from Dream, the open-source DRM receiver, which made a reliable reference. That’s also why OFFgrid-SDR is now GPL-3.0.
The bugs that made it hard
Each of these took a long time to find, and each was invisible until the right recording came along:
- The whole-carrier phase turn. A frequency offset of a whole number of carriers doesn’t just shift the signal along the FFT: because each FFT window steps a full symbol (guard included), the phase also turns from symbol to symbol. One recording happened to sit at an offset where that turn was a whole number of revolutions, which hid the bug until the next recording broke it.
- Pilots sharing cells. In modes A, C and D, some gain references land on the same cell as a frequency pilot, and the frequency pilot wins. Treating it as a gain reference poisoned the channel estimate in exactly two symbols of every mode A frame. Mode B never collides, which is why the first recordings were perfect.
- A stack overflow in WebAssembly. FAAD2’s parametric stereo decoding overflowed WebAssembly’s default 64 kB stack, crashing on stereo stations only. A 1 MB stack fixed it.
- AM pretending to be DRM. A steady AM carrier correlates with itself at any delay, so it fooled the guard-interval detector. The fix was to measure the correlation peak above its typical level, not the raw peak.
A demo station needed an encoder, so I fixed one
OFFgrid-SDR has a demo mode with simulated stations, and I wanted a real DRM station in it, so people without a DRM signal in range can try it. That meant encoding DRM audio. The only open-source DRM encoder I could find, FAAC’s, had been removed from the project as broken. It turned out to have four bugs: scalefactors accumulating in its rate loop, the wrong VCB11 codebook choice, an out-of-order bit writer that wiped neighbouring codewords, and a codeword count mismatch. With those fixed, the demo now carries “OFFgrid DRM” on 6.095 MHz, playing an original jingle. The FAAC fixes are published as a patch for anyone who wants DRM encoding back.
What it does now
- The DRM box shows the station’s name, language, audio type, signal settings and signal quality, then plays the sound about 5 seconds behind the signal, like any DRM receiver.
- It handles modes A, B and C, mono, SBR and parametric stereo, mirrored signals, tuning off centre, and interference on part of the channel.
- When it can’t play a station, it says why: too weak, or using xHE-AAC, unequal protection or hierarchical modulation, which aren’t supported yet.
- AUTO recognises DRM and switches to it, and switches back to AM if it got it wrong.
- It’s tested on five real broadcasts and off air through an RTL-SDR stick.
Also in 2.0
6 m and 4 m in the ham bands, with edges set by your location; a wider status line; a CPU figure that includes the background decoders; and fixes to the waterfall replay, RTTY’s automatic reverse and noise reduction.
OFFgrid-SDR is free and open source, and still one file you can carry on a pen drive with a stick and an antenna. Get it, try the demo, or read the code here:
https://github.com/diddy-boy/OFFgrid-SDR
73!
-
OFFgrid-SDR 1.9: ships, APRS, a proper clock and HF upconverters
10/26/2026 at 15:09 • 0 commentsVersion 1.9 of OFFgrid-SDR is out! It's still one single HTML file: put it on a pen drive with an RTL-SDR stick, open it in Chrome or Edge, and you've got a full receiver with no installing, no internet and no account.
Download it here: https://github.com/diddy-boy/OFFgrid-SDR
This release adds two new VHF decoders, gets the clock right without the internet, and supports HF upconverters, after a request from one of OFFgrid-SDR's users.
NEW: AIS SHIPS
• Ships' AIS is decoded on both marine channels at once (161.975 and 162.025 MHz).
• Each vessel gets one row, updated as it's heard: name, type, distance and bearing from you, speed, course, at anchor or moored, and where it's heading.
• Hover over a ship for its MMSI, flag, call sign, size, draught and ETA. Coast stations and buoys show up too.
• Only messages that pass their CRC check are shown, so no garbage.NEW: APRS
• Radio amateurs' positions, weather stations, messages and status on 2 m.
• Cars, walkers and balloons with their distance, bearing, speed and height; weather in °C, km/h and hPa.
• Choosing APRS goes to the right frequency for where you are: 144.800 MHz in Europe, 144.390 in North America, 145.175 in Australia, and more in a list (the ISS too).NEW: SETUP AND A SMARTER CLOCK
FT8, FT4 and WSPR need an accurate clock, which is hard with no internet. 1.9 tackles that properly:
• A first-time setup (only when you first pick FT8, FT4, WSPR or Time signal): it sets your location, then finds a shortwave time station. That station's carrier calibrates your stick, and its time code sets the clock. Skip it any time.
• Clock details: how far out your computer's clock is, how fast it drifts, and how to set it.
• OFFgrid-SDR learns how fast your computer's clock drifts, and follows it between checks.
• WSPR now decodes even with the clock a minute or so out, then corrects it to a tenth of a second. A laptop that's been off-grid for weeks comes right just by listening to WSPR.NEW: HF UPCONVERTER SUPPORT
• Ham It Up and similar converters: Settings → Device → HF upconverter.
• Auto sends MW, shortwave and HF through the converter and tunes FM, airband and VHF straight through, reminding you which way to flip the converter's switch.
• The frequency shown is always the real one. Off by default.ALSO NEW
• The FM band follows your country (US 200 kHz steps, Japan's 76–95 MHz, and others).
• Each stick remembers its own frequency correction.
• The demo has new stations: ships in Liverpool Bay, and an APRS station.FIXED
• AUTO no longer mistakes a fading broadcast station for Hellschreiber.
• The clock correction now remembers where it came from after a restart.
• Memories stay safe while a settings backup is being imported.
• Demo mode could switch the radio off when going from VHF back to shortwave on some computers. Found and fixed.
• Demo mode can no longer freeze a busy computer, and its 40 and 41 m bands run more than twice as fast.As always, it's free. Grab it from GitHub, give it a go, and let me know what you think in the comments. Bug reports and feature requests are very welcome: the upconverter support came from exactly that.
https://github.com/diddy-boy/OFFgrid-SDR
73!
-
OFFgrid-SDR 1.8: WSPR, radio time signals, deeper FT8
10/23/2026 at 09:29 • 0 commentsVersion 1.8 of OFFgrid-SDR is out. It’s still the same idea: a complete RTL-SDR receiver in a single HTML file that runs in the browser, with no installation, no drivers on most systems, and no internet. This release is about weak signals, propagation and time: hearing more, seeing where the bands are open, and keeping an accurate clock far from any network.
Deeper FT8 and FT4
On a busy band, strong FT8 stations hide weaker ones underneath. 1.8 does what WSJT-X does: once a message is decoded, its exact signal is known, so OFFgrid-SDR rebuilds it, including the smoothed frequency changes real transmitters use, fine-tunes its timing and frequency against the audio, and subtracts it. Then it decodes again, up to three times.
On a busy simulated band that finds about one extra station in five, and weak stations hidden under strong ones went from 1 in 18 to 10 in 18, with no false decodes. Stations found that way are marked with a ◆, and the number of passes adapts to the computer so a decode always finishes inside its slot.
WSPR
WSPR beacons send a callsign, locator and power level over two minutes, and can be decoded around −28 dB, far below anything you can hear. OFFgrid-SDR’s WSPR decoder is written from the published protocol, and its encoder was checked against an independent one. It uses a Fano sequential decoder, as WSJT-X’s wsprd does, because the code’s constraint length of 32 is far too long for Viterbi. In testing it decoded down to −28 dB, and never produced a wrong message.
Two extras came naturally. WSPR stations all transmit within 1400–1600 Hz of the dial, so if they land elsewhere, OFFgrid-SDR knows how far off your stick is and offers to correct it. And FT8, FT4 and WSPR now listen from 1.5 kHz below the dial, so an uncalibrated stick doesn’t push stations out of reach.
Who can I hear?
A new Heard view sums up every FT8, FT4 and WSPR decode band by band: how many stations and countries, the farthest one, which compass directions the band is open towards, and whether it’s rising or fading. A band survey hops through 80 to 10 m in about five minutes, so you get a picture of HF propagation from your own antenna, worked out entirely on your own computer.
Radio time signals
FT8 and WSPR need the clock right to within a second or so, which is a problem for a laptop that’s been away from the internet for weeks. 1.8 reads the time from the shortwave time stations:
- CHU (Canada): the full date and time from its FSK time code, in about 15 seconds
- WWV and WWVH (USA): the full time from the 100 Hz time code, at the end of each minute
- RWM (Russia): the exact second, from its pulses
If a station is too weak for its time code, its second ticks still set the seconds. If none can be heard at all, you can set the time by hand from a phone, and FT8 fine-tunes it from there.
Getting this robust was a lesson in itself. One version could accept a confidently wrong time when the same bit error hit both copies of CHU’s repeated data, so a time is now only taken when copies from different seconds agree. MSF and DCF77 would have been nice too, but they’re below the range of RTL-SDR sticks.
The library bugs, fixed upstream
The MacBook restart bug from 1.7, where reception came back 36 dB weaker after power off and on, finally has its real cause. Jacobo Tarrío, author of the webrtlsdr library OFFgrid-SDR is built on, tracked it down: after a restart, the gain value was being lost, so the tuner fell back to automatic gain. His new releases fix that, along with the restart frequency drift and a stop() that could hang after the stick stopped sending. OFFgrid-SDR now uses his library exactly as published, and no longer carries its own patched copy. A test build with all my workarounds removed passed every check on real hardware.
A bigger internal self-test
The built-in self-test now has 48 checks, covering every new decoder. It earned its keep again. It found that the demo’s busiest band couldn’t keep up with real time on slower computers, so WSPR never got its full two minutes. The fix made that band nearly five times faster to generate, with identical output. It also caught AUTO mistaking an AM station’s music for RTTY, when two notes 170 Hz apart happened to alternate like RTTY’s tones. AUTO now checks whether the “tones” are mirrored either side of a carrier, which RTTY never is.
Self test is a way to internally test everything before release to find bugs with development, leading to a better quality release
you can download from
OFFgrid-SDR -
OFFgrid-SDR 1.7: a smarter AUTO detect, FT4, offline FT8, and a bug fix
10/21/2026 at 11:52 • 0 commentsVersion 1.7 of OFFgrid-SDR is out.
It’s still the same idea: a complete RTL-SDR receiver in a single HTML file that runs in the browser, with no installation, no drivers on most systems, and no internet. This release is mostly about making the receiver work things out for you, and making it more dependable on real hardware.
AUTO got much smarter
AUTO listens to a signal for a couple of seconds, works out what it is, and switches to the right mode. In 1.7 it handles SSB properly. It finds the whole voice wherever the dial sits on it, picks LSB or USB from where the speech energy sits, and then tunes to the suppressed carrier to within a few hertz. It does that by lining up the harmonics of the speaker’s voice: voiced speech is a comb of harmonics at whole multiples of the pitch, and the comb only lines up at the true carrier. Clicking an SSB signal on the waterfall does the same fine-tuning by itself.
It also now recognises FT8, FT4, ACARS, PSK63 and PSK125. It no longer mistakes fading AM for Morse, an off-tune voice for PSK, or fast Morse for Hellschreiber. Each of those fixes came from a diagnostics log of a real signal it got wrong.
FT8 and FT4, still completely offline
There’s a new FT4 decoder alongside FT8, and the decode list now shows each station’s country and its distance and bearing from you. None of that needs the internet:
- Countries come from a table of callsign prefixes built into the file, covering 269 countries and areas.
- Your location comes from 620 built-in cities, a locator you type in, or the computer’s GPS if it has one.
- The clock, which FT8 needs within about a second, is corrected from the timing of the stations it hears.
The list can be sorted by distance with one click, which is a nice way to see how far your antenna is reaching.
Other additions
- Keyboard shortcuts, including typing a frequency on the number pad from anywhere
- Memory markers on the spectrum, and a UTC clock
- PSK decoding that starts part-way through a transmission
- RTTY that works out which way round mark and space are by itself
- A power-on “lamp test” that lights every light in the top bar for two seconds, like a car dashboard
The bug hunt
The most interesting part of this release was a bug that only showed on a MacBook. After powering off and on, the receiver would come back with only noise until you changed band. The diagnostics log showed the stick on exactly the right frequency, locked, delivering data at full rate, but with everything 36 dB weaker. The tuner’s gain had been left at its lowest.
The cause looks like timing. On power-off the tuner goes into standby with its amplifiers turned down. On power-on, the first register writes after it wakes are exactly those amplifier registers, and on a fast USB path some of them seem to get lost. Re-sending the gain a moment after start-up cures it. It later turned up on a Windows laptop too, once the start-up sequence got faster.
Along the way I sent six fixes to Jacobo Tarrío, the author of the webrtlsdr library OFFgrid-SDR is built on, and he has taken most of them upstream. That includes a better fix for another restart bug, where the tuner’s frequency rounding made the receiver drift a few hertz at every restart until it stopped following the tuning altogether.
self-test
As part of future releases I have added in an internal self test tool as a way to bug hunt before release.
Future releases should be as near to bug free as possible.
Ideal for testing before release.
The project, the single file and full release notes are on GitHub: https://github.com/diddy-boy/OFFgrid-SDR
-
OFFgrid-SDR 1.6: a new top bar and settings dialog, FT8 and ACARS decoders, and a much tougher USB connection
10/16/2026 at 08:43 • 0 commentsOFFgrid-SDR 1.6 is out. It's still one file (`index.html`), can still run from a pen drive, and still needs no internet. This release tidies up the whole screen, adds three new decoders, and makes the radio much harder to knock over.
Download it from GitHub:
No stick needed to try it: open `index.html?demo`, and every new feature has a simulated station to play with.
A cleaner screen
![]()
After 1.5 the controls had grown, so 1.6 is mostly about making them easier to find.
**Top bar:** frequency, S-meter, mode, volume, mute, record, settings and help are always visible, on desktop and on phones
**One-click modes:** AUTO · FM · AM · SAM · USB · LSB · CW · More ▾. SAM-U, SAM-L, the decoders and Wide/Narrow FM are under More
**Settings dialog:** open it from the gear icon, with tabs for Device, Display & tuning, Audio & recording, Decoders, Calibration and Backup
**No duplicate controls:** mode, filter width and step each have exactly one control now
**Status lights** under the frequency digits, and a larger S-meter reading that balances the frequency
**Seek / Step box pinned:** it stays at the top of the side panel while the panels below scroll, and a new **Panels** menu jumps straight to Band, Memories, Audio & gain and the rest
**Zoom buttons** are now −, + and the zoom level (click it for the full view)Layout stability got a lot of attention too. The Alerts button no longer shifts the spectrum toolbar, and the top bar no longer jumps in height on shortwave or when a frequency label appears. A status message that's too long for its space now scrolls instead of being cut off (with "reduce motion" on, it's shortened and the whole message is on hover).
Tall (portrait) view
On a Chromebook or tablet held upright, the page no longer scrolls, so the browser's tab and address bar stay put. The top bar, a slice of waterfall and the Seek / Step box stay in view, and only the panels below them scroll.
Overload indicator and RF gain per band
**OVL indicator** next to the meter: amber when the band keeps touching full scale, red when the receiver is overloaded
- Click it while it's lit and it lowers the RF gain step by step until the overload clears, then shows what it changed, with **Undo**
- Each band now remembers its **own RF gain**, so a busy band can run lower without changing the others. (Automatic gain stays one setting for all bands.)Three new decoders
**FT8:** decodes everyone in the passband every 15 seconds. It also corrects the computer's clock from the stations it hears, so it works offline. The demo has FT8 stations on 14.074 MHz
![]()
**ACARS:** aircraft text messages on the airband, decoded and listed. The demo has an ACARS station on 131.550 MHz![]()
**PSK** (was PSK31): now decodes PSK31, PSK63 and PSK125, and finds the speed by itself. The demo has a PSK63 station on 14.0735 MHz![]()
Weather fax also works from any band now: choosing FAX away from shortwave tunes to the first fax station in the list.
Fast band switching, fixed
This was a nasty one. Change band quickly and the spectrum and waterfall could freeze while the audio carried on. A band change made while the sample rate was still changing (entering or leaving the airband and 2 m sections, slower on a slow computer) could also be lost.
That's fixed, and there's a safety net behind it: a watchdog restarts the display if it stops, and resends the frequency if the stick and the display disagree. You no longer need to go to another band and back.
USB stick recovery
Unplugging the stick, or the stick resetting, no longer leaves the radio stuck. It goes back to Off cleanly, and if it was on, it starts again by itself when the stick is plugged back in. There are also clear messages now for a lost stick, data stopping, samples going missing and the common USB errors (including the WinUSB driver on Windows).
Diagnostics log
If something does go wrong: **Settings → Backup → Save diagnostics log** saves the last three minutes of band changes, retunes and stick errors. It holds no audio, memories or personal data, so it's safe to send me if you hit a problem.
Thanks to everyone who has tried it, reported bugs and posted reviews. Keep the feedback coming!
73!
-
OFFgrid-SDR 1.5: an AI voice cleaner, a smart notch, a logbook and much more
10/12/2026 at 18:20 • 0 commentsOFFgrid-SDR 1.5 is out. It's still one file (index.html), still runs from a pen drive, and still needs no internet, but this release adds a neural network, a self-filling logbook, and a stack of tools for digging weak signals out of the noise.
Download it from GitHub: https://github.com/diddy-boy/OFFgrid-SDR
No stick needed to try it: open index.html?demo, and every new feature has a simulated station to play with.
==== AI VOICE CLEANER ====
![]()
The headline feature. OFFgrid-SDR now includes RNNoise, a small neural network trained to separate speech from noise. It clears hiss, roar and noise-type jamming from voices in AM, SAM, SSB and FM voice, and in testing it took pure noise down by over 30 dB while leaving speech untouched.
• Four strengths: Light, Med, Strong and Full, in Audio & gain next to the other noise filters
• Built for speech: the stronger settings quieten music, and Full silences it. Light and Med blend in some of the original audio, so music stays audible
• It runs entirely inside the page, offline: the compiled network (about 112 KB) is embedded in index.html as WebAssembly, and only loads when you switch it on
On weak, hissy SSB it's genuinely impressive. Credit to Jean-Marc Valin and the Xiph.Org Foundation for RNNoise, and to Jitsi for the WebAssembly build.
==== SMART NOTCH ====
![]()
That steady whine from a heterodyne on a broadcast station? Press Whine. OFFgrid-SDR listens to the last 3 seconds of audio, finds a tone that stays at exactly the same pitch the whole time (speech and music move about; a whine doesn't), and notches it at once.
• On the demo whistle it cut the whine by over 50 dB
• It skips mains hum and points you to the Hum button instead
• A strip shows the audio you're hearing: click to drop a notch where you like (with a hover preview), drag a notch until the whine disappears, scroll to nudge it, right-click to remove it
• Up to three notches, cleared when you change station
==== THE LOGBOOK ====
OFFgrid-SDR now keeps a log for you: date and time (UTC), frequency, mode, signal (average and peak S/N), station and notes.
• Stations you stay on for 30 seconds are logged by themselves, and so are decoder results: NAVTEX messages, DSC calls, SSTV pictures and fax charts
• The station is filled in offline wherever OFFgrid-SDR can work it out: your own labels, RDS, the built-in station lists, the decoders, and callsigns picked out of CW, RTTY and PSK31 ("DE G4ABC")
• Edit any entry in place, export it as CSV for a spreadsheet, or have OFFgrid-SDR keep a CSV file up to date automatically
==== FREQUENCY LABELS ====
Right-click the spectrum or waterfall and name a frequency ("Local repeater", "BBC WS"). The label shows as a tag on the spectrum and under the frequency readout, fills in the logbook's station column, and travels in settings backups, so a kit can be sent out already labelled.
==== THE SPECTRUM: ALERTS, PEAK HOLD AND SIGNAL INFO ====
• New-signal alerts: a ring flashes on the spectrum where a signal appears on a frequency that has been empty for two minutes. Great on a quiet ham band or the airband
• Peak hold and averaging: a faint line of the strongest recent levels, and a smoother trace so weak steady signals stand out
• Signal info popup (optional): hover over a signal for its frequency, level, dB over the noise, width, band plan, known frequencies (FT8, WSPR, beacons, time stations and more) and your own label or memory
The alerts took some getting right. The first version treated "louder than usual" as new, and on a broadcast band every station fading back in set it off. Now each spot on the band remembers when it last had a signal, and an alert needs the spot to have been empty for two minutes. Three deeply fading broadcast stations: no alerts. A weak intermittent CW signal on 30 m: caught.
==== REPLAY: SCROLL BACK THROUGH IT ALL ====
The waterfall buffer from 1.4 could hold 60 seconds, but you could only see what fitted on screen. Now:
• While paused, the mouse wheel scrolls back through the whole buffer, with the time marks moving along
• ⇕ Whole buffer squeezes all of it onto the screen
• An FM replay decodes its own RDS
• The waterfall keeps running while OFFgrid-SDR sits in a background tab. Browsers pause drawing in background tabs, so the waterfall now builds its rows from the incoming radio data instead: come back, and everything you missed is there to scroll back to and replay
==== FOR OLDER AND SLOWER COMPUTERS ====
• Low-power mode halves the samples and the drawing. In testing on a computer slowed to a quarter of normal speed, the default settings broke up badly, while Low-power mode played with no audio gaps at all
• OFFgrid-SDR suggests Low-power mode when it notices the computer struggling: audio gaps, a very slow display or high CPU, for half a minute. It never switches it on by itself
• On phones and low-memory computers, the longer replay buffers are greyed out, so the browser can't run out of memory
It also runs well on a budget Lenovo 300e Chromebook, in laptop and tablet mode, landscape and portrait.
==== SMALLER CHANGES AND FIXES ====
• AGC speed (Slow, Medium, Fast) for SSB and CW
• SSTV in LSB on 40 m and 80 m, chosen automatically
• Airband names: type a 25 kHz-style name such as 120.625 and those channels keep the names you'd see on a chart, while 8.33 names like 123.805 keep the 8.33 style
• Ham bands always open in their own mode (LSB, USB or FM), and a mode AUTO picks is for that one signal only
• AUTO is instant on the airband, PMR446 and marine VHF
• A much sharper filter in AUTO's analysis: strong neighbouring stations, and the stick's DC spike, can no longer fold in as phantom signals (76 to 108 dB of rejection, up from 11 to 20 dB). Thanks to the reader who pointed this out after the 1.4 log
• PSK31 now locks on reliably, and the Hellschreiber strip no longer freezes
• New demo stations: an off-channel AM station for AUTO, a whistle-and-hum station for the smart notch, and an SSTV picture in LSB
Download OFFgrid-SDR: https://github.com/diddy-boy/OFFgrid-SDR
Thanks as ever to Jacobo Tarrío, whose webrtlsdr and signals libraries make it all possible, and to everyone who has tried OFFgrid-SDR and sent feedback.
If OFFgrid-SDR is useful to you, there's a "Buy me a coffee" button in the ? help panel.
73!
-
OFFgrid-SDR 1.4: waterfall replay, AUTO mode and six new decoders
10/07/2026 at 22:04 • 0 commentsOFFgrid-SDR 1.4 is out, and it's the biggest update yet. It's still one file (index.html), still runs from a pen drive, and still needs no internet. But it now does a lot more than listen.
Grab it from GitHub: github.com/diddy-boy/OFFgrid-SDR
And no stick needed to try it: open index.html?demo, and every new feature has a simulated station to play with.
==== WATERFALL REPLAY: REWIND THE RADIO ====
![]()
Ever spotted something interesting on the waterfall a moment too late? Switch on the waterfall buffer (15, 30 or 60 seconds) and OFFgrid-SDR keeps the raw radio signal in memory. Press pause, draw a box around any signal from the last few seconds, and a replay window opens with a zoomed view of that moment, playing it on a loop.
• The replay has its own mode, filter, SSB shift and noise filters, so you can try AM, SSB or CW on the same captured moment without touching your main settings
• Click inside the picture (or use the arrow keys or mouse wheel) to retune within the box
• In CW, the Morse in just that section is decoded
• A/B loops just the part you're interested in
• Save writes two files: an MP3 of what you hear, and a raw IQ file named so SDR#, SDR++ and others open it at the right frequency
How it works: the samples are stored as 8-bit I/Q (2 bytes each), so 30 seconds at 2.048 MS/s is about 123 MB. Each waterfall row records which stored samples it came from, so a box drawn on the picture maps exactly onto the signal. Replay runs those samples through a separate demodulator about 24 times faster than real time, so changing the mode on a replay is close to instant.
==== AUTO: "WHAT IS THAT SIGNAL?" ====
![]()
AUTO is a switch. Turn it on, and every time you tune somewhere new, OFFgrid-SDR listens for a couple of seconds, works out what the signal is, switches mode and tunes precisely onto it. A banner says what it found and how sure it is.
• Shortwave: CW, RTTY, PSK31, NAVTEX, DSC, weather fax, SSTV, Hellschreiber, AM and SSB
• VHF/UHF: narrowband FM and airband AM
• The FM broadcast band: wideband FM
• It even recognises DRM digital broadcasts (which a browser can't decode) and tells you what that block of hiss is
• If nothing is clear, it picks the band's usual mode: the right sideband on the ham bands, AM on broadcast bands, narrowband FM on VHF
The fun part was finding a signature for each mode:
• RTTY's two tones alternate (one on, the other off), while a Morse carrier and its keying sidebands rise and fall together. Measuring how the two tones move over time tells them apart.
• PSK31 flips its phase. Comparing the signal's phase 15 ms apart (spanning the dip at each flip) shows reversals that no other mode has.
• SSTV is frequency-modulated, so its strength is almost perfectly steady, unlike a voice.
• For SSB, speech is strongest at its low end, right next to the suppressed carrier, so where the energy bunches up tells you USB from LSB.
My favourite bug: AUTO kept "finding" a steady carrier on empty frequencies. It was the stick's own DC spike, which wasn't even in AUTO's view. The decimation filter that narrows the view lets strong signals fold back in, so a spike 22.5 kHz away appeared exactly 1.5 kHz from the dial. AUTO now ignores the spike where it folds to, as well as where it really is.
==== SIX NEW DECODERS ====
• RTTY: weather, news and ham teleprinter text. It finds the shift (170, 425, 450 or 850 Hz) and the speed (45.45, 50 or 75 baud) by itself.
![]()
• NAVTEX: maritime safety and weather messages on 518, 490 and 4209.5 kHz, with error correction (every character is sent twice).
![]()
• DSC: ships' distress, urgency, safety and routine calls, listed with who called whom (MMSI numbers), distress calls in red. A quirk of DSC: its check bits count the zeros, so an upside-down symbol checks out too. The decoder has to work out which way up the signal is from the phasing symbols at the start of each call.
• SSTV: slow-scan TV pictures in the Martin, Scottie and PD formats, drawn line by line as they arrive, and saved as PNG. On shortwave (14.230 MHz) and VHF, ready for the ISS on 145.800 MHz.
![]()
• PSK31: keyboard-to-keyboard ham text. Click a signal and it snaps onto it.
• Hellschreiber: the tone paints the letters, and you read them by eye, just like the 1930s machines. The strip is drawn twice, stacked, so there's always a complete row of letters, however the timing falls.
==== FREQUENCY CALIBRATION ====
Pick a time station (RWM, WWV/WWVH/BPM or CHU) and press Calibrate. OFFgrid-SDR mixes the carrier down, averages a few seconds, and measures it to a fraction of a hertz with a long FFT. It then sets the stick's ppm correction, and confirms it with a second measurement. The correction is saved in settings backups, so a kit can be sent out already calibrated.
==== A NEW MODE LAYOUT ====
The same ten buttons on every band:
AUTO · FM · AM · SAM · SAM-U · SAM-L · USB · LSB · CW · More
FM picks wide or narrow by itself (wide on the FM broadcast band, narrow on VHF/UHF). The decoders live under More. Modes that don't fit where you're tuned are greyed out, with the reason in the tooltip, so the row never changes shape.
A shout-out for SAM-U and SAM-L: synchronous AM using just one sideband, to dodge a neighbour splattering into the other side. It's usually only found on specialist receivers, and it has rescued a lot of difficult stations for me. It comes from Jacobo Tarrío's excellent demodulator library, which OFFgrid-SDR is built on.
==== SMALLER ADDITIONS AND FIXES ====
• CW tuning help: click near a Morse signal to snap exactly onto it, or press Z to zero-beat
• An RDS status line (searching / no data / locked · 98% good), so you can tell "no RDS" from "signal too weak for RDS"
• RDS now heals itself: it could stall after a pause, or on a busy computer, and it now restarts by itself if it loses lock
• AUTO, zero-beat and calibration no longer freeze the display: they process samples as they arrive instead of all at once at the end (found by a tester running a VM alongside!)
• An FPS readout beside CPU and RAM
• On direct-sampling sticks like the Nooelec on HF, the RF gain slider is greyed out with an explanation (the signal bypasses the tuner there)
• Lots of new demo stations: RTTY, NAVTEX, DSC, SSTV, PSK31, Hellschreiber, DRM, and a time station for calibration
Thanks to everyone who has tried OFFgrid-SDR since the rtl-sdr.com write-up, and as ever to Jacobo Tarrío, whose webrtlsdr and signals libraries make it all possible.
If OFFgrid-SDR is useful to you, there's a "Buy me a coffee" button in the ? help panel.
73!
-
Version 1.3 is available on Github
10/04/2026 at 16:01 • 0 commentsOFFgrid-SDR 1.3: Panorama, Scan, an auto notch and a lot more
OFFgrid-SDR has moved on quite a bit since version 1.1, so here's a round-up of everything new in versions 1.2 and 1.3, plus a few of the more interesting problems along the way.
As always, it's still one file (index.html), still runs from a pen drive, and still needs no internet. Grab the latest from GitHub: github.com/diddy-boy/OFFgrid-SDR
==== PANORAMA: UP TO 10 MHZ AT ONCE ====
An RTL-SDR stick can only see about 2 MHz at a time. Panorama gets round that by sweeping: it hops the stick across a wider range, takes a spectrum at each stop, and stitches the slices into one picture, up to 10 MHz wide.
• Around me: centred on where you're tuned, 2, 4, 6, 8 or 10 MHz wide
• Three HF slices: 0.5–10, 10–20 and 20–28.8 MHz
• Click any signal in the panorama and the receiver tunes straight to it, ready to listen
• Click Panorama again and you're back exactly where you were
A 10 MHz sweep takes around half a second on a real stick.
How it works, for the curious:
• While sweeping, the stick switches to 10 ms sample blocks (normally 50 ms), so little time is wasted after each retune
• After each hop, the blocks that were already on their way from the old frequency are thrown away, then one fresh block is captured
• Only the clean middle 80% of each slice is used, avoiding the roll-off at the edges and the DC spike in the centre
• The slices are level-matched, so the joins don't show as steps in the noise floor
• The top HF slice stops at 28.8 MHz on purpose: that's where both the RTL-SDR Blog V4 (its upconverter) and the Nooelec (direct sampling) switch their HF input, and those switch-overs are slow. Staying below it keeps every hop fast on both sticks.
==== SCAN YOUR MEMORIES ====
Press Scan, tap the memories you want scanned (they glow green), and set the squelch. Scan hops through them and stops on any with a signal, showing "SCAN: HOLDING ON A SIGNAL", then carries on 3 seconds after the signal ends. Anything you do by hand ends the scan.
It's ideal for airband, PMR446 or a handful of favourite stations.
==== IDENTIFY: WHAT'S ON THIS FREQUENCY? ====
The Identify button (above the waterfall, when online) now offers three lookups for the frequency you're tuned to:
• What's on this frequency? A web search
• Ask AI: asks Google's AI Mode what's usually there, given the frequency, mode and UTC time
• Shortwave radio schedule: below 30 MHz, opens shortwave.live's schedule database for that exact frequency, showing who's scheduled and when
Only the frequency (and for the AI, the mode and time) is sent, and only when you click. Offline, it's simply greyed out.
==== AUTO NOTCH: GOODBYE WHISTLES ====
The new Notch button finds steady whistles (heterodynes from a nearby carrier, the classic shortwave annoyance) and removes each with a very narrow 20 Hz notch, within about a second.
The first design was the textbook one, an adaptive "line enhancer" that predicts the audio and subtracts what's predictable. It removed the whistles, but it also ate the speech: over a few milliseconds a human voice is quite predictable too.
So it was rebuilt as "detect, then notch". Every tenth of a second it takes a fine spectrum of the audio and looks for narrow peaks that stay on exactly the same frequency for about a second. A whistle does; the harmonics of a voice keep moving as the pitch changes, so they're left alone.
The result: a whistle drops by around 40 dB, while the speech is essentially untouched. It handles up to three whistles at once and follows slowly drifting ones.
==== SSB FILTER WIDTHS AND PASSBAND SHIFT ====
• The filter badge now cycles SSB through 1.8, 2, 2.4 and 2.8 kHz with one click
• A passband shift slides the filter up or down without changing the pitch, to dodge a station just above or below
• Both are remembered per band and saved in memories
==== FASTER BAND AND SAMPLE-RATE CHANGES ====
Changing the sample rate (including going into and out of 2 m and airband, which use 2.4 MS/s) used to fully restart the stick: close the USB connection, reopen it, re-initialise the tuner. It now just pauses the sample stream, sets the new rate on the RTL chip and carries on. The pause dropped from about 0.8 s to about 0.1 s.
Testing it turned up a nice race condition. Starting a new sample stream is asynchronous, and if the next change asked it to stop before it had really started, the stop did nothing and the stream started anyway: an orphan stream that nothing would ever stop. Waiting for the start to complete fixed it. It's the kind of bug that only appears when you change things quickly, which is exactly what Panorama and Scan do.
==== A CLEARER TUNING LINE ====
The tuning line used to be amber, and it vanished over strong signals, which show as yellow and orange on the waterfall. It's now white with a thin dark edge, so it shows up over any colour.
==== SMALLER IMPROVEMENTS AND FIXES ====
• Each band button now sets its own mode and tuning step, and remembers your choices. Before, CW's 10 Hz steps could follow you into a broadcast band, so waterfall clicks missed the 5 kHz channels.
• Coming back from 2 m to a shortwave broadcast band no longer leaves you in NFM
• Clicking the display in general coverage (free tuning, e.g. at 252 kHz) no longer complains about band edges
• The squelch is now a clean on/off gate, like a real radio, with a little hysteresis so it doesn't chatter
• The Blanker and Notch are green toggle buttons, matching the other noise filters
• Shorter mode captions, with the full explanations in tooltips
• New demo station on 5.985 MHz, a talk station with a whistle, to try the Notch
• Demo mode no longer serves a moment of the old frequency's signal after a retune
==== THANKS ====
Thanks to everyone who has tried OFFgrid-SDR, and as ever to Jacobo Tarrío, whose webrtlsdr and signals libraries make it possible.
If OFFgrid-SDR is useful to you, there's a "Buy me a coffee" button in the ? help panel.
73!
diddy










