SAVETHESAT

An open GPS jamming detector you can build for the price of a takeaway. Flash it here, power it from a USB bank, watch the map fill in.

What it detects

A jammer does not announce itself. What it leaves behind is measurable, and a u-blox receiver reports all of it over UART:

SignalWhat it means
Jamming indicatoru-blox's own 0–255 interference estimate
AGC levelFalls as the front end backs off from rising input power
C/N0 collapseSatellites still in view, but carrier-to-noise gone
Fix lost, sats visibleSeparates jamming from simply having no sky
Noise per msBroadband noise floor at the receiver

Each is scored against a baseline the device learns for itself in its first minute. The dashboard shows every contribution separately, so you can see why it reached a verdict rather than taking its word for it.

Hardware

PartNotes
Seeed XIAO ESP32-C5Any ESP32-C5 board works
u-blox GNSS ×1 or ×2Must be u-blox — M10 or M9N ideal, M8N fine
USB power bankRuns all day

Cheap non-u-blox modules (ATGM336H, generic MTK) output NMEA only and have no jamming indicator. They will not work for the primary detection.

Wiring

SignalGPIO
GNSS A — module TX → ESP RX12
GNSS A — module RX ← ESP TX11
GNSS B — module TX → ESP RX4
GNSS B — module RX ← ESP TX5

Both modules at 9600 baud. A single module on port A is enough to start — port B simply reports as absent.

After flashing

  1. Power-cycle the board.
  2. Join the Wi-Fi network Savethesat-XXXX, password savethesat.
  3. Open http://192.168.4.1/ — or http://savethesat.local/.

The access point deliberately offers no internet and runs no captive portal. Your phone notices there is no uplink, keeps mobile data as its default route, and still reaches the dashboard over Wi-Fi. Both work at once.

Rules of the road

Receive only. Savethesat listens. It never transmits in a GNSS band, and it never will. Detecting and mapping interference is lawful nearly everywhere; transmitting in these bands is not, anywhere.