Close
0%
0%

OFFgrid-SDR

RTL-SDR sticks need some love,
This self-contained web page receiver does just that

Similar projects worth following
A self-contained web receiver for RTL-SDR sticks (tested with the RTL-SDR Blog V4),
built for listening to DAB, FM, medium wave and shortwave broadcasts - anywhere, with or
without an internet connection. Everything - radio libraries, DSP, fonts - is inside
index.html. Nothing is downloaded when it runs.

OFFgrid-SDR

A complete radio receiver in a single HTML file: no install, no internet, no account

Plug an RTL-SDR stick into almost any computer, open one file in the browser, and you have a working shortwave, FM, airband, VHF/UHF and DRM digital radio receiver. Everything (radio drivers, DSP, decoders, fonts) is inside index.html, so it runs from a USB pen drive with no internet at all.

Source and downloads: github.com/diddy-boy/OFFgrid-SDR

Demo video

▶

(version 1.1)

New in 2.1: DAB, DAB+ and DRM xHE-AAC code support

DRM mode now fully supported

DAB support written from the ground up to work in java all still contained within one HTML file so still truly portable.

New in 2.0: DRM digital radio, with sound

DRM (Digital Radio Mondiale) is digital broadcasting on long, medium and short wave: a flat block about 10 kHz wide on the waterfall, with near-FM sound when it’s received well. OFFgrid-SDR now decodes it entirely in the browser:

  • The station’s name, language, audio type and signal quality, then its sound: AAC, including SBR and parametric stereo, through FAAD2 compiled to WebAssembly.
  • Finds everything by itself: robustness modes A to D, any bandwidth, mirrored signals, tuning off centre, interference on part of the channel.
  • Says why when a station can’t be played: too weak, or using xHE-AAC, which isn’t supported yet.
  • AUTO recognises DRM and switches to it.
  • A real DRM station in the demo, “OFFgrid DRM”, playing an original jingle.

Adding DRM was by far the most work in the whole project: OFDM, pilot-based channel estimation, multilevel 16/64-QAM decoding, two-second interleaving and DRM’s audio framing, every layer bit-exact. It’s tested on real broadcasts in modes A, B and C, and off air.

Also new: the 6 m and 4 m ham bands, a wider status line, and fixes to the replay, RTTY and noise reduction.

Why it exists

The humble RTL-SDR stick deserves more than being a cheap way into other software. OFFgrid-SDR is built for it, and for places without internet:

  • Remote stations and expeditions: send a stick, an antenna and a pen drive, and people can hear news, weather fax and NAVTEX with no internet.
  • Emergency kits: when the internet or the power is down, radio still works.
  • Locked-down computers: schools, libraries, work laptops and Chromebooks. It’s just a page you open.
  • Privacy: nothing leaves your computer.
  • Fully offline, FT8 included: it sets its clock from shortwave time stations.
  • Teaching: demo mode for ham radio classes and clubs.

What it can do

Bands: FM (stereo and RDS), medium wave, every shortwave broadcast band, ham bands from 160 m to 70 cm (now with 6 m and 4 m), PMR446, airband with 8.33 kHz channels, the famous “Mystery” stations like The Buzzer, and anything from 100 kHz to 1766 MHz.

Decoders: DRM · RDS · CW · RTTY · PSK31/63/125 · FT8 and FT4 (with countries, distances and deep decoding) · WSPR · time signals · NAVTEX · DSC · ACARS · APRS · AIS ships · SSTV · Hellschreiber · weather fax

AUTO: listens for a couple of seconds, works out what the signal is, and switches to the right mode, tuned exactly onto it.

Waterfall replay: heard something a moment too late? Pause the waterfall, box any signal from the last minute, and replay it, decode it, or save it as MP3 plus a raw IQ file for SDR# and SDR++.

Listening tools: synchronous AM with selectable sidebands, noise reduction, a noise blanker, hum filter, auto notch, an AI voice cleaner (RNNoise), smart notch, squelch, seek, scan, 50 memories, frequency labels, a logbook, recording and Panorama (up to 10 MHz at once).

Try it in 30 seconds

  1. Download index.html from GitHub (open it in the repo, then Download raw file).
  2. Open it in Chrome or Edge (WebUSB is needed, so not Firefox or Safari).
  3. Plug in the stick, press Power on, and pick the stick.

No stick? Open index.html?demo for simulated stations covering every feature:...

Read more »

  • OFFgrid-SDR 2.2: aircraft datalink, DAB pictures, and a radio that holds up on old hardware

    diddy • 5 days ago • 0 comments

    Version 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,...

    Read more »

  • OFFgrid-SDR 2.1: DAB, DAB+ and xHE-AAC DRM, all in the browser

    diddy • 11/02/2026 at 18:18 • 0 comments

    Version 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

    diddy • 10/30/2026 at 00:18 • 0 comments

    OFFgrid-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.html file, 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:

    1. Finding the signal: correlating the signal with itself one symbol later finds the guard intervals, which give the robustness mode and the symbol timing.
    2. Locking frequency and frames: the frequency pilots fix the carrier offset, and the time references mark each 400 ms frame.
    3. 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.
    4. The SDC: the 16-QAM multilevel decoding came next, and the first station name appeared: “RTL DRM”.
    5. 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,...
    Read more »

  • OFFgrid-SDR 1.9: ships, APRS, a proper clock and HF upconverters

    diddy • 10/26/2026 at 15:09 • 0 comments

    Version 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

    diddy • 10/23/2026 at 09:29 • 0 comments

    Version 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...

    Read more »

  • OFFgrid-SDR 1.7: a smarter AUTO detect, FT4, offline FT8, and a bug fix

    diddy • 10/21/2026 at 11:52 • 0 comments

    Version 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

    diddy • 10/16/2026 at 08:43 • 0 comments

    OFFgrid-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:

    OFFgrid-SDR 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...

    Read more »

  • OFFgrid-SDR 1.5: an AI voice cleaner, a smart notch, a logbook and much more

    diddy • 10/12/2026 at 18:20 • 0 comments

    OFFgrid-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...

    Read more »

  • OFFgrid-SDR 1.4: waterfall replay, AUTO mode and six new decoders

    diddy • 10/07/2026 at 22:04 • 0 comments

    OFFgrid-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,...

    Read more »

  • Version 1.3 is available on Github

    diddy • 10/04/2026 at 16:01 • 0 comments

    OFFgrid-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...

    Read more »

View all 11 project logs

Enjoy this project?

Share

Discussions

diddy wrote 10/19/2026 at 23:27 • point

This has been fixed for version 1.6

  Are you sure? yes | no

diddy wrote 10/09/2026 at 06:45 • point

thanls for the tip and yes I agree the DC spike was a pain. even on the panorama view 

  Are you sure? yes | no

Kritish wrote 10/08/2026 at 13:33 • point

The DC spike folding to 1.5 kHz from the dial is a great bug, but it means anything else strong at that offset folds in the same way, so a nearby station can show up as a phantom too. Ignoring the spike where it folds fixes AUTO for that one case, and a steeper decimation filter on the last stage fixes it for everything. Tuning the stick a couple hundred kHz off and shifting digitally also keeps the spike out of view entirely. On replay, 60 s at 2.048 MS/s is about 246 MB in one tab, which Chrome on Android may kill, so capping that option on phones could save you some confusing bug reports.

  Are you sure? yes | no

Does this project spark your interest?

Become a member to follow this project and never miss any updates