Real-time global aircraft tracker with 3D globe view, military/VIP detection, and comprehensive aviation intelligence.
✈️ Launch SkyTrack✈️

Self-hosted:
git clone https://github.com/SysAdminDoc/SkyTrack.git
cd SkyTrack
# Open index.html in any browser — no build step, no dependenciesSkyTrack deploys as a zero-dependency, single-file web application. No npm, no
bundler, no server required to run it — just open index.html.
For maintainability the app is authored as three files and built back into one for release:
SkyTrack/
├── src/
│ ├── index.html # HTML shell + inline PWA manifest + service-worker reg
│ ├── styles.css # All stylesheet rules
│ └── app.js # The main application script
├── build.mjs # Builder: inlines styles.css + app.js into index.html
├── package.json # Declares `npm run build` / `npm run check`
└── index.html # Generated single-file release (checked in for GitHub Pages)
Edit the files under src/, then regenerate the deployable single file:
node build.mjs # or: npm run build
node build.mjs --check # exit 2 if root index.html is stale (for CI)The builder has no external dependencies — it uses Node's standard library
only. The build is a verbatim concatenation: the rebuilt index.html is
byte-identical in content to the src/ files, so running it and committing the
output is completely mechanical.
During development you can also just open src/index.html directly in a
browser and edit src/styles.css / src/app.js with live reload; the build
step is only needed when you want to ship a fresh single-file index.html.
| Feature | Description |
|---|---|
| Multi-Source ADS-B | Parallel data from Airplanes.live, ADSB One, and ADSB.lol with automatic failover |
| Grid Fetch | Viewport-tiled API requests for global coverage — see every plane in the sky |
| Smooth Animation | Interpolated movement on 2D map via requestAnimationFrame, SampledPositionProperty on 3D globe |
| History Trails | Altitude-colored flight paths with local history and OpenSky trajectory data |
| Altitude Tape | Selected-aircraft panel shows a compact altitude scale with climb/descent trend |
| Time Airborne | Callsign chip estimates airborne duration from the local trail and adds route progress when available |
| Aircraft Photos | Auto-fetched from planespotters.net with preloaded image database |
| Category SVG Sprites | Inline top-down silhouettes distinguish light, small, large, heavy, rotorcraft, glider, balloon, UAV, and space categories |
| High-Volume Rendering | Canvas-backed points for ordinary traffic at 800+ aircraft; selected and priority aircraft keep detailed icons |
| Privacy Markers | PIA/LADD aircraft use a dashed magenta outline and ? badge to make anonymized addresses explicit |
| Trail Export | Export flight paths as KML or GeoJSON |
| Share Flight | Generate shareable links for specific aircraft |
| Historical Playback | Scrub through recorded flight paths with playback controls |

| Feature | Description |
|---|---|
| CesiumJS Globe | Full 3D Earth with terrain, atmosphere, and satellite imagery |
| Procedural 3D Models | Runtime-generated GLB airplane models with tubular fuselage, swept wings, tail, and engine nacelles |
| Smooth Interpolation | Aircraft glide between position updates using Cesium's SampledPositionProperty |
| 3D Trails | Flight history rendered as altitude-accurate glow polylines, with selected trails emphasized |
| Civil-Twilight Sky | Cesium swaps to a star-field skybox below civil twilight and restores the daytime atmosphere automatically |
| Satellite Constellations | Live ISS and sampled Starlink OMM orbits propagated with satellite.js in Cesium 3D |
| Type-Based Scaling | Heavy (A380, B747): large, Medium (A320, B737): mid, GA: small |
| Altitude Coloring | Ground through cruise altitude mapped to a color gradient |
| Click Selection | Click any 3D aircraft to select and view details |
| Feature | Description | Database Size |
|---|---|---|
| Military Detection | Identifies military aircraft by hex range and registration database | 11,383 aircraft + 7 hex ranges |
| VIP/Government | Tracks heads of state, government, and notable private aircraft | 12,420 aircraft |
| PIA Detection | Privacy ICAO Address — identifies aircraft using anonymized transponders | 94 aircraft |
| Interesting Aircraft | Flagged aircraft of special interest (chase planes, test aircraft, etc.) | 4,530+ aircraft |
| Civilian Categories | Categorized civilian fleet with type/operator data | Self-hosted DB |

| Feature | Description |
|---|---|
| 49,000+ Airports | Global airport database with ICAO/IATA codes, coordinates, and metadata |
| Arrival/Departure Boards | Real-time boards for any airport showing inbound and outbound traffic |
| Frequencies | Tower, ground, approach, ATIS frequencies for 11,000+ airports |
| Runway Visualization | Rendered runway outlines on the map |
| NOTAMs | Notices to Air Missions for selected airports |
| LiveATC | Direct links to live ATC audio feeds |
| METAR/TAF | Current weather observations and forecasts for airports |
| Feature | Description |
|---|---|
| 5,800+ Airlines | ICAO/IATA codes, names, callsigns, and country data |
| 5,774 Callsign Prefixes | Decode any flight callsign to airline and route |
| Alliance Memberships | Star Alliance, oneworld, SkyTeam identification |
| Route Prediction | Predicts origin/destination based on flight path analysis |
| Route Database | Known routes for 568 airlines |
| Feature | Description |
|---|---|
| Multiple Map Styles | Dark CartoDB, satellite, OpenStreetMap, and more |
| Traffic Heatmap | Density visualization of aircraft positions |
| Airspace Overlays | FAA Class B/C/D polygon boundaries, ARTCC and terminal areas, V/J airways, Shanwick/Gander/New York/Oakland oceanic FIRs, restricted areas, TFRs, and MOAs |
| Vector Overlay Rendering | VectorGrid slices dense airway GeoJSON, PolylineOffset separates V/J lanes, and EdgeBuffer preloads map tiles beyond the viewport |
| Fires & Hurricanes | NIFC active-fire incidents, NHC forecast cones/tracks, firefighting aircraft, and NOAA hurricane hunters |
| Weather Radar | Precipitation overlay from RainViewer |
| Mini-Map | Picture-in-picture overview map |
| Distance Measurement | Click-to-measure great-circle distances |
| Aircraft Clustering | Group dense traffic into expandable clusters |
| Fast Clustering | Supercluster viewport index keeps dense global views responsive |
| Virtualized List | Mobile aircraft list keeps the full sortable set without mounting every row |
| Privacy Aircraft | PIA/LADD traffic is visibly marked without relying on the randomized ICAO24 value alone |
| Feature | Description |
|---|---|
| Watchlist | Track specific hex codes or registrations with real-time alerts |
| Military Alerts | Configurable radius-based alerts for military activity |
| Notification Center | Centralized alert history with sound and desktop notifications |
| Bookmarks | Save and quick-jump to map locations |
| Feature | Description |
|---|---|
| Advanced Search | Search by hex, registration, callsign, type, airline, or airport with fuzzy ranking and / jump-to-callsign |
| Random Follow | Optional kiosk mode selects a fresh, filter-eligible aircraft every 15 seconds and centers the map |
| CPA Warnings | Bounded five-minute pairwise projection flags predicted conflicts within 5 nm and 1,000 ft |
| Holding Pattern | Selected-aircraft trails are checked for two level, consistent turns within eight minutes |
| Multi-Select | Ctrl+click to select multiple aircraft for comparison |
| Comparison Panel | Side-by-side analysis of selected aircraft |
| Altitude Chart | Live altitude profile with climb/descent phases |
| Time Machine | Browse historical aircraft positions |
| Feature | Description |
|---|---|
| Themes | Dark, Midnight, Light, High Contrast, Color Blind, CRT Radar, Cockpit OLED |
| Compact Mode | Dense layout for smaller screens |
| Accessible Motion & Dialogs | Alerts expose polite live regions, reduced-motion preferences stop map interpolation, and modals isolate background focus with inert |
| Mobile Optimized | Touch gestures, responsive panels, swipe navigation |
| Offline Mode | ServiceWorker caching plus ?demo=1 for a self-contained 24-hour continental replay |
| Dashboard Layouts | Configurable panel positions — Default, Minimal, Analyst presets |
| External Links | Quick links to FlightAware, FlightRadar24, ADS-B Exchange, Wikipedia |
┌──────────────────────────────────────────────────────────────────┐
│ index.html (single file) │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Data Sources │───>│ Grid Fetch │───>│ Aircraft Cache │ │
│ │ │ │ System │ │ │ │
│ │ airplanes. │ │ Viewport tiles │ │ Dedup + enrich │ │
│ │ live │ │ Parallel fetch │ │ with databases │ │
│ │ adsb.one │ │ Rate limiting │ │ │ │
│ │ adsb.lol │ │ CORS proxy │ │ │ │
│ └─────────────┘ └─────────────────┘ └────────┬────────┘ │
│ │ │
│ ┌─────────────────────────────────────────┤ │
│ │ │ │
│ v v │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 2D Map (Leaflet)│ │3D Globe (Cesium)│ │
│ │ │ │ │ │
│ │ Smooth markers │ ◄── Toggle ──► │ GLB models │ │
│ │ Altitude trails │ │ Interpolation │ │
│ │ Clusters/heat │ │ 3D trails │ │
│ │ Airspace layers │ │ Terrain/sat │ │
│ └─────────────────┘ └─────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Intelligence Layer │ │
│ │ Military DB │ VIP DB │ PIA DB │ Airlines │ Airports │ ... │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ UI: Search │ Alerts │ Watchlist │ Compare │ Settings │ │
│ └──────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
SkyTrack fetches live ADS-B data from multiple free APIs with automatic failover:
| Source | CORS | Priority | Coverage |
|---|---|---|---|
| ADSB One | No (proxy) | Primary | Global |
| ADSB.lol | No (proxied) | Secondary | Global |
| ADSB.fi | Yes | Tertiary | Europe-strong |
| Airplanes.live | Yes | Quaternary | Global |
ADSB.fi and Airplanes.live are queried directly from the browser. Public CORS proxies are reserved for feeds that cannot be queried directly, currently ADSB One and ADSB.lol.
Additional on-demand enrichment APIs (called only for the selected aircraft):
| API | Purpose |
|---|---|
| adsbdb.com v2 | Callsign → origin/destination airport lookup (400k+ routes) |
| hexdb.io | Fallback callsign→route and aircraft/airport metadata |
| aviationweather.gov /api/data | SIGMET, G-AIRMET, CWA, PIREP, METAR, TAF, NOTAM |
| OpenSky tracks API | Historical trajectory for the selected aircraft; optional OAuth credentials raise the daily quota |
| Open Aviation FIR dataset | CC BY 4.0 world FIR geometry; SkyTrack filters the four oceanic boundaries used by the overlay |
The grid fetch system tiles the visible map area with overlapping 250nm radius API queries, distributing requests across sources at 1 req/sec per API. At global zoom, this covers the entire planet in ~16 seconds with progressive loading.
For 3D terrain in globe view, get a free token at cesium.com/ion and enter it in Settings.
For feeds that block browser CORS, deploy tools/skytrack-proxy-worker.js to a
Cloudflare Worker and paste the deployed URL into Settings → Data Sources →
Personal CORS Proxy. The URL is stored only in this browser and is tried before
the shared public fallbacks; no SkyTrack credentials are required.
Access via the gear icon in the header. All settings persist in localStorage.
| Setting | Default | Description |
|---|---|---|
| Map Style | Dark CartoDB | Base map tile layer |
| Show Labels | On | Callsign labels on aircraft |
| Altitude Colors | On | Color-code trails by altitude |
| Show Airports | Off | Airport markers on map |
| Show Radar | Off | Weather precipitation overlay |
| Military Alert Radius | 50nm | Distance trigger for military alerts |
| Sound Alerts | Off | Audio notifications for watchlist/military |
| Compact Mode | Off | Dense UI for small screens |
| Follow Mode | Off | Camera tracks selected aircraft |
SkyTrack is designed for mouse/touch interaction. All controls are accessible via the header toolbar and panel buttons.
| Browser | Status |
|---|---|
| Chrome/Edge 90+ | Full support |
| Firefox 90+ | Full support |
| Safari 15+ | Full support |
| Mobile Chrome/Safari | Optimized touch UI |
Everything runs client-side in a single index.html — no server, no build process:
- Leaflet 1.9.4 — 2D map rendering, markers, layers
- CesiumJS 1.119 — 3D globe (lazy-loaded on first use, ~3MB)
- Leaflet.heat — Traffic heatmap visualization
- Leaflet.markercluster — Aircraft clustering at dense zoom levels
- IndexedDB — Client-side caching of airport/registration databases
- ServiceWorker — Offline capability and asset caching
All external libraries loaded from cdnjs.cloudflare.com CDN. No npm packages, no compilation.
Q: Where does the aircraft data come from? ADS-B (Automatic Dependent Surveillance-Broadcast) is a system where aircraft broadcast their GPS position, altitude, speed, and identity. Volunteer-run receiver networks like Airplanes.live and ADSB One collect and share this data via public APIs.
Q: Why are some aircraft missing? Not all aircraft have ADS-B transponders. Military aircraft often don't broadcast, and some older general aviation aircraft use Mode-C transponders which report altitude but not position. Aircraft using Privacy ICAO Addresses (PIA) may appear with randomized hex codes.
Q: How do I get 3D terrain working? Click the globe icon to enter 3D mode. Terrain loads automatically using a Cesium Ion token included in the app. For a custom token, sign up free at cesium.com/ion and enter it in Settings.
Q: Can I run this offline?
Yes. After the first load, the ServiceWorker caches core assets. Use ?demo=1 for a self-contained synthetic 24-hour continental replay; live aircraft data still requires an internet connection.
Q: Why do some planes show as "interesting"? SkyTrack loads curated databases including military, VIP/government, PIA (Privacy ICAO Address), and general "interesting" aircraft. These are flagged with colored markers and badges.
Issues and PRs welcome. Edit source files under src/ (index.html,
styles.css, app.js) and regenerate the root index.html with
node build.mjs before committing. Do not hand-edit the generated
index.html — it will be overwritten on the next build.
When contributing:
- Edit
src/files; runnode build.mjsbefore committing - Test in both 2D and 3D modes
- Verify CORS compatibility for any new data sources
- Keep the single-file release intact (the root
index.htmlis what GitHub Pages serves — every PR should include a rebuiltindex.html) - Dark theme is the default — ensure new UI elements support it
MIT License — see LICENSE for details.