← all worklive

Orbital Ops

A multi-domain operations console — 12,408 satellites, aircraft and ships, propagated live in the browser.

CesiumJSReactTypeScriptViteZustandHonoSGP4WebGL

Live demo

Live demo

Architecture

TLE / ADS-B / AIS feeds→Caching API · Hono + node:sqlite→Web Worker · SGP4→GPU point primitives→CesiumJS · WGS84 globe

The problem

Space and defense teams run their operational picture in the browser now — but propagating tens of thousands of orbital objects at 60fps, live, without a paid tile/token service, is where most demos fall over.

How it startedresearch

Began from the SGP4 propagation math and one question: how many objects can a browser hold at 60fps? Evaluated CesiumJS vs deck.gl vs raw WebGL, studied TLE sources and ADS-B (OpenSky) for aircraft and AIS for ships — and decided the propagation had to leave the main thread.

Decisions & tradeoffs

SGP4 runs in a Web Worker feeding GPU point primitives, so the globe never stutters. A tiny caching TLE API (Hono + node:sqlite) keeps it tokenless; a committed TLE seed makes it run fully offline. CesiumJS chosen over deck.gl for a true WGS84 globe.

Development

React 19 + TypeScript 5.9 strict + Vite 7 + Zustand 5. Sim-time warp/scrub, pass prediction, a polar sky plot. 117 tests. Dockerized and deployed via GitHub Actions to a Hetzner box.

Screenshots

Full orbital picture — 12,000+ tracked objects, Starlink shell and the GEO belt, ISS lockedISS (ZARYA) tracked live — telemetry, ground track and 24 h pass predictions on a polar sky plotAIRSPACE mode — ~13,000 live aircraft over the Mediterranean via ADS-B

By the numbers

12,408
objects live
60 fps
SGP4 / worker
117
tests
0
tokens · offline