A modern, real-time geospatial intelligence platform built with Next.js and CesiumJS.
Monitor global activity through an interactive 3D interface with live data from multiple public sources.
preview.mp4
WorldView-UI transforms publicly available geospatial data into a cohesive, military-grade situational awareness dashboard. Built as a modern alternative to traditional command-and-control interfaces, it demonstrates what's possible when combining open data sources with contemporary web technologies.
The platform aggregates six distinct data layers into a single, interactive 3D globe with a dark tactical interface and real-time visual effects.
| Layer | Data Source | Update Frequency | Description |
|---|---|---|---|
| FlightRadar24 + adsb.fi | 5โ20 seconds | ~25,000+ global aircraft with altitude-based coloring and route visualization | |
| ๐ฐ๏ธ Satellites | CelesTrak TLE + SGP4 | 2 seconds (propagation) | Live orbital tracking with ground tracks, nadir lines, and future path prediction |
| ๐ Earthquakes | USGS GeoJSON | 60 seconds | Recent seismic activity with magnitude-based scaling and pulsing markers |
| ๐ข Maritime Traffic | AISStream.io | 60 seconds (burst-cached) | Global vessel tracking with ship type classification and movement trails |
| ๐ Road Traffic | OpenStreetMap Overpass | On-demand | Dynamic road network visualization with animated particle flow |
| ๐น Public CCTV | TfL, Austin, NSW Transport | 5 minutes | Live camera feeds projected onto their exact geographic locations |
This project serves multiple purposes:
- Educational resource โ Demonstrates integration of diverse real-time data sources
- Geospatial experimentation โ Showcases CesiumJS capabilities with modern React patterns
- Open data advocacy โ Highlights the wealth of publicly available geospatial information
- Tactical interface design โ Explores effective visualization of complex data streams
Unlike traditional geospatial applications, WorldView-UI prioritizes:
- Performance โ Handles thousands of moving entities at 60fps
- Visual clarity โ Military-inspired design language reduces cognitive load
- Extensibility โ Modular architecture makes adding new data layers straightforward
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Browser (Next.js App) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โข Client page (`app/page.tsx`) + dynamic Cesium load โ โ
โ โ โข Earthquakes fetch directly from USGS โ โ
โ โ โข Other telemetry via `/api/*` routes โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ fetch /api/*
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Next.js API Routes (serverless) โ
โ โข /api/flights โ FR24 + adsb.fi fallback โ
โ โข /api/flights/live โ adsb.fi regional (4 s cache) โ
โ โข /api/satellites โ TLE proxy (2 h cache) โ
โ โข /api/ships โ AISStream.io burst (60 s cache) โ
โ โข /api/traffic/roads โ Overpass + static fallback โ
โ โข /api/cctv โ Camera feed aggregation (5 m cache) โ
โ โข /api/cctv/image โ CORS-bypassing image proxy โ
โ โข /api/geolocation โ IP geolocation fallback โ
โ โข /api/health โ Uptime/status probe โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- Client-side hooks (
useFlights,useShips, etc.) poll Next.js API routes;useEarthquakesfetches USGS directly - API routes act as proxies โ they fetch from upstream providers, cache responses, and handle authentication
- CesiumJS scene renders entities using imperative primitives for optimal performance
- UI components display controls and real-time event feeds outside the 3D canvas
- Entity tracking locks camera to selected objects with smooth following behaviour
- Framework: Next.js 16 (App Router) with React 19
- 3D Rendering: CesiumJS 1.138 via Resium React bindings
- Styling: Tailwind CSS 4 with custom tactical theme
- Language: TypeScript 5.7 (strict mode)
- Build Tool: Built-in Next.js compiler (SWC)
- Runtime: Node.js 20+ (serverless on Vercel)
- Caching: In-memory with TTL (simplified for serverless)
- External APIs: REST + WebSocket (AISStream burst pattern)
satellite.jsโ SGP4 orbit propagationwsโ WebSocket client for AISStreamresiumโ React bindings for CesiumJS
- Node.js 20.x or later
- npm 10.x or later
- Git
# Clone the repository
git clone https://github.com/shez1461/worldview-ui.git
cd worldview-ui
# Install dependencies
npm install
# Copy environment variable template
cp .env.local.example .env.localWorldView-UI requires several API keys to function fully. Edit .env.local after copying:
# Required for 3D terrain and imagery (falls back to OSM if missing)
NEXT_PUBLIC_GOOGLE_API_KEY=your_google_maps_api_key
NEXT_PUBLIC_CESIUM_ION_TOKEN=your_cesium_ion_token
# Optional manual override for UI version shown in StatusBar.
# If omitted, version is derived automatically from git tags at build time.
# NEXT_PUBLIC_APP_VERSION=0.7.0
# Server-side only (never exposed to client)
AISSTREAM_API_KEY=your_aisstream_api_key
OPENSKY_CLIENT_ID=your_opensky_client_id
OPENSKY_CLIENT_SECRET=your_opensky_client_secret
NSW_TRANSPORT_API_KEY=your_nsw_transport_keynpm run dev
npm run build
npm run start
npm run lint
npm run proxy
npm run copy-cesium-assetsnpm run devVisit http://localhost:3000 to see the application.
- Visit Google Cloud Console
- Create a project and enable the Map Tiles API
- Generate an API key and restrict it to:
- HTTP referrers (your domains)
- Map Tiles API only
- Add to
NEXT_PUBLIC_GOOGLE_API_KEY
Free tier: $200/month credit (~25,000 tile loads)
- Register at Cesium Ion
- Copy your default access token
- Add to
NEXT_PUBLIC_CESIUM_ION_TOKEN
- Sign up at AISStream.io
- Generate an API key from your dashboard
- Add to
AISSTREAM_API_KEY
Free tier provides full global AIS stream
- Register at Transport NSW Open Data
- Create an application and subscribe to Traffic & Cameras
- Add key to
NSW_TRANSPORT_API_KEY
worldview-ui/
โโโ app/ # Next.js App Router
โ โโโ page.tsx # Main dashboard (client component)
โ โโโ layout.tsx # Root layout with tactical theme
โ โโโ globals.css # Tailwind v4 + wv-* design tokens
โ โโโ api/ # API routes (serverless functions)
โ โโโ flights/ # Global flight data (FR24 / OpenSky)
โ โโโ flights/live/ # Regional high-frequency (adsb.fi)
โ โโโ satellites/ # TLE fetch + SGP4 propagation
โ โโโ ships/ # AISStream.io burst cache
โ โโโ traffic/roads/ # OpenStreetMap road network
โ โโโ cctv/ # Camera feed aggregation
โ โโโ cctv/image/ # CORS-bypassing image proxy
โ โโโ geolocation/ # IP geolocation fallback
โ โโโ health/ # uptime/status probe
โโโ src/
โ โโโ globe/ # Cesium viewer components
โ โ โโโ GlobeViewer.tsx # <Viewer> root + ShaderManager
โ โ โโโ EntityClickHandler.tsx # drillPick โ entity classification
โ โโโ layers/ # Data layer renderers (inside <Viewer>)
โ โ โโโ FlightLayer.tsx # BillboardCollection + PolylineCollection
โ โ โโโ SatelliteLayer.tsx # React <Entity> per satellite
โ โ โโโ EarthquakeLayer.tsx # Declarative <Entity> + memo()
โ โ โโโ ShipLayer.tsx # BillboardCollection (AIS vessels)
โ โ โโโ TrafficLayer.tsx # PolylineCollection + PointPrimitiveCollection
โ โ โโโ CCTVLayer.tsx # BillboardCollection (camera icons)
โ โโโ hooks/ # Data-fetching hooks
โ โ โโโ useFlights.ts # Global aircraft (20 s poll)
โ โ โโโ useFlightsLive.ts # Regional aircraft (5 s poll)
โ โ โโโ useSatellites.ts # TLE propagation via satellite.js
โ โ โโโ useEarthquakes.ts # USGS direct fetch (60 s poll)
โ โ โโโ useShips.ts # AIS vessels (30 s poll)
โ โ โโโ useTraffic.ts # Road network + animated vehicles
โ โ โโโ useCameras.ts # CCTV feeds (5 min poll)
โ โ โโโ useGeolocation.ts # Browser GPS โ IP fallback
โ โ โโโ useAudio.ts # Tactical audio singleton
โ โ โโโ useIsMobile.ts # matchMedia breakpoint (768 px)
โ โโโ lib/
โ โ โโโ audio.ts # Web Audio API singleton
โ โโโ data/
โ โ โโโ airports.ts # Airport coordinate database
โ โโโ shaders/
โ โ โโโ postprocess.ts # GLSL strings for CRT / NVG / FLIR
โ โโโ types/
โ โ โโโ camera.ts # CameraFeed, CameraApiResponse types
โ โโโ ui/ # HUD overlay components
โ โโโ OperationsPanel.tsx # Layer toggles, shader picker
โ โโโ IntelFeed.tsx # Scrolling event log
โ โโโ StatusBar.tsx # UTC clock, camera position
โ โโโ TrackedEntityPanel.tsx # Entity details when tracking
โ โโโ CCTVPanel.tsx # Camera thumbnails
โ โโโ SplashScreen.tsx # Boot sequence + audio cues
โ โโโ MobileModal.tsx # Full-screen modal (mobile)
โ โโโ AudioToggle.tsx # Mute/unmute button
โ โโโ Crosshair.tsx # Centre reticle overlay
โ โโโ FilmGrain.tsx # Canvas-based analogue noise
โโโ .env.local.example # Environment variable template
โโโ next.config.ts # Next.js configuration
โโโ postcss.config.mjs # Tailwind v4 PostCSS plugin
โโโ tsconfig.json # TypeScript configuration
Click any object on the globe to lock the camera and follow its movement:
| Entity | Camera Distance | View |
|---|---|---|
| Aircraft | 50 km | Trailing, heading-aligned |
| Satellites | 200 km | Orbital perspective |
| Ships | 20 km | Low-angle tracking |
| Earthquakes | 100 km | Overhead |
| CCTV cameras | 2 km | Street-level |
Press ESC to release tracking.
Cycle through post-processing effects for different analytical perspectives:
| Mode | Visual Effect | Best For |
|---|---|---|
| Standard | Clean, unprocessed view | General observation |
| CRT | Scanlines, chromatic aberration | Retro tactical aesthetic |
| Night Vision | Green phosphor, noise grain | Low-light scenarios |
| FLIR | Thermal palette, edge detection | Heat signature analysis |
- Google 3D Tiles โ Photorealistic buildings and terrain (requires API key)
- OpenStreetMap โ Fallback 2D imagery (always available, no key needed)
| Endpoint | Method | Cache | Description |
|---|---|---|---|
/api/flights |
GET | 30 s | Global commercial aircraft |
/api/flights/live?lat&lon&dist |
GET | 4 s | Regional high-frequency flights |
/api/satellites |
GET | 2 h | TLE data for all tracked satellites |
/api/ships?moving=1 |
GET | 60 s | Maritime vessel positions |
/api/traffic/roads?south&west&north&east |
GET | 24 h | Road network geometry |
/api/cctv?country |
GET | 5 m | Camera feed locations |
/api/cctv/image?url |
GET | 60 s | CORS-bypassing image proxy |
/api/geolocation |
GET | โ | IP geolocation fallback |
/api/health |
GET | โ | Server status and uptime |
- Push your code to a GitHub repository
- Visit Vercel โ New Project
- Import your
worldview-uirepository - Configure environment variables (copy from
.env.local) - Click Deploy
After deployment:
- Go to your project dashboard on Vercel
- Navigate to Settings โ Domains
- Add
shez.appand follow the DNS configuration instructions
Vercel will automatically provision SSL certificates.
NEXT_PUBLIC_*variables are embedded at build time- Server-side variables are available to API routes at runtime
WorldView-UI handles thousands of moving entities through several techniques:
- Imperative Cesium primitives โ
BillboardCollection,PolylineCollectioninstead of React<Entity>components for large datasets - Viewport culling โ Entities outside the camera view aren't rendered
- Instance sharing โ Similar entities share geometry
- Dead reckoning โ Positions extrapolated between updates at 60 fps
- Smart polling โ Frequencies adjusted based on zoom level and entity type
- Aggressive caching โ API routes cache responses to reduce upstream calls
- Client-driven UI shell โ
app/page.tsxis a client component; Cesium loads via dynamic import ({ ssr: false }) - Memoisation โ
useMemoanduseCallbackprevent unnecessary re-renders - Dynamic imports โ Cesium loads only when needed (
{ ssr: false })
Contributions are welcome! Areas where help is most valuable:
- New data layers โ Weather, wildfires, power grids, ADS-B military
- Additional CCTV sources โ More cities and better global coverage
- Shader effects โ New visual post-processing modes
- Performance improvements โ Optimise rendering algorithms
- Documentation โ Tutorials, API references, video walkthroughs
This project builds upon concepts from kevtoe/worldview, adapted and extended for the Next.js ecosystem.
- Flight tracking: FlightRadar24, adsb.fi, OpenSky Network
- Satellite orbits: CelesTrak
- Earthquakes: USGS
- Maritime: AISStream.io
- Road networks: OpenStreetMap contributors
- CCTV feeds: Transport for London, City of Austin, Transport for NSW
- CesiumJS โ 3D globe rendering
- Resium โ React bindings for Cesium
- Next.js โ React framework
- Tailwind CSS โ Styling
- satellite.js โ SGP4 orbit propagation
No API keys are included in this repository.
All credentials must be provided via environment variables. The repository includes .env.local.example as a template only.
Before committing, verify:
-
.env*files are listed in.gitignore - No hardcoded API keys exist in source files
- Google API key is restricted by HTTP referrer
- Budget alerts are set in Google Cloud Console
If you discover a security issue, please open a private vulnerability report via GitHub.