A phosphor terminal for the near-Earth object population. Every dot is a real object and every
curve is that object's real orbit, propagated through Kepler's equation from published
osculating elements.
Where the numbers come from
NASA NeoWs — fetched live from api.nasa.gov. Supplies the
close-approach circumstances and the orbital elements that drive the 3D view.
JPL Small-Body Database — the named objects (Apophis, Bennu, Didymos and
the rest) come from ssd-api.jpl.nasa.gov, together with the Sentry risk list and
the year-ahead close-approach table. JPL's endpoints send no
Access-Control-Allow-Origin header, so a browser cannot read them from a static
site. Those records were fetched server-side and committed with a retrieval date. The terminal
still probes the live endpoint each session and reports which path it is on.
CelesTrak — element sets for objects in Earth orbit, fetched
live: unlike JPL, CelesTrak is CORS-enabled. Positions come from SGP4, the model
those elements are actually defined against. A TLE is not a Keplerian element set — feeding
one to a two-body solver ignores J2 nodal precession, about 5° a day in low orbit, and the
orbit would be visibly wrong within hours.
JPL Horizons — heliocentric trajectories for twelve deep-space probes,
from Voyager 1 at 171 AU to spacecraft still in the inner system. Also committed
server-side, for the same CORS reason.
Natural Earth — 110 m coastlines, public domain, rasterised into a
compact land/ocean bitmask that the globe samples per face.
What you can click
Everything on the plot is selectable: asteroids, the planets, the Sun, the Moon, satellites
and deep-space probes. Each gets the data sheet that suits it — a satellite reports altitude
and sub-point, a probe reports light-time to Earth, an asteroid reports its close approach.
Human-made objects live at two very different scales. Use the
LEO and GEO ranges in the geocentric frame for satellites,
and DEEP in the heliocentric frame to see how far the Voyagers have actually
gone compared with the planets.
Earth is a real globe in both frames — low-poly, with true coastlines,
spun to Greenwich sidereal time and lit from the real direction of the Sun, so the terminator
and the hemisphere facing you are both correct.
Colour
P1 GRN and P3 AMB are genuine monochrome phosphors: one
emitter colour, varying only in intensity, which is why they read as a CRT rather than as a
green web page. SPECTRUM drops that constraint and assigns a hue per class —
red for potentially hazardous asteroids, green for the rest, orange for planetary orbits,
light blue for satellites, purple for deep-space probes.
The planets keep their real colours in all three schemes. The viewport encodes a per-pixel
"keep my colour" flag in the render target's alpha channel, so a shaded globe survives the
collapse onto the phosphor while every vector element around it does not.
What the display is honest about
Quoted distances are NASA's, not mine. Miss distances and velocities on the
data sheet are the published close-approach values. The propagation here is used to place
things in 3D, never to quote a number.
Two-body propagation drifts. These are osculating elements: the ellipse an
object would follow if the Sun were the only mass in the universe. Propagating each of the 38
objects in the committed feed to its published approach time reproduces NASA's own miss
distance to a median of 0.03% and a worst case of 2%. That is near-epoch accuracy and
it does not extrapolate: run the same code out to Apophis's 2029 encounter, nearly three years
past its element epoch, and it returns about 31 000 km against JPL's ~38 000 km. Planetary
perturbations are the difference. Nothing here is an impact prediction.
Bodies are not to scale. Distances are. At true scale every asteroid here
would be far smaller than one pixel. In the geocentric frame Earth is drawn true to
scale against the lunar-orbit ring by default, which is why it looks so small — that emptiness
is the real picture. The readout under the plot always states which convention is in force.
The geocentric origin is the Earth–Moon barycentre, not Earth's centre.
The planetary model is JPL's approximate-elements table, which tracks the barycentre; the two
differ by up to about 4 700 km, or roughly 1% of one lunar distance. Visible only at the
closest range setting.
Diameters are usually inferred, not measured. An asteroid's brightness
confounds size with reflectivity, so a diameter derived from absolute magnitude is a range
spanning a factor of two or more. Where JPL has a measured diameter, the sheet says
MEASURED.
"Potentially hazardous" is a filing category, not a forecast. It means the
orbit comes within 0.05 AU of Earth's and the object is absolute magnitude H 22 or
brighter — close enough and large enough to be worth tracking.
Some objects here are on JPL's Sentry list, and that is normal. Sentry
catalogues every object with any non-zero computed impact probability over the next century or
more, however remote — currently a few thousand of them. Bennu, the best-studied asteroid in
the catalogue, sits at a cumulative probability near 5.7 × 10⁻⁴ spread over 157 possible
encounters in the 2100s, with a Palermo rating below zero, meaning the hazard is lower
than the background risk from objects that size. The data sheet prints those numbers rather
than a bare flag. None of this is a prediction that anything will hit Earth.
Controls
Drag to rotate, scroll to zoom, click an object to lock the terminal onto it.
Keyboard: tab to the plot, then ← / → step
through the tracked objects, Home jumps to the closest approach, and
Esc releases the lock. Every control is reachable by tab.
Frame switches between the heliocentric solar-system plot and a
geocentric approach scope ranged in lunar distances.
Time runs the simulation forward or backward through seven steps:
real time, then 1 minute, 1 hour, 6 hours, 1 day, 1 week and 1 month per second.
NOW snaps back to the wall clock.
The NASA demo key allows only a handful of requests per hour, shared across everyone on your
network. Responses are cached for six hours, and a committed snapshot keeps the display
populated when the quota is gone. API KEY stores your own free key from
api.nasa.gov locally.
Colophon
Vanilla JavaScript and Three.js, no build step. Curvature, scanlines, aperture grille, bloom and
chromatic fringing are a single fragment shader over the viewport, so the scanlines bend with the
glass. Honours prefers-reduced-motion.
The shared DEMO_KEY is limited to a few requests per hour per IP address,
so it runs out quickly. A personal key is free, instant, and needs only an email address:
api.nasa.gov.
The key is stored in this browser's local storage and sent only to api.nasa.gov.