← SELECTED WORK

Live 3D globe

Overwatch Earth

A live 3D globe of public signals that keeps every observation, so you can rewind it and cite it.

CONTEXT

Overwatch Earth brings public data onto one globe: aircraft, satellites, earthquakes, natural hazards and satellite imagery, alongside humanitarian baselines for places that matter, such as displacement and food security figures.

THE PROBLEM

Live maps are good at right now and useless about yesterday. Each new poll overwrites the last, so they can't replay what happened, and they can't show where a number came from.

No memory

Most live viewers throw an observation away as soon as the next one arrives. You can watch, but you can't go back and check.

Scale that stutters

Tens of thousands of moving objects, updated every few seconds, will freeze a browser if every position is recalculated and redrawn each frame.

Claims without sources

Situation summaries mix fresh data with stale figures and unverified reports. Without provenance, a confident paragraph is impossible to trust.

HOW WE SOLVED IT

  1. 01

    Store every observation, with where it came from

    Each source is an adapter that converts its feed into one shared observation format, stamped with when it was fetched, the source's own timestamp and the endpoint it came from. Observations are appended in batches to a columnar database with a single writer. A row is only written when something actually changes, which cut stored rows by more than a third in testing, and the store held fast queries past 50 million rows.

  2. 02

    Do the heavy math off the main thread, and only as needed

    Satellite orbits are computed in the browser from public orbital data, in a background worker. Rather than recomputing roughly 16,000 orbits every frame, each satellite keeps two positions five seconds apart that are refreshed in rotation, and every frame interpolates between them. That's about 110 calculations per tick instead of 16,000.

  3. 03

    Stream compact binary, then smooth it

    Positions travel over a WebSocket as Apache Arrow rather than JSON, which in testing cut main-thread decoding from 35.8 ms to 0.10 ms. The display runs a few seconds behind live so most contacts glide between real fixes, and replay uses the same smoothing, loading history in chunks ahead of the playhead at 1×, 10× or 60×.

  4. 04

    Every claim cites a record, or it's dropped

    The assistant may only state facts it got from a tool, and it must cite the record behind each one. Area briefs are submitted through a structured tool: claims without a known record are removed, media-only facts are marked unverified, and stale or failing feeds are listed as information gaps. Humanitarian figures carry their period, their publisher and a staleness flag.

WHAT WE CHOSE NOT TO DO

  • No simulated traffic to fill gaps. A tool built on provenance doesn't show synthetic objects, even where coverage is thin.
  • No data we can't license. A layer was left out because its licence doesn't allow this use, and licensing comes before any hosted version.
  • No unchecked actions. Sensitive areas are generalised before anything reaches a model, and destructive actions need a person to confirm.

WHERE IT STANDS

Built entirely on free and open public data: flight tracking networks, public orbital data, USGS, NASA, GDACS, Sentinel-2 imagery and the Humanitarian Data Exchange. Every outbound call runs through one layer with per-source queues, circuit breakers and timeouts, so one failing feed doesn't take down the rest.

  • TYPESCRIPT
  • DECK.GL
  • WEB WORKERS
  • SGP4
  • APACHE ARROW
  • WEBSOCKETS
  • DUCKDB
  • LLM TOOL USE

Ready to leave the ground?

Start a project →