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:
NIC
11
10
9
8
7
6
5
4
3
median rc (m)
8
25
75
186
371
926
1852
3704
7408
The inference rule
Interference is inferred from multiple proximate aircraft,
never a single report. The pipeline:
Streams a full UTC day of open ADS-B traces from
adsb.lol.
Keeps only airborne positions that carry a NIC value
(ground positions and non-positional records are dropped).
Bins each position into an H3 resolution-4 hex
(~1,770 km² per cell).
For each aircraft in each hex, marks it degraded if the
majority of its NIC reports there are
nic ≤ 6 (containment radius ≳ 1 km).
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:
Zone
cells ≥5 aircraft
max degraded ratio
Kaliningrad / Baltic
121
1.00
Eastern Med / Cyprus
181
0.67
Central US (quiet control)
212
0.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.