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
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.
| Stage | Pairs 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.
| Stage | Pairs surviving |
|---|---|
| Pairs examined | 508536 |
| After the apsis filter | 173062 |
| After the orbit-path filter | 165091 |
| Close approaches found | 1131 |
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.