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.
Replay of a slow spoof walk-off. The forged fix stays plausible. The physics doesn't. Flagged in under a second.
All four checks agree. GPS is safe to feed to navigation.
Something is off. Signal health is slipping or checks mildly disagree.
Signal drowned out. Fixes are missing or too noisy to use.
The signal looks healthy but contradicts physics. Someone is lying.
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.
Does the reported motion match what the IMU says the airframe actually did? Teleporting fixes fail here instantly.
A short inertial estimate carried forward from the last trusted fix. Slow walk-off spoofs diverge from it and get caught.
An independent altitude channel the spoofer can't touch. GPS altitude has to agree with the air itself.
Carrier-to-noise and satellite count from the receiver. Jamming shows up here before positions even go bad.
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.
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.
# 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.
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