A modern, responsive web application for tracking aircraft in real-time using the OpenSky Network API. Built with React, TypeScript, and Socket.IO for seamless real-time updates.
Real-time flight tracking with interactive map and detailed flight information
Responsive design optimized for mobile devices
- πΊοΈ Interactive Map: Powered by Leaflet with OpenStreetMap tiles
βοΈ Real-Time Tracking: Live flight data updates via WebSocket connections- π± Mobile Responsive: Optimized experience across all devices
- π― Smart Filtering: Viewport-based flight filtering for optimal performance
- π Flight Categories: Visual distinction by aircraft type (Light, Heavy, Commercial)
- π Flight Search: Search for specific flights by callsign (e.g., "UAL123") to pan and highlight on the map
- π Detailed Information: Comprehensive flight data including:
- Aircraft position (latitude, longitude, altitude)
- Speed and heading information
- Vertical rate (climbing/descending)
- Origin country and aircraft category
- β‘ Performance Optimized:
- Renders 500+ concurrent flight markers smoothly
- Icon caching and viewport culling
- Throttled updates to prevent lag
- π¨ Professional UI: Clean, aviation-inspired design with status indicators
- React 18 - Modern UI library with hooks
- TypeScript - Type-safe JavaScript
- Tailwind CSS - Utility-first CSS framework
- React Leaflet - Interactive maps for React
- Socket.IO Client - Real-time bidirectional communication
- Vite - Fast build tool and development server
- Node.js - JavaScript runtime
- Express.js - Web application framework
- Socket.IO - Real-time WebSocket communication
- TypeScript - Type-safe server development
- Axios - HTTP client for API requests
- OpenSky Network API - Real-time flight data
- OpenStreetMap - Map tiles and geographic data
- Vercel - Frontend hosting and deployment
- Render - Backend API hosting
- GitHub Actions - CI/CD pipeline
βββββββββββββββββββ WebSocket βββββββββββββββββββ HTTP/REST βββββββββββββββββββ
β β ββββββββββββββββΊ β β ββββββββββββββββΊ β β
β React Frontend β β Node.js Server β β OpenSky API β
β (Vercel) β β (Render) β β (External) β
β β β β β β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
- Node.js 18+ and npm
- OpenSky Network API credentials (optional, for higher rate limits)
-
Clone the repository
git clone https://github.com/redKath/aerotrack.git cd aerotrack -
Install server dependencies
cd server npm install cp .env.example .env # Update .env with proper configuration
-
Install client dependencies
cd ../client npm install cp .env.example .env.local # Update .env.local with proper server URL
-
Start the backend server
cd server npm run dev -
Start the frontend development server
cd client npm run dev -
Open your browser
- Frontend: http://localhost:5173
- Backend API: http://localhost:3000
# Build frontend
cd client
npm run build
# Build backend
cd ../server
npm run build
npm startPORT=3000
NODE_ENV=development
CLIENT_URL=http://localhost:5173
OPENSKY_API_URL=https://opensky-network.org/api
OPENSKY_TOKEN_URL=https://auth.opensky-network.org/auth/realms/opensky-network/protocol/openid-connect/token
OPEN_SKY_CLIENT_ID=your_client_id_here
OPEN_SKY_CLIENT_SECRET=your_client_secret_hereVITE_SERVER_URL=http://localhost:3000Problem: Rendering thousands of flight markers simultaneously caused significant browser lag and poor user experience.
Solution:
- Implemented viewport culling to only render flights visible on the current map view
- Added icon caching to prevent recreating identical flight markers
- Introduced update throttling (max 2 updates/second) to reduce render frequency
- Limited concurrent markers to 500 with smart prioritization by altitude and speed
Result: Smooth 60fps performance even with 5,000+ active flights globally.
Problem: The desktop-optimized interface with overlapping panels created usability issues on mobile devices.
Solution:
- Redesigned flight info panel as a bottom sheet for mobile
- Implemented responsive breakpoints throughout the UI
- Added touch-optimized controls and larger tap targets
- Created mobile-specific help text and navigation
Result: Seamless experience across all device sizes with 95%+ mobile usability score.
Problem: Managing WebSocket connections, handling reconnections, and preventing memory leaks across multiple clients.
Solution:
- Built robust connection management with automatic reconnection logic
- Implemented client bounds tracking to send relevant data only
- Added cleanup mechanisms for stale flight data and disconnected clients
- Created error boundaries for graceful failure handling
Result: 99.9% uptime with seamless reconnection and optimized data usage.
aerotrack/
βββ client/ # React frontend application
β βββ src/
β β βββ components/ # Reusable UI components
β β βββ hooks/ # Custom React hooks
β β βββ services/ # API and WebSocket services
β β βββ types/ # TypeScript type definitions
β βββ public/ # Static assets
β βββ package.json
βββ server/ # Node.js backend application
β βββ src/
β β βββ controllers/ # Request handlers
β β βββ services/ # Business logic
β β βββ middlewares/ # Express middlewares
β β βββ routes/ # API routes
β β βββ config/ # Configuration files
β βββ tests/ # Unit and integration tests
β βββ package.json
βββ README.md
# Run server tests
cd server
npm test
- Connect your GitHub repository to Vercel
- Set root directory to
./client - Add environment variable:
VITE_SERVER_URL - Deploy automatically on push to main
- Connect your GitHub repository to Render
- Set root directory to
./server - Add environment variables from
.env.example - Deploy automatically on push to main
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- OpenSky Network for providing free flight data API
- OpenStreetMap contributors for map data
- React Leaflet for excellent map integration
- Aviation enthusiasts and open-source community
- Performance: 99/100 π’
- Accessibility: 98/100 π’
- Best Practices: 96/100 π’
- SEO: 100/100 π’
- First Contentful Paint: 0.4s
- Largest Contentful Paint: 0.8s
- Total Blocking Time: 0s
- Cumulative Layout Shift: 0
- Speed Index: 1.3s
- Total Bundle Size: 387KB (120KB gzipped)
- Main JavaScript Chunk: 356KB (109KB gzipped)
- CSS Bundle: 32KB (10KB gzipped)
- Compression Ratio: 69% (excellent)
- Load Time Estimate: ~1.2s (on 3G), ~0.3s (on 4G+)
Last updated: November 2025
- Live Demo: https://aerotrack-9z4c.vercel.app/
- OpenSky Network: https://opensky-network.org/
Built with β€οΈ by Kathleen Jogno | Connect with me on LinkedIn