An AI-native air traffic control console that works real, live air traffic — and grades its own AI against reality, 24/7. It ingests live ADS-B transponder returns around 15 of the world's busiest airports, pulls live weather, and runs an autonomous ATC decision core that does the controller's job — then locks each prediction and measures it against what actually happened.
▶ Live: naventra.rianfernando.com · Live console · Operator's Guide
Most "AI" demos never check themselves. Naventra does: when an inbound flight commits to final, the engine locks its plan — arrival runway, touchdown ETA, landing order, active configuration — and when the flight lands, ground truth is derived purely from the observed track and every locked item is graded ✓/✗. The all-time and trailing-24h accuracy is shown live, per category, with a rolling log. It's an AI that publishes its own report card.
Kept honest: only live traffic banks into the persistent score (simulated traffic is graded on screen but never persisted); go-arounds void their predictions; unclassifiable landings are discarded rather than guessed; conflict advisories aren't graded — a controller resolving a predicted conflict is not a miss.
flowchart LR
subgraph Sources["Free · keyless sources"]
A["ADS-B<br/>airplanes.live · adsb.lol · adsb.fi"]
W["Weather<br/>NOAA/NWS METAR · TAF"]
O[("OurAirports<br/>public domain")]
end
subgraph Browser["Browser · React + three.js"]
E["Decision engine<br/>allocation · sequencing · CPA"]
S["Self-grading scorecard"]
R["3D / 2D radar"]
end
subgraph Cloud["Always-on · Cloudflare"]
K["Worker · 1-min cron"]
D[("D1 database<br/>model + training rows")]
end
A --> E
W --> E
O -. build time .-> E
E --> S --> R
A --> K --> D
D -->|"global scorecard + model"| S
D -->|"/api/dataset.jsonl"| ML["Offline ML training"]
The entire decision engine runs client-side. The Cloudflare Worker is an optional backend that runs the same engine 24/7 so the score keeps improving with no browser open.
- Runway configuration — head/crosswind for every runway end from the live METAR; selects the active arrival/departure config, flags crosswind advisories.
- Weather Outlook — pulls the live TAF and projects when the wind will flip the runways, plus a transparent disruption-risk estimate per forecast period.
- Arrival sequencing — classifies each track by phase (enroute → arrival → approach → final → ground), orders arrivals by ETA and distributes them across active parallel runways.
- Separation monitoring — pairwise closest-point-of-approach with a 150 s lookahead against 3 nm / 1,000 ft minima; VFR, rotorcraft and slow low-level traffic excluded like real STCA.
- Emergency detection — squawk 7500 / 7600 / 7700 and ADS-B emergency flags surface as priority alerts on the scope and strips.
- Ground logistics — arrivals get a real terminal + stand from the airport's gate layout.
- Radio comms — decisions voiced as realistic VHF phraseology on the facility's real frequencies, with airline telephony ("Speedbird", "Cathay", …) and pilot readbacks.
- The scope — a 3D TRACON view (drag to orbit, scroll to zoom, true-altitude stems, history trails) with a 2D top-down toggle; deep zoom (2–5 nm) draws real runways, thresholds and a schematic terminal layout.
A companion Cloudflare Worker (worker/) runs the engine on a 1-minute cron against JFK / LAX
/ LHR, grading real landings and banking the learned model into a free D1 database. Set
VITE_TRACKER_URL and the frontend shows one continuously-improving global score; unset, it
runs fully client-side with per-browser learning.
Every graded operation is logged as a labeled training row — ~25 factors captured at lock
time (approach geometry, aircraft type + wake category, live wind components, ceiling, flight
category, time of day, runway config, traffic density, sequence) plus the observed outcome —
and exported as JSONL from /api/dataset.jsonl. That turns the tracker into a growing dataset
you can train a full ML model on offline (free, keyless) and serve back as pure-JS inference.
See worker/README.md for the schema, deploy steps and a training recipe.
| Feed | Source | Notes |
|---|---|---|
| Live traffic (primary) | airplanes.live | CORS-open, includes airframe type + operator |
| Live traffic (fallback) | adsb.lol, adsb.fi | via proxy rewrites |
| Weather | NOAA / NWS METAR + TAF | real observations & forecasts |
| Flight routes | adsbdb.com | callsign → origin/destination |
| Airports & runways | OurAirports | public domain, generated at build time |
If every live source is unreachable (or you press LIVE OPS to force SIM), a physics-based
simulation takes over, seeded with the airport's real runway geometry, carrier mix and current
weather. The engine, panels and comms run identically in both modes. See NOTICE.md
for full attribution.
JFK · LAX · ATL · ORD · SFO · SEA · DFW · LHR · CDG · FRA · AMS · HND · HKG · SYD · DXB — each with real runway lengths/headings, ILS coverage, tower/ground/approach/ATIS frequencies, field elevation, terminals and gates.
npm install
npm run dev # http://localhost:5173The Vite dev server proxies the non-CORS APIs (see vite.config.js). Deploy config for
Vercel (vercel.json) and Netlify (netlify.toml) is preconfigured — npm run build
and deploy as-is. Regenerate airport data with node scripts/gen-airports.mjs.
The Feedex feedback launcher is injected at build time
by a Vite plugin (vite/feedex.js) — only when a publishable key is set, so local dev
never posts into the real inbox. Set VITE_FEEDEX_KEY (or NEXT_PUBLIC_FEEDEX_KEY, which
Vercel uses — see the env-var note in .env.example) to a pk_fdx_… key. Appearance is
pinned on the tag to match the brand (cyan accent, dark, bottom-right). A report carries
only non-sensitive context — the current route and the app version/build — never live
traffic, aircraft, user content or keys; Naventra has no accounts, so no email is attached.
Tests: npm run test:feedex.
src/
data/airports.js generated airport DB (runways, freqs, gates, carriers)
lib/ geo/CPA math, ADS-B ingestion, weather, TAF forecast, sim
engine/ pure decision core, grading, learning, forecast (shared with worker)
hooks/useAtcSystem.js orchestration: polling, failover, engine ticks, event diffing
components/ Radar3D + RadarScope + console panels + landing scene
pages/ Landing, Guide, About / Data / Privacy
worker/ optional Cloudflare Worker + D1: 24/7 tracker & dataset
scripts/ airport-data generator, CI engine-regression suite
MIT © Rian Fernando. Independent project — not affiliated with any aviation authority and not for operational use.
