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

Offline RTL-SDR receiver for your browser Source & downloads: github.com/diddy-boy/OFFgrid-SDR

A self-contained web receiver for RTL-SDR sticks (tested with the RTL-SDR Blog V4 and the Nooelec NESDR SMArt v5), for FM, medium wave, shortwave, airband and VHF/UHF, anywhere, with or without an internet connection. Everything (radio libraries, DSP, decoders, fonts) is inside index.html. Nothing is downloaded when it runs.

New in 1.4: waterfall replay (rewind the radio and replay any signal from the last minute), AUTO mode (works out what a signal is and switches to it), six new decoders (RTTY, NAVTEX, DSC, SSTV, PSK31, Hellschreiber), frequency calibration, and a new mode layout.

Demonstration Video

==== HOW TO RUN ====

1. Put index.html anywhere (a USB pen drive works too). It's the whole receiver: one file, nothing else needed. Grab it from GitHub — open index.html in the repo and click "Download raw file".

2. Open index.html in Google Chrome, Microsoft Edge, or Opera (desktop or Android). Safari and Firefox do not support WebUSB, so the stick cannot be used there.

3. Plug in the stick, press Power on, and pick the stick in the browser's USB chooser.

-- No stick handy? Try the demo --

Open index.html?demo for simulated stations: no hardware required.

(In Chrome: open index.html, add ?demo to the end of the address bar, press Enter.)

A "Demo stations" list appears. Press Power on, then click any station:

FM

• 98.8: stereo + RDS (name, RadioText, clock). Try Stereo / Wide / Mono

• 99.3: weak stereo, RDS comes and goes. Try Mono

• 100.0: mono talk station, RDS "News"

• 101.1: classical, stereo, RDS

Shortwave, 49 m band: one station per filter, all visible on the waterfall at once:

• 5.950: clean reference station

• 5.985: a whistle from a nearby carrier. Click Notch

• 6.010: selective fading. Switch AM to SAM

• 6.070: mains hum. Hum 50 Hz filter

• 6.095: a DRM digital broadcast (just hiss in AM). Switch AUTO on and it recognises it

• 6.120: electric-fence clicks. Blanker

• 6.190: weak and hissy. Noise reduction

Shortwave, 41 m band: SSB, CW, RTTY and weather fax:

• 7.210: SSB voice, LSB (a little noisy). Try the noise filters

• 7.240: SSB voice, USB. Switch to LSB to hear the difference; try the SSB filter widths

• 7.275: CW Morse beacon, 20 WPM. The CW decoder shows its message: "OFFGRID-SDR DESIGNED BY DIDDY"

• 7.312: ham RTTY, 45.45 baud, 170 Hz shift: a CQ call

• 7.330: AM broadcaster. Compare its loudness with SSB

• 7.355: RTTY weather teleprinter, 50 baud, 450 Hz shift

• 7.395: fast CW Morse beacon, 35 WPM. The decoder learns the speed by itself

• 7.425: weather fax. The decoder draws a test chart

20 m ham band: PSK31, Hellschreiber, SSTV

• 14.0635: Hellschreiber: "OFFGRID-SDR HELL DEMO 73" painted on the strip

• 14.071: PSK31: a CQ call and a short message

• 14.230: SSTV: a colour test card in Martin M2, about once a minute

Maritime

• 518 kHz: NAVTEX: a gale warning, with its header

• 8414.5 kHz: DSC: a safety call to all ships, then a distress call (sinking)

Mystery

• 4.625: a simulated Buzzer (UVB-76), with its 25-buzzes-a-minute rhythm

Time station

• 9.996: a simulated RWM, 1.6 ppm off. Try Receiver settings → Frequency calibration

==== ONE-TIME DRIVER SETUP ====

The browser must be allowed to talk to the stick directly.

Windows: Run Zadig, go to Options → List All Devices, choose "Bulk-In, Interface (Interface 0)" / RTL2838UHIDIR, select WinUSB, and click Replace Driver.

Linux: four steps, then check.

1. Stop the TV driver loading at boot:

        echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/rtl-sdr-blacklist.conf

2. Unload it now (the blacklist alone does not unload a driver that is already running — skipping this causes "setRegBuffer failed" errors):

        sudo modprobe -r rtl2832_sdr dvb_usb_rtl28xxu

(or simply reboot)

3. Give your user access to the stick:

 ...

Read more »

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

    diddy • 12 hours ago • 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 • 6 days ago • 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 »

  • Example log of Weather Fax

    diddy • 10/03/2026 at 13:15 • 0 comments

    Example of Weather Fax chart using the Nooelec RTL-SDR v5 with a YouLoop antenna

View all 6 project logs

Enjoy this project?

Share

Discussions

diddy wrote 2 days ago • 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

Similar Projects

Does this project spark your interest?

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