A cross-platform desktop flight radar widget for macOS, Linux, and Windows. Built with Flutter and Dart. Inspired by the Tiny Desk Radar by Tom Haczewski.
Displays a real-time PPI (Plan Position Indicator) radar sweep showing aircraft in a configurable radius around your location. Tap any blip to see callsign, altitude, speed, heading, route, and tail number. Switch to map view for a geographic OpenStreetMap overlay.
- Flutter ≥ 3.16 with desktop support enabled
- macOS: Xcode · Linux: clang + cmake + ninja + libgtk-3-dev · Windows: Visual Studio 2022
# Clone the repository
git clone https://github.com/Puffin-Programs/flight-radar-widget.git
cd flight-radar-widget/flutter_app
# Generate platform runner (first time only — choose your platform)
flutter create --platforms=macos . # macOS
flutter create --platforms=linux . # Linux
flutter create --platforms=windows . # Windows
# Install dependencies
flutter pub get
# Run
flutter run -d macos # or linux / windows
# Production build
flutter build macos --releaseAdd to macos/Runner/Info.plist:
<key>NSLocationUsageDescription</key>
<string>Flight Radar Widget uses your location to centre the radar.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Flight Radar Widget uses your location to centre the radar.</string>Add to both macos/Runner/DebugProfile.entitlements and Release.entitlements:
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.personal-information.location</key>
<true/>| Source | Used for | Key required |
|---|---|---|
| OpenSky Network | Live aircraft positions | No (anonymous) / Client ID+Secret (registered) |
| AirLabs | Positions + route data in one call | API key (free tier: 1 000 calls/month) |
| adsbdb.com | Route lookup (origin/destination) | No |
| hexdb.io | Route lookup fallback | No |
| OpenStreetMap | Map tiles (map view) | No |
Recommended: Register a free account at opensky-network.org. An email address is all that's required. This increases your API limit from 400 to 4,000 calls/day. Enter your Client ID and Client Secret in Settings → OpenSky Credentials.
- Animated PPI radar sweep with 6 colour themes
- Configurable range: 10 – 500 nautical miles
- Tap aircraft to see full detail: callsign, tail number, altitude (FL), speed, heading, vertical speed, distance, bearing, route
- Route confidence indicator (scheduled / approx / estimated)
- Aircraft trails
- Map view with OpenStreetMap tiles and geographic aircraft markers
- Location detection (macOS/Linux/Windows)
- Always-on-top floating window
- Aircraft category filters
- OpenSky and AirLabs data sources
- In-app debug log viewer (off by default)
- All settings persisted between sessions
Origin and destination information is not transmitted by aircraft. It must be inferred from historical callsign databases, which are unreliable for low-cost carriers (EasyJet, Ryanair, TUI) that rotate callsign suffixes daily. The application tries three sources in cascade and shows a confidence indicator. This is about as accurate as freely available data allows — for precise route data a commercial API subscription would be required.
flutter_app/lib/
├── main.dart Entry point, window setup
├── models/
│ ├── aircraft.dart Data model + ICAO→IATA map
│ ├── radar_settings.dart Settings + SharedPreferences persistence
│ └── theme.dart Colour theme definitions
├── providers/
│ ├── opensky_provider.dart OpenSky OAuth2 client
│ ├── airlabs_provider.dart AirLabs client
│ ├── route_enrichment.dart Multi-source route lookup
│ ├── radar_view_model.dart State management hub
│ └── location_service.dart GPS abstraction
├── radar/
│ ├── radar_screen.dart Main screen + toolbar + detail panel
│ ├── radar_painter.dart CustomPainter — the radar drawing
│ └── map_radar_screen.dart flutter_map + OSM tile view
├── settings/
│ └── settings_panel.dart Settings UI overlay
└── utils/
├── logger.dart Debug logger (off by default)
└── log_viewer.dart In-app log viewer
Full architecture documentation: PROJECT.md
The Dart code is identical on all three platforms. The lib/ directory is copied unchanged. The platform runner (macos/, linux/, windows/) is generated fresh on each machine with flutter create --platforms=<platform> ..
Settings are stored per-platform in the standard location (~/Library/Preferences/ on macOS, ~/.local/share/ on Linux, %APPDATA%\ on Windows) and do not share between platforms — re-enter your credentials on each machine.
MIT — see PROJECT.md §16 for full text.
Built with Flutter · Inspired by Tiny Desk Radar · Data from OpenSky Network · Maps © OpenStreetMap contributors
