Live TLE pipeline
On page load, the browser fetches the current Celestrak GP catalog (group active) via the public HTTPS endpoint. Celestrak refreshes TLEs every two hours, so each visit gets data within that window. The TLE block is parsed by satellite.js into per-satellite SGP4 state structs (satrec). On every animation frame, each satrec is propagated forward by the elapsed simulated time and the resulting TEME-frame position is written into a single packed Float32Array driving a THREE.Points draw call.
SGP4
SGP4 is the analytic propagator that NORAD designed for TLEs, accounting for J2-J4 zonal harmonics, atmospheric drag, and lunisolar perturbations in a closed-form expansion. It's accurate to roughly a kilometre over a day for LEO targets, falling off for high-eccentricity or very-high-altitude orbits. We use it for every satellite in the catalog including GEO (where it's still fine) but exclude the L1/L2 platforms whose orbits are dominated by Solar gravity (SGP4 wasn't designed for that regime).
Earth rotation
Earth's body-fixed frame is rotated about its spin axis (= scene +Z) by the Greenwich Mean Sidereal Time of the current simulated instant — the standard GMST = 280.46061837 + 360.98564736629·(JD − 2451545.0) formula. SGP4 returns positions in TEME (an inertial-ish frame that differs from GCRF by sub-arc-second angles, negligible at rendering scale), so satellites and Earth surface line up correctly.
Classification
After parsing TLEs, each satellite is classified by its mean motion (rev/day): >11.25 = LEO, 1.5–11.25 = MEO/HEO, <1.5 = GEO. Note the bins are by mean motion, not orbit family: everything above ~26,000 km altitude falls in the GEO bin, including graveyard and high science orbits, while Molniya-class HEO (mm ≈ 2) files under MEO. Starlink is broken out separately (name match) because at ~7,000 entries it dominates the shell. Layer toggles let you isolate any class.