GNSS integrity monitoring · software only · no hardware

Every GPS receiver trusts the sky.

We're the software that tells it when not to.

Navoro watches a drone's flight telemetry and continuously cross-checks the GPS channel against everything else onboard: IMU, barometer, satellite signal health. Jamming and spoofing get caught the moment they start, not after the drone has already flown somewhere it shouldn't.

TRUST SCORE · SCENARIO: SPOOF_WALKOFF TRUSTED
C/N₀ (dB-Hz)
44.1
SATELLITES
12
GPS↔IMU DRIFT
0.3 m

Replay of a slow spoof walk-off. The forged fix stays plausible. The physics doesn't. Flagged in under a second.

The four verdicts
TRUSTED

All four checks agree. GPS is safe to feed to navigation.

DEGRADED

Something is off. Signal health is slipping or checks mildly disagree.

JAMMED

Signal drowned out. Fixes are missing or too noisy to use.

SPOOFED

The signal looks healthy but contradicts physics. Someone is lying.

How detection works

A spoofed signal can say anything. It can't rewrite physics.

Every GPS fix is tested against what the aircraft's own sensors say is possible. Four independent checks, none of which trusts the GPS on its own, fused into a single score, with hysteresis, so one noisy frame never flips the state.

CHECK / KINEMATICS

Kinematic consistency

Does the reported motion match what the IMU says the airframe actually did? Teleporting fixes fail here instantly.

CHECK / DEAD RECKONING

Dead-reckoned position

A short inertial estimate carried forward from the last trusted fix. Slow walk-off spoofs diverge from it and get caught.

CHECK / BAROMETER

Barometric altitude

An independent altitude channel the spoofer can't touch. GPS altitude has to agree with the air itself.

CHECK / SIGNAL

Signal health

Carrier-to-noise and satellite count from the receiver. Jamming shows up here before positions even go bad.

0.96
FUSED TRUST SCORE · 0 TO 1

One number, one state, every frame. Deterministic and pure: the same telemetry always produces the same verdict, which is exactly what you want when the verdict gets audited.

Honest limitation

Dead reckoning has a clock on it. We say so.

Inertial estimates drift, because IMU bias drifts. That bounds how long the system can keep distrusting GPS on inertial data alone: tens of seconds, not minutes, before the estimate needs to re-anchor to something external.

A real deployment re-anchors periodically with vision or map matching rather than trusting dead reckoning indefinitely. We'd rather state that bound than hide it. You're going to find it anyway.

Integration

One function. Frames in, verdicts out.

# pure and deterministic. one Detection per frame
from src.detector.engine import run

detections = run(frames, config)

# each Detection:
#   trust_score: 0.0 to 1.0
#   state: TRUSTED | DEGRADED | JAMMED | SPOOFED

$ make setup && make run
# then http://localhost:8000, pick a scenario, hit Run

It's a library, not a platform. Feed it telemetry frames, from a flight log or a live stream, and it returns a verdict for every frame. No hardware, no SDR, no cloud dependency.

  • Software-only. Runs on logged or streaming telemetry from sensors the aircraft already has.
  • Deterministic. Same input, same output, every time. Auditable by replay.
  • Simulator included. Labelled jamming and spoofing scenarios for testing the detector. Synthetic data only, nothing that touches radio hardware.
60 seconds to a verdict

Watch a spoof get caught in real time.

Four canonical scenarios: clean flight, spoof jump, slow walk-off, jam corridor. Streamed onto a live map, colored by trust state as detections land.

Book the demo