Real-time ADS-B Aircraft Tracking with Beautiful Visualization
This is currently a personal project to explore the use of AI development tools to develop and build highly performant and efficient message processing from SDR and other wireless or digital sensors. This sub-project is a native desktop application for tracking aircraft in real-time using ADS-B data. Built with Rust ๐ฆ and egui for maximum performance and multiplatform deployment.
Features โข Quick Start โข Configuration โข Architecture โข License
- Live Carto Map Tiles with Web Mercator projection
- Smooth pan & zoom controls with trackpad gesture support
- Smart tile caching (7-day local cache for instant loading)
- Auto-centering on your GPS location at startup
- Connects to BaseStation protocol feeds (port 30003)
- Automatic reconnection and error recovery
- Tracks ICAO address, callsign, position, altitude, speed, and heading
- 400-mile radius filtering for relevant aircraft only
- Intelligent jump detection to filter out GPS errors
Beautiful color-coded flight paths showing the last 10 minutes of history:
| Altitude | Color | Typical Aircraft |
|---|---|---|
| 0-10k ft | ๐ต Cyan/Teal | General Aviation |
| 10-20k ft | ๐ข Green/Yellow | Regional Jets |
| 20-30k ft | ๐ก Yellow/Orange | Climbing/Descending |
| 30-40k ft | ๐ Orange/Red | Cruise Altitude |
| 40k+ ft | ๐ฃ Purple/Magenta | High-Altitude Jets |
Trails smoothly fade from solid to transparent over time, giving you both altitude and recency information at a glance.
- Military-style contact list sorted by altitude (highest first)
- Real-time status indicators (active โ / recent โ / stale โ)
- Click to select aircraft on map or in list
- Auto-scroll to selected aircraft
- Flight level (FL), speed, heading, and coordinates
- Last-seen timestamps
- Click aircraft on map or in list to highlight
- Selected aircraft show with red icon and yellow selection ring
- List automatically scrolls to center selected aircraft
- Subtle 10% opacity background highlight in list
- Airports - Color-coded by size (large/medium/small)
- Red markers for major international airports
- Yellow for medium regional airports
- Gray for small local airports
- ICAO identifiers shown at higher zoom levels
- Smart filtering with 3 modes:
- Public/Frequent (default) - Shows airports with scheduled service and major hubs
- All Airports - Shows all public airplane airports
- Major Only - Shows only large international airports
- Runways - Detailed runway visualization
- Paved runways shown with thicker lines
- Automatically displayed for visible airports
- Only shown at zoom level 8+
- Navaids - Navigational aids overlay
- VOR/VORTAC in blue triangles
- NDB in orange triangles
- DME in purple triangles
- Ident labels at zoom 9+
- Automatic download - Data files downloaded on first startup (no manual setup required)
- Smart zoom filtering - Overlays automatically adjust visibility based on zoom level
- Toggle controls - Show/hide each overlay type independently via Map Overlays window
- Data from OurAirports (free, public domain)
- Rust (1.70 or later) - Install Rust
- ADS-B Data Source feeding BaseStation protocol to
localhost:30003- Examples: dump1090, readsb, or any Mode S/ADS-B receiver
# Clone the repository
git clone https://github.com/ccustine/airjedi-desktop.git
cd airjedi-desktop
# Build in release mode (optimized)
cargo build --release
# Run the application
cargo run --releaseNote: Aviation data files (airports, runways, navaids) will be automatically downloaded on first startup (~50MB). The app will display overlays once the data is loaded.
The application will:
- ๐ Detect your GPS location (macOS: CoreLocation, others: IP geolocation)
- ๐บ๏ธ Center the map on your location
- ๐ฅ Download aviation data in the background (if not already present)
- ๐ Connect to
localhost:30003for ADS-B data โ๏ธ Start tracking aircraft within 400 miles- ๐ซ Display airport/runway/navaid overlays once data loads
Edit src/tcp_client.rs:
let address = "localhost:30003"; // Change to your BaseStation feedEdit src/basestation.rs in AircraftTracker::new():
max_distance_miles: 400.0, // Change radius (in miles)Edit src/main.rs constants:
const TRAIL_MAX_AGE_SECONDS: f32 = 600.0; // 10 minutes total
const TRAIL_SOLID_DURATION_SECONDS: f32 = 300.0; // First 5 min solid
const TRAIL_FADE_DURATION_SECONDS: f32 = 300.0; // Last 5 min fadeOn macOS, the app uses CoreLocation for accurate GPS positioning. On first run, you'll be prompted to grant location permissions. On other platforms, IP-based geolocation is used automatically.
airjedi-desktop/
โโโ src/
โ โโโ main.rs # UI & rendering (egui framework)
โ โโโ aviation_data.rs # Airport/runway/navaid data loader & renderer
โ โโโ basestation.rs # ADS-B protocol parser & aircraft tracking
โ โโโ tcp_client.rs # Async TCP client with auto-reconnect
โ โโโ tiles.rs # Map tile manager with Web Mercator projection
โโโ data/
โ โโโ README.md # Data download instructions
โ โโโ airports.csv # (download separately)
โ โโโ runways.csv # (download separately)
โ โโโ navaids.csv # (download separately)
โโโ assets/
โ โโโ airjedi1.png # Application screenshot
โโโ Cargo.toml # Dependencies & build config
โโโ LICENSE # Apache 2.0 license
โโโ README.md # This file
- ๐ฆ Rust - Memory-safe, zero-cost abstractions
- ๐จ egui - Immediate mode GUI framework (60 FPS rendering)
- ๐ eframe - Native windowing and graphics backend
- โก Tokio - Async runtime for TCP connections
- ๐บ๏ธ Web Mercator - Standard map projection (EPSG:3857)
- ๐ฆ Carto - Beautiful basemap tiles
โโโโโโโโโโโโโโโโโโโ
โ ADS-B Receiver โ (dump1090, readsb)
โโโโโโโโโโฌโโโโโโโโโ
โ BaseStation Protocol (TCP :30003)
โผ
โโโโโโโโโโโโโโโโโโโ
โ TCP Client โ (async, auto-reconnect)
โโโโโโโโโโฌโโโโโโโโโ
โ Parse MSG packets
โผ
โโโโโโโโโโโโโโโโโโโ
โ Aircraft Trackerโ (position filtering, trail storage)
โโโโโโโโโโฌโโโโโโโโโ
โ Shared state (Arc<Mutex>)
โผ
โโโโโโโโโโโโโโโโโโโ
โ UI Renderer โ (egui @ 500ms updates)
โโโโโโโโโโฌโโโโโโโโโ
โ
โโโบ Map tiles (cached from Carto CDN)
โโโบ Aircraft icons & trails
โโโบ Information panel
| Action | Control |
|---|---|
| Pan map | Click & drag |
| Zoom | Two-finger pinch (trackpad) or scroll wheel |
| Select aircraft | Click icon on map or entry in list |
| Deselect | Click empty map area |
| Toggle overlays | Open "Map Overlays" window (top-left) |
| Filter airports | Use radio buttons in Map Overlays window |
| Collapse panels | Click window title bars |
- Haversine formula for accurate great-circle distance
- Center radius check: 400-mile default range
- Jump detection: Rejects >10 mile position jumps
- Resolution: ~100 meter minimum change to record
- Trail history: 10 minutes stored in memory
- Update rate: 500ms (2 Hz) UI refresh
- Cleanup interval: Every 100 received messages
- Aircraft timeout: 3 minutes of inactivity
- Tile cache: SHA256-based filesystem cache with subdomain load balancing
Decodes the following MSG types:
| Type | Description |
|---|---|
| MSG,1 | Aircraft identification (callsign) |
| MSG,3 | Airborne position (lat/lon/altitude) |
| MSG,4 | Airborne velocity (speed/heading) |
| MSG,5 | Surveillance altitude |
| MSG,6 | Surveillance position |
| MSG,7 | Air-to-air message |
| MSG,8 | All call reply |
Future enhancements being considered:
- ๐ Aircraft detail popup with full flight information
- ๐ Configurable filters (altitude range, speed, callsign)
- ๐พ Export data to KML/GeoJSON formats
- ๐ก Multiple simultaneous data source support
- ๐ฆ๏ธ Weather radar overlay integration
- ๐ซ Airport, runway, & navaid overlays โ
- ๐จ Custom color schemes and themes
- ๐ Historical playback and recording
- ๐ Aircraft alerts and notifications
- ๐ Web-based companion app
- ๐บ๏ธ Airspace boundaries overlay (Class B, C, D)
- ๐ฌ Airport frequencies and ATIS information
Contributions are welcome! This is an early-stage project with lots of room for improvement.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Copyright 2025 Chris Custine
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- OpenStreetMap Contributors - Map data
- CARTO - Beautiful basemap tiles
- OurAirports - Aviation data (airports, runways, navaids)
- egui Community - Excellent immediate mode GUI framework
- ADS-B Community - Open aircraft tracking protocols
Built with โค๏ธ and Rust ๐ฆ
If you find this project useful, please consider giving it a โญ!