Aether is a flight tracker built for VR. Put on a Meta Quest (or any WebXR headset), look up at the sky, and see real planes exactly where they're flying — live positions, correct direction, the whole thing.
It also works on desktop as a 3D flight map, and on mobile as an AR experience. You can teleport anywhere in the world, watch traffic flow in real-time, and inspect individual flights for details like altitude, speed, and trajectory.
Built on OpenSky Network data, rendered with Google Photorealistic 3D Tiles and Cesium terrain.
🏆 3rd Place — Czech Electrotechnical Olympiad (2025)
Featured in: Feedit.cz, Hitrádio Vysočina, Žďárský Deník, Kraj Vysočina
- VR support — Full WebXR mode for Meta Quest and other compatible headsets
- Live tracking — Real-time position updates via WebSocket
- 3D environment — Google Photorealistic 3D Tiles + Cesium World Terrain
- Flight inspection — Point at aircraft to see telemetry data
- Global coverage — Teleport anywhere to monitor local airspace
graph TD
User((User)) -->|WebXR / Browser| Client[<b>Aether Client</b><br/>React + Three.js + Cesium]
Client <-->|WebSocket| Server[<b>Aether Server</b><br/>Node.js + Express]
Client -->|REST| Server
subgraph Backend Services
Server -->|Cache| InMem[In-Memory Cache]
end
subgraph External APIs
OpenSky[OpenSky Network API]
Elevation[Open-Elevation API]
Google3D[Google Photorealistic 3D Tiles]
end
Server -->|Polling| OpenSky
Client -.->|Terrain Data| Elevation
Client -.->|Tiles| Google3D
- Frontend: React, Three.js (React Three Fiber), WebXR, CesiumJS, TailwindCSS
- Backend: Node.js, Express, WebSocket
- Data: OpenSky Network (flights), Open-Elevation (terrain)
- DevOps: Docker, Docker Compose
- Node.js v18+
- npm or pnpm
- Git
-
Clone the repo
git clone https://github.com/Splestule/Aether.git cd Aether -
Install dependencies
npm install
-
Set up environment variables
cp server/env.example server/.env
-
Build the shared package (required once before first run)
npm run build
-
Start the dev server
npm run dev
Backend runs on port
8080, frontend on port3000.
You can use your own OpenSky Network credentials for better API access.
To enable it, set this in your server/.env:
BYOK=trueWhen enabled:
- Without credentials: Limited API access (10 requests/min)
- With credentials: Full API access
Users can enter their OpenSky credentials through the UI. Credentials are validated, stored in a session token (24h expiry), and never logged.
# Build and run
docker compose up --build
# Or detached
docker compose up -d --build
# Stop
docker compose down| Service | URL | Port |
|---|---|---|
| Frontend | http://localhost:4173 | 4173 |
| Backend | http://localhost:8080 | 8080 |
Create a .env file in the project root:
OPENSKY_CLIENT_ID=your_client_id
OPENSKY_CLIENT_SECRET=your_client_secretAether includes a built-in dashboard for monitoring server status, viewing logs, and managing processes.
- URL:
http://localhost:8081 - Features:
- Start/Stop servers
- View real-time logs (Backend, Frontend)
- Toggle Debug Mode
- Monitor OpenSky API connection status
To run the dashboard independently:
npm run dashboard(Note: The dashboard starts automatically when running npm run dev via the start script).
| Action | Desktop | VR Controller |
|---|---|---|
| Move Camera | Mouse Drag | Thumbstick |
| Select Flight | Left Click | Laser Pointer + Trigger |
| Calibrate Direction | — | Left Trigger + Rotate |
| Change Mode | UI Buttons | UI Buttons (in browser) |
Aether/
├── client/ # React app (Vite)
│ ├── src/
│ │ ├── components/ # 3D & UI components
│ │ └── hooks/ # Flight data logic
├── server/ # Node.js Express API
│ ├── src/
│ │ └── services/ # Data fetching & caching
├── shared/ # Shared types
├── docker-compose.yml
└── README.md
MIT — see LICENSE for details.
Built by Eduard Šimon
Data provided by OpenSky Network
