Fresh elements
A two-line element set (TLE) from CelesTrak, refreshed every two hours, validated by Orekit on arrival. If CelesTrak is unreachable, the last good set is kept with its real age.
Every tracker draws a curve. What follows says how this one is computed, what it was compared with, and what its times are worth by the evening you go outside.
A two-line element set (TLE) from CelesTrak, refreshed every two hours, validated by Orekit on arrival. If CelesTrak is unreachable, the last good set is kept with its real age.
Orekit's SGP4 turns the elements into positions. A TLE is only meaningful to SGP4: it is never fed to another propagator.
SGP4 speaks TEME. Each date is converted to ITRF - precession-nutation, Earth rotation, polar motion, full IERS 2010 EOP - then read from the observer's horizon.
An elevation detector finds rise and set to the millisecond by root finding; the culmination is found the same way, not interpolated.
A second propagation per pass samples the track every 10 s, with range, range rate, sub-satellite point and sunlight at each point.
Comparing two lists of pass times would show discrepancies of up to a second without saying which side is wrong. The check works the other way round: it takes the instants Orekit produces and asks Skyfield what elevation and azimuth it computes at those exact instants. If Orekit is right, Skyfield must find the threshold exactly at the boundaries of every pass.
| Quantity | Measured discrepancy | Tolerance | Margin |
|---|---|---|---|
| Elevation, Orekit vs Skyfield | 0.53 millidegree | 10 millidegrees | ×19 |
| Azimuth, Orekit vs Skyfield | 2.0 millidegrees | 20 millidegrees | ×10 |
| Dates, regression suite | 0 | 1 s | - |
| Angles, regression suite | 0 | 0.1° | - |
That the implementation and the chain of reference frames are correct. A regression test in continuous integration then watches the same reference file for drift: a library upgrade, a refresh of the Earth orientation data, a rewrite of the service.
Skyfield and Orekit implement the same model. Their agreement says nothing about the gap to the real sky, which is dominated by the age of the elements. That gap is the subject of the next section - and the reason every result shows it.
| Source of error | Order of magnitude | How it is handled |
|---|---|---|
| Age of the TLE | ~1 km at epoch, then 1–3 km/day in low orbit | Shown on every result as a drift and a timing range. Elements older than 7 days are refused; windows are capped at 10 days. |
| Manoeuvres | Unbounded until new elements | Invisible to SGP4. An ISS reboost makes the previous elements wrong until CelesTrak publishes new ones. |
| Atmospheric refraction | ~0.1° near 5° elevation | Not modelled: positions are geometric. Keep a threshold above a few degrees. |
| Earth orientation (UT1, polar motion) | < 500 m | Modelled anyway with predicted IERS Bulletin A values: a correct frame chain costs nothing. |
| Light time | a few ms | Not modelled. |
Two days of age mean 2 to 6 km, which the ISS covers in under a second at 7.7 km/s: invisible to the naked eye, but a thousand times the Earth-orientation effects. Times are shown to the second; treat the banner above every result as their real precision.
A point is illuminated when the entire solar disc is clear of the Earth - penumbra counts as shadow. A satellite that enters the shadow mid-pass disappears mid-sky, and the sky chart shows where.
A point is visible when the satellite is sunlit and the Sun is at least 6° below the observer's horizon (civil twilight). It is a geometric condition, not a promise: brightness, clouds and light pollution are not modelled.
The code, the validation script and the reference file are public: read them on GitHub ↗. Integrating the predictions? See the API guide.