Every eight hours, SpaceX publishes where each of about eleven thousand Starlink satellites will be
for the next three days, and how sure it is. Eight hours later that set is gone, replaced by the next one.
Ephemera keeps them, and measures what the public catalogue can see.
The files carry a full position and velocity uncertainty every sixty seconds, read from the feed
on 30 August 2026. Starlink is the only operator with public covariance; other operators enter via CelesTrak
SupGP without covariance.
What the public catalogue can see
Headline figures from cycle a80375a03051, first seen 2026-10-29 12:31 UTC,
scored 2026-10-29 12:56 UTC against the public catalogue snapshot fetched
2026-10-29 10:35 UTC (12,972 element sets).
At the first instant of each operator file, the public catalogue puts 74% of the scored Starlink satellites within 10 km of where the operator says they are. The middle satellite is 4.4 km away, with the public information a median of 18 hours old. Where the public information is two to three days old, the two predictions are about 47 km apart. Both sides are predictions, and most of that spread is planned trajectory changes the public catalogue cannot know about.
Everyone outside SpaceX sees Starlink through the public catalogue of orbital elements. Ephemera takes that public element set for each satellite, propagates it with SGP4, and compares it against the operator's own published trajectory for the same satellite at the same instants. The distance between the two is what this measures. It is not an error of the satellite, and it is not a statement about which side is right.
43 satellites (0.4%) are more than 1,000 km from the public prediction at publication, which is a large part of an orbit. For those the public element set is not on the operator's trajectory at all. Ephemera does not label any separation as a manoeuvre; that needs a detector this project has not built.
Median separation between the two predictions, by how old the public catalogue's information was. Log scale; the second line under each point is how many comparisons it holds. Cycle a80375a03051, scored 2026-10-29 12:56 UTC.
Feed health for this cycle. 11,159 of 11,187 operator files scored. 27 have no entry in the public catalogue, all of them new satellites the catalogue has not numbered yet; 1 failed to propagate. Public element sets were a mean of 19.1 h old when the snapshot was taken (median 18.6 h, 90th percentile 23.9 h, 5 over 72 h). Averaged over every comparison, which run out to three days into the operator file, element age is 55.0 h: the difference is the file's own prediction horizon, not catalogue staleness. Space-Track: 575 snapshots held, last fetched 2026-10-29 16:44 UTC with 12,972 element sets. Poller heartbeat coverage over the last 24 h: 100.0%.
The archive behind it
As of 2026-10-29 18:21 UTC. Poller: A (a datacentre host in the EU; the home poller was retired on 3 Oct 2026).
The operator side of every comparison comes from files this project caught before they were replaced. Each cycle is hashed file by file into one Merkle root, the root is stamped into the Bitcoin blockchain through OpenTimestamps, and the manifest plus ten files chosen by the root itself are pushed into the Wayback Machine so an independent copy exists that this project does not control.
As of 2026-10-29 18:21 UTC: 190 cycles, 190 complete with roots, 190 anchored in Bitcoin, 44 with a defect in the independent copy. Source bytes archived: 4,318 GB across 2,127,330 files as served. Stored gzipped as 1,776 GB, of which 28 GB is on the poller's disk and 1,748 GB exists only in cold object storage. Cadence holds, meaning a set served longer than nine hours while the poller watched: 15. A further 3 such intervals fell while the poller was down and are not counted as a hold. Poller heartbeat coverage over the last 24 hours: 100.0%. This project exists because SpaceX publishes the feed openly.
The last 30 days, one block per cycle on a time axis. Green is complete and independently copied, grey is complete with the copy still pending, amber is complete but the independent copy failed, red is an incomplete pull, and a hollow block is a pull still running. Gaps in the spacing are the feed's own cadence. Each block links to its row. As of 2026-10-29 18:21 UTC.
Check it yourself
None of this is worth anything if you have to take my word for it. Three things you can run right now, for cycle a80375a03051:
Fetch the independent copy of the file list and hash it. SHA-256 a80375a03051bf3efd6d678183e040892ac0b2a6c59a5070b489ce4d8b428f86.
Recompute which ten files were copied: int(sha256(root + ":" + k), 16) mod n for k from 0 to 9.
Run ots verify root.txt.ots against a Bitcoin node: this root is in block 973698.
ledger.json carries every cycle, its root, its attestation, its witness state and
every scored summary, as the JSON the pages are built from. The globe's per-cycle pack is at
the newest cycle's pack (5.3 MB). The full per-comparison
rows, about 140,000 per cycle, are available on request.
Code is MIT and the repository is public, including
the propagation and the scoring behind every figure here. Figures derived by this project are intended for
CC BY 4.0. The raw SpaceX files carry no stated licence; a written request went to SpaceX on 31 August 2026 and had received no answer by 30 September 2026, the thirty days D06 allowed; the files are held as published and come down on request.
Licence and citation in full.
Not here yet
60 days of archive is not a long record, and this page should not pretend otherwise. What is not running:
A second poller on a different machine in a different country.
The self-consistency scoreboard, prediction against later prediction.
The manoeuvre census: three differently defined counts side by side, never a ratio.
Other constellations, via CelesTrak SupGP without covariance.