Real-time airplane flight tracker for macOS and iOS.
- Live flight tracking on an interactive map
- Flight details: altitude, speed, heading, coordinates
- Automatic refresh every 5 seconds
- Adaptive UI: split view on iPad, tab view on iPhone
For higher rate limits, create a free account at opensky-network.org and create an API client:
- Log in to your OpenSky account
- Go to Account page
- Create a new API client to get
client_idandclient_secret
Set environment variables:
export OPENSKY_CLIENT_ID="your_client_id"
export OPENSKY_CLIENT_SECRET="your_client_secret"Or add to Xcode scheme:
- Open project in Xcode
- Product �� Scheme → Edit Scheme
- Select Run → Arguments tab
- Add Environment Variables:
OPENSKY_CLIENT_ID= your_client_idOPENSKY_CLIENT_SECRET= your_client_secret
# Regenerate Xcode project
xcodegen generate
# macOS
xcodebuild -project UpThere.xcodeproj -target UpThereMac -configuration Debug build
# iOS (requires simulator)
xcodebuild -project UpThere.xcodeproj -target UpThere -sdk iphonesimulator -configuration Debug build# macOS
open build/Debug/UpThere.appSystem, platform, and runtime requirements are documented in Requirements/ as Markdown files with structured YAML frontmatter. Each requirement includes Given/When/Then test scenarios for future automated test generation.
- macOS 14.0+ or iOS 17.0+
- Location services enabled
- OpenSky Network account (free, optional)
Uses the OpenSky Network API for real-time flight data.
The app uses structured logging via Apple's os.Logger framework. All logs use the subsystem com.moritzwade.upthere with per-component categories: FlightService, LocationService, and ViewModel.
Console.app: Filter by subsystem com.moritzwade.upthere.
Command line:
# Stream all logs
log stream --predicate 'subsystem == "com.moritzwade.upthere"' --level debug
# Only errors
log stream --predicate 'subsystem == "com.moritzwade.upthere" && level == 16' --level error
# Only FlightService logs
log stream --predicate 'subsystem == "com.moritzwade.upthere" && category == "FlightService"' --level debug| Level | Use Case |
|---|---|
debug |
Verbose: request URLs, location coords, refresh counts |
info |
Key events: tracking start/stop, flights fetched, auth granted |
warning |
Recoverable issues: token refresh, rate limits, missing location |
error |
Failures: network errors, auth failures, location failures |
Use the centralized AppLogger enum:
AppLogger.flightService.debug("Building request URL")
AppLogger.viewModel.info("Tracking started")
AppLogger.locationService.error("Location failed", error: someError)