DEAD·RECKONING
← back to the map

How airliners accidentally became jamming sensors

Right now, in a handful of places around the world, airline pilots are flying through airspace where GPS no longer works. Their navigation systems can't get a reliable fix, because someone on the ground is interfering with the signal. This happens far more often than most people realize, and almost none of it is reported publicly.

DeadReckoning tracks where it's happening. It maps GPS interference worldwide, day by day, using a signal that passenger aircraft have been broadcasting the whole time.

Strictly, what the aircraft reveal is interference: the signal has become unreliable. Jamming is one cause, drowning out the signal; spoofing, feeding receivers a false position, is another. This map shows where GPS has stopped being trustworthy, without always distinguishing which technique did it.

The interference is not random. Independent reporting describes GPS interference as a growing feature of modern conflict, clustering around war zones, contested borders, and military exercises. When it happens, civilian aircraft lose a basic tool of navigation, ships and drones drift off course, and the disruption ripples outward. Knowing where GPS is failing, and when, is a way of watching those conflicts from the outside.

Every airliner constantly reports how confident it is in its own GPS position. That number is meant for air traffic control. But when GPS is interfered with, the number drops, and it drops for every aircraft in the area at the same time. Enough planes reporting trouble in the same place, on the same day, is a reliable sign that GPS is being interfered with there. Collect those reports over months and you can map interference across the globe without any special access, because the data was public all along.

This piece explains how that works, and, just as importantly, where the map goes dark and why.

The accidental sensor

Every modern airliner broadcasts its position several times a second over a system called ADS-B, so that air traffic control and nearby aircraft always know where it is. Bundled into that broadcast is a smaller, less obvious number: a measure of how much the aircraft trusts the position it just reported. It is called the Navigation Integrity Category, or NIC, and it runs from 0 to 11. A high number means the aircraft's GPS receiver is confident its position is accurate to within a few meters. A low number means it can no longer make that guarantee.

The number exists for safety, not for detecting jamming. It tells other aircraft and controllers when a plane's position can be trusted for tasks like spacing and collision avoidance. But it has a useful side effect. When GPS is jammed, the receiver loses its ability to confirm how accurate its own position is, and the integrity number falls, often all the way to zero, which the standard defines as "integrity unknown." That collapse is not a malfunction in the aircraft. It is the aircraft correctly reporting that the satellite signal it depends on has stopped being reliable.

One plane proves nothing

A single aircraft reporting low integrity means very little. Its receiver could be faulty, its antenna blocked by the airframe in a turn, or the reading could be a momentary glitch. Equipment fails in ordinary ways all the time. If the map treated one unhappy aircraft as evidence of interference, it would be wrong constantly.

The signal only becomes trustworthy when many aircraft agree. Interference affects a place, not a plane: it degrades every receiver in the affected area at once, regardless of airline, aircraft type, or equipment. So DeadReckoning does not just track individual aircraft, it looks for that shared pattern. It divides the world into cells, roughly forty miles across, and for each one asks the same question: on this day, did most of the distinct aircraft that passed through report degraded integrity here? When the answer is yes across many separate aircraft, ordinary equipment failure stops being a plausible explanation. Interference does.

The map also refuses to guess. A cell needs a minimum number of aircraft passing through before it will show any reading at all. Below that floor, there simply is not enough evidence, and the cell stays blank.

The honesty problem

This is where most interference maps quietly mislead, and where DeadReckoning tries not to. A cell can be dark for two completely different reasons. It can be genuinely calm, watched by plenty of aircraft that all report healthy GPS. Or it can be dark because almost no aircraft fly there, so there is nothing to measure. A map that shows both the same way tells you far less than it appears to.

DeadReckoning displays them differently on purpose. Cells with strong coverage and no interference are shown in a faint teal wash, and cells with too little air traffic to judge are drawn as a dim diagonal hatch rather than being colored as calm. The instrument shows its own blind spots plainly. A reader can always tell the difference between "nothing is happening here" and "we cannot see what is happening here," because confusing the two is how a map starts lying by omission.

The sensor-desert paradox

That distinction leads to the hardest limit of the whole approach. The instrument depends on commercial aircraft, and commercial aircraft avoid danger. They do not fly over active war zones, closed airspace, or the most heavily contested borders. So the places where interference is often most intense are frequently the places with the fewest aircraft to detect it.

The result is a paradox at the center of the map. Western Ukraine and the airspace around Kaliningrad, where interference has been reported for years, are thinly covered, because so few civilian flights travel this airspace. The signal that does get through comes from the edges: the aircraft still transiting nearby, skirting the danger rather than crossing it. DeadReckoning marks these regions and explains why they are sparse, but it cannot pretend to see into airspace that civil aviation has abandoned. The map is sharpest where aircraft are dense and normal life continues, and it is dimmest in exactly the places that matter most. Any honest reading of it has to hold both of those facts at once.

Mean daily aircraft coverage against mean interference, one point per tracked region (log x).

Why memory matters

A few tools already show current GPS interference. They answer a useful question: where is GPS being interfered with right now? DeadReckoning was built to go beyond that, and answer a harder one: how does today compare to what this place is normally like?

That comparison is the point of keeping an archive. For every cell on the map, DeadReckoning learns a baseline from its own recent history. On the anomaly layer, each new day is measured against that baseline, so a region that is always a little degraded reads as calm against its own normal, while a sudden jump in a place that is usually clean stands out sharply, even when the raw numbers are modest. Interference means something different depending on where it happens, and only a record over time separates a place that is chronically noisy from one that just changed.

A record over time also prevents a basic error of reading. Consider two cells showing the same heavy interference. Over a military test range in the American Southwest, it is almost certainly a scheduled exercise, published in advance and routine. Over a contested border, it is something else. The reading is identical; the meaning is not. The map keeps them straight by attaching the context that is publicly known to each region and its events, so the same signal is never presented as the same story.

Every currently tracked region: mean and peak daily degraded ratio, its current classification, and the count of annotated events. Classifications are the current read for this window, not permanent labels.

The method

Every reading on the map rests on a few explicit choices. An aircraft counts as degraded when its reported integrity crosses the point where its position is too loose to trust for navigation. A cell appears only when enough aircraft pass through it to make the reading meaningful. A cell earns a baseline only after enough days of history to establish its normal. Each threshold is set once and applied identically everywhere on the map, on every day.

The full specifications, and how much the results move as each threshold changes, are set out below. What matters here is that the reasoning is on the table: the same rules, drawn the same way, everywhere, so the map can be examined rather than simply believed.

Distribution of the per-hex degraded ratio across every hex-day meeting the five-aircraft floor (log y).

The close

DeadReckoning is built entirely from open data, and everything it produces is open in turn. The aggregated data is published under the Open Database License, the same terms as the flight data it comes from. The code is MIT licensed and public. The whole system runs on infrastructure that costs nothing to operate.

There is far more in the data than one map can show. The archive is still growing backward in time and forward every night, and the questions it can answer sharpen as it deepens: whether interference tends to lead or follow the events near it, how spoofing differs from simple jamming, which regions are beginning to shift. Those are the next things to build. GPS interference has become a routine feature of modern conflict, and most of it happens with no public record at all. DeadReckoning sets out to change that.


Full specifications

The complete technical reference behind the essay above: what NIC is, the inference rule and thresholds with their sensitivity, the honesty rules, validation, the limits of the instrument, and licensing. Nothing here is new; it is the detail the essay leaves out.

What NIC is

Every ADS-B–equipped aircraft broadcasts a Navigation Integrity Category (NIC), an integer from 0 to 11, alongside its position. NIC states how tightly the aircraft's own navigation system can bound the error on the position it is transmitting. It is paired with a radius of containment (rc, in metres). High NIC means a small, trustworthy containment radius; low NIC means a large one.

When GNSS (GPS, Galileo, GLONASS, BeiDou) is jammed or spoofed, receivers lose the ability to bound their error, and NIC falls, often all the way to 0 ("integrity unknown"). Many aircraft in one area reporting low NIC at the same time is the fingerprint of interference in that airspace. Our sample day shows the containment ladder cleanly:

NIC11109876543
median rc (m)82575186371926185237047408

The inference rule

Interference is inferred from multiple proximate aircraft, never a single report. The pipeline:

  1. Streams a full UTC day of open ADS-B traces from adsb.lol.
  2. Keeps only airborne positions that carry a NIC value (ground positions and non-positional records are dropped).
  3. Bins each position into an H3 resolution-4 hex (~1,770 km² per cell).
  4. For each aircraft in each hex, marks it degraded if the majority of its NIC reports there are nic ≤ 6 (containment radius ≳ 1 km).
  5. Computes each hex's bad_ratio = degraded aircraft ÷ unique aircraft.
The unit of "degraded" is the aircraft, not the report. One aircraft lingering with poor reception cannot make a hex look jammed; the signal only rises when many distinct aircraft agree.

Thresholds & their sensitivity

The degraded threshold nic ≤ 6 is chosen because NIC 6 corresponds to a containment radius of roughly 1 km, the point at which a position is too loose to trust for navigation. NIC 7 and above (rc < ~370 m) are treated as healthy.

Design decision: nic = 0 counts as degraded. On the reference day the degraded signal is dominated by nic = 0 reports (~85% of all degraded points): aircraft dropped to "integrity unknown," which is the expected physical signature of a receiver under interference that can no longer bound its own error. Excluding it would throw away the strongest evidence of GPS denial, so it is folded in deliberately. Spatially this behaves as a real signal should: it concentrates in known interference zones (Baltic/Kaliningrad up to 1.0) and is near-absent over a quiet control (central US ~0.10 max). Sensitivity (kept on the record): the degraded-point fraction is 5.98% including nic = 0 vs 0.87% excluding it. Sample-day figures, so the map is largely a nic = 0 density surface, and you should read it as one. A per-hex strict view (1 ≤ nic ≤ 6) is a planned toggle to show that band directly. All thresholds live in a single config file and are versioned with the data.

Confidence & the honesty rule

Every hex ships with its unique-aircraft count and a confidence tier: high (≥10 aircraft), medium (5–9), and insufficient (<5). Hexes below the minimum-aircraft floor are never rendered as a value or a confident color. On the map they appear as a dim diagonal hatch (the Low-sample cells toggle). This is the whole point of the instrument: you can always tell "no interference" from "no coverage."

That distinction only works if coverage is visible: a dark cell could mean "watched and calm" or "nobody was looking." So measured-but-quiet airspace draws a faint watched-airspace carpet (the Quiet coverage toggle, on by default). It is a whisper that never competes with a real bloom, but it turns the black background into an honest three-state reading: quiet (watched, calm), degraded (the signal), hatched (too few aircraft to judge).

The sensor-desert paradox

There is a fourth state, and it is the most important caveat in the whole instrument. We measure interference where civil aircraft fly, which is systematically not the airspace that is closed or avoided. When airspace is closed or widely avoided the sky empties and the sensors leave with the traffic, so the worst jamming can sit inside a dark zone that means "nobody was looking," not "all clear." We see the edges of such airspace, not its interior. The overlay describes the instrument's blindness (an airspace-status fact), not the reasons behind it.

The Airspace context overlay (on by default) keeps that honest. A violet dashed outline with a faint wash (a hue never used for signal) marks airspace that is closed to civil aviation (e.g. Ukraine, since Feb 2022), of reduced coverage (e.g. Russia, widely avoided and thin on volunteer receivers), or a known test area (US ranges where GPS testing is recurring and announced). Each zone card leads with the regulatory fact and its source; click a zone to read it. So the fourth reading is outlined: the instrument is blind here, and that blindness is itself information. Zone outlines are drawn from Natural Earth boundaries as context, not precise airspace geometry.

Not every dark cell is a zone. Oceanic and remote-region darkness reflects terrestrial ADS-B receiver range (roughly 250 nm offshore before line-of-sight runs out) and volunteer-receiver sparsity, not airspace status. The traffic-density Coverage view is the honest instrument for where the sensors are; the zone layer is reserved for regulatory / conflict causes only. A dark ocean is a coverage fact, not a closed zone.

A worked example: same signal, three meanings

The instrument's core lesson is that the reading is not the analysis. On any given day, three places can look similar on the map and mean entirely different things, which is why context lives in the region profiles, not the color scale.

  • Kaliningrad & the Baltic: a chronic, wide-area degradation beside an active conflict; European reporting attributes it to Russian electronic-warfare activity. Here degraded NIC is the baseline, not the anomaly.
  • Central US: a quiet control. This is what "clear" looks like on the same sensor, and it's why a lit-up region elsewhere is meaningful rather than an artifact of the method.
  • US Southwest (White Sands / NTTR): an identical NIC-degradation signal to a hostile jamming zone, but benign: scheduled, publicly NOTAM'd GPS-test exercises. The sensor cannot tell the two apart; only the context can. This region is included deliberately as the interpretive control.
This is the whole thesis in one comparison: an instrument shows you where integrity degrades; deciding what it means is analysis, done with sources, never asserted by the map.

Validation

Two checks keep this honest:

Internal (quantified). On the reference day, known chronic zones light up as expected while a deliberate control stays dark:

Zonecells ≥5 aircraftmax degraded ratio
Kaliningrad / Baltic1211.00
Eastern Med / Cyprus1810.67
Central US (quiet control)2120.10

Signal and background separate cleanly; the method isn't lighting up everywhere aircraft fly.

External (independent reference). The persistent hotspots this archive surfaces (the Baltic/Kaliningrad corridor and the eastern Mediterranean) are the same regions independently mapped as chronic GNSS-interference zones by live trackers such as GPSJam and Flightradar24. Those tools show current conditions; you can compare any date directly on GPSJam. A dated side-by-side cross-check for 2026-07-13 found agreement on every major hot zone: Baltic/Kaliningrad, the Black Sea western rim through Istanbul and eastern Turkey, Moscow-area spots, and the eastern Mediterranean. That held despite the two projects drawing on different feeder networks (adsb.lol vs ADS-B Exchange). Two independent pipelines agreeing on the same date is strong corroboration; the writeup and caveats are in docs/validation/2026-07-13. It is visual corroboration between two ADS-B-derived estimates, not validation against ground truth.

Baselines & anomaly

Chronic zones are interesting; change is more interesting. For each hex we compute a rolling baseline (mean and standard deviation of bad_ratio over up to 28 qualifying days) and express each day as a z-score: how many standard deviations above its own normal the hex sits. The default map view is this anomaly score; a toggle shows the raw ratio. A hex needs at least 7 qualifying days of history before it earns a baseline, so early in the archive many hexes show raw values only. The baseline uses the window of available days around each date, which suits a retrospective archive rather than a real-time alarm.

What this instrument cannot see

  • Coverage bias. The signal exists only where aircraft fly and where ground receivers hear them. Open ocean, closed airspace (e.g. much of wartime Ukraine and the Black Sea), and receiver-sparse regions read as no data, not as no interference.
  • Equipment & multipath false positives. Old or faulty avionics, and dense-terrain multipath, can lower NIC without any interference. The multiple-aircraft rule suppresses most of this, but a single anomalous hex is never proof.
  • Cause. NIC degradation shows that integrity dropped, not why or by whom. Attribution lives only in the region context profiles, with sources, and is labeled as analyst interpretation, not asserted by the map.
  • Spoofing vs jamming. v1 measures integrity degradation broadly; distinguishing spoofing (false positions) from jamming (lost positions) is future work.

Verification & quality

The instrument is built to be checked, not trusted on faith.

  • Independent review passes. Every batch goes through separate reviews for code correctness, content sourcing, visual design, and a pre-publication audit before it ships. No pass reviews its own author's summary.
  • Automated tests with regression guards. A suite of tests locks the honesty rules in place: the majority-rule boundary, the baseline math, parser filtering, draft gating, and a check that every listed day resolves to a present, well-formed artifact.
  • Deterministic pipeline. Re-running a day regenerates its file byte-for-byte, and every derived aggregate is reproducible from the dailies.
  • Sources are link-verified. Region, event, and airspace sources are checked live, and claims are corrected before content clears draft.

The external cross-check against independent instruments is covered under Validation above.

Reading the map honestly (design semantics)

The color choices are part of the method, not decoration. A few rules make the map trustworthy:

  • Colorblind-safe, verified per theme. Every meaning-bearing ramp uses colorblind-safe palette families and is verified for monotonic lightness on both the light and dark grounds; formal per-deficiency simulation is on the roadmap.
  • Saturated red means one thing. Alarm-red is reserved for extreme anomaly and appears nowhere else, so a red cell is never ambiguous.
  • Insufficient data is never a value. Cells below the aircraft floor render as a hatch, distinct from both quiet and signal. Low sample never earns a confident color.
  • Context is outlined, never filled. Airspace zones and event markers use outlines and markers in a hue never used for signal, so annotation can never be read as data.
  • The numbers stay honest. Ramp scaling can be nonlinear for legibility, but the value shown on hover or click is always the true number.

Archive coverage & gaps

The archive is dense, not continuous, and the missing days are worth naming rather than papering over. A day with no source dump is not a quiet day; it renders as absent, and the scrubber simply has nothing to show.

The archive begins 2023-02-16. That is not a choice we made, it is the first UTC day adsb.lol published a dump for. Nothing earlier exists to ingest, so the record starts there and no amount of backfilling moves it.

Six days inside the archive's span carry no data, each for a reason we can state:

  • 2023-03-10, 2026-05-05. A release exists upstream but its payload is a placeholder that yields zero aircraft, so the pipeline records the day as a gap rather than as an empty measurement.
  • 2023-12-31, 2024-12-31, 2025-12-31. Each year's final day was tagged upstream without an archive payload attached.
  • 2026-05-06. The only dump for this day is MLAT-only. MLAT positions are computed by ground receivers timing a signal, not reported by the aircraft itself, so they carry no aircraft-reported integrity figure. Ingesting them would produce a number that looks like NIC but is not, so we exclude the day on purpose.

Two source-quality notes apply to days that are present:

  • 2023-02-16 to 2023-03-02 predate the publisher settling on its production tagging, and carry far fewer contributing feeders (roughly 0.1 to 1 GB of traces per day, against about 3 GB later on). The traces are real, but coverage is thin, so most cells in this fortnight fall below the aircraft floor and render as hatch. That is the honesty rule doing its job, not a rendering fault.
  • 2025-05-28 to 2025-06-10 were published under a temporary tag suffix rather than the usual production one. The dumps are the same size and shape as the days on either side, and are treated identically.

Coverage within a present day varies enormously by region, which is a separate matter from a missing day and is covered under the sensor-desert paradox above.

Time, data & licensing

Everything is UTC; the source dumps are UTC days. Source flight data © adsb.lol feeders and partners, published under the Open Database License (ODbL) 1.0. Our per-day aggregates are a derivative database, also published under ODbL; only aggregates are retained; raw traces are deleted after processing. The project code is MIT. Basemap © OpenStreetMap contributors via OpenFreeMap.

← back to the map