Skip to content

Repository files navigation

Naventra — AI Air Traffic Command

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.

CI CodeQL License: MIT API keys required: 0 Live

▶ Live: naventra.rianfernando.com · Live console · Operator's Guide

Naventra

Why it's different

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.

Architecture

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"]
Loading

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.

What the console does

  • 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.

Always-on learning & the open dataset

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.

Data sources (all free, no API keys)

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.

Airports

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.

Run it

npm install
npm run dev        # http://localhost:5173

The 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.

Feedback widget (Feedex)

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.

Project structure

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

License

MIT © Rian Fernando. Independent project — not affiliated with any aviation authority and not for operational use.

About

AI-native air traffic control console — live ADS-B traffic, wind-driven runway allocation, a self-learning prediction engine graded against real landings, 3D radar, and a 24/7 Cloudflare tracker building an open training dataset. Free and keyless.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages