Orbit Lab

A satellite propagator and an orbital canvas, running entirely in your browser. CelesTrak element sets go in; positions, ground tracks, look angles and a staged conjunction sieve come out, at whatever rate this machine can manage.

Nothing here is computed on our side. The page loads a WebAssembly module, a packed element-set snapshot and a coastline — four static files — and does the rest locally. There is no endpoint behind this page, so the propagations-per-second figure below is a measurement of your hardware.

The globe

Loading the propagator…

frames per second

propagations per second

objects propagated per frame

Drag the globe to rotate it. Scroll to zoom. Pick an object from the list to draw its ground track and its elevation from the observer site.

Controls

Time rate

now

Observer site — Los Angeles, CA

Elevation from the observer site

The selected object's angle above the horizon over the next six hours, from the site above. Geometric elevation — no refraction correction, which lifts a real object by roughly half a degree near the horizon.

Conjunction sieve

Finding close approaches between n objects means examining n(n−1)/2 pairs over a time window. The sieve throws pairs away in three stages, cheapest first: orbits whose radial shells never overlap, then orbits whose paths never come close, then — only for what survives — a step-by-step search in time.

A sieve is only worth having if it is sound. The panel runs the exhaustive all-pairs search alongside it and shows both. If the two ever disagree, the sieve is wrong — a filter that drops a real approach returns fewer survivors, which is exactly what a working sieve looks like.

25 km

Staged sieve against the exhaustive scan, over the same window.
StagePairs surviving
Pairs examined
After the apsis filter
After the orbit-path filter
Close approaches found
Exhaustive scan, pairs examined
Exhaustive scan, approaches found
Do they agree?

At catalog scale

The panel above is capped at 30 minutes and a few dozen objects, and it has to be: the exhaustive scan it is checked against is quadratic and runs on this thread, so a browser cannot be asked for more. That cap is also its weakness as a demonstration — a sieve earns its keep at a size nobody would attempt naively, and a thousand-odd pairs is not that size.

So the same sieve was run offline over the whole catalog and the counts committed. These are precomputed, not measured in your browser: 1009 objects over the same 30-minute window, the same 30-second step and the same 25 km miss distance, so only the object count differs from the live run above.

Precomputed: the staged sieve over 1009 objects. Not a live measurement.
StagePairs surviving
Pairs examined508536
After the apsis filter173062
After the orbit-path filter165091
Close approaches found1131

Read that carefully, because the ratio is not the interesting part. The two cheap stages discard 343445 of 508536 pairs, leaving about 32% to reach the time search — which is roughly the same proportion the small live run gets. What changes with scale is the absolute work avoided: the time search is the only stage that propagates both objects at every step, and here it runs on 165091 pairs instead of 508536. The exhaustive scan the panel above runs for comparison was not attempted at this size, which is the honest reason the row is missing rather than an oversight.

Produced by cmd/gensieve from the committed catalog snapshot (sha256 29693a24f966b678686dedb23ffd54aac5fba22d3984f31b2dc36824b9105a01), starting 2026-08-09T12:00:00Z, on go1.26.5. The scan is a pure function of that snapshot — fixed start instant, objects in snapshot order — so it is reproducible, and the build recomputes a smaller prefix of it on every commit to prove the arithmetic has not moved.

What this is, and what it is not

This is orbital mechanics and throughput, and nothing else. The propagator is SGP4 and its deep-space companion SDP4, ported from David Vallado's reference implementation and checked against his own verification set — 666 state vectors, two independent reference implementations, agreeing to a millimetre in position and a micrometre per second in velocity.

A miss distance here is a geometric statement about two propagated curves. Element sets are fitted, they age, and their errors are neither isotropic nor published, so a distance computed from two of them is not a collision probability. Reading it as one would need covariance data this page is never given, and does not ask for.

Where the data comes from

Element sets courtesy of CelesTrak, retrieved 2026-08-09 and converted once, by hand, into the packed snapshot this page loads. Neither this server nor your browser contacts CelesTrak at any point. Coastlines from Natural Earth at 1:110m, public domain, decimated to the tolerance recorded in the artifact's own header and reported below the globe.

Positions are as accurate as the element sets behind them, and those were retrieved on 2026-08-09. SGP4's own error grows from kilometres at epoch; this page is for showing how the mechanics and the sieve work, not for pointing an antenna.