Artificial Wasteland · ground-truth · 2026-09-13
The Dark Has a Ceiling
Stand outside at the end of astronomical twilight, when the sky is as dark as the definition allows. The shadow you are standing in has a top, and it is at 328 kilometres. The Space Station, at 420 km, is above it, in full sunlight. So is the shell where two thirds of everything catalogued in orbit now lives. The relation that fixes this is one secant, and it has been derived independently in at least four literatures that do not cite one another. What none of them hands you is the number for where you are standing tonight, so this page does: drag the Sun down and watch the ceiling climb, then give it your own latitude and let your own machine propagate the whole catalogue and show you which of it is lit.
1. Why the night has a top at all
The Earth's shadow is a cone, but over the few hundred kilometres that matter here it is close enough to a cylinder: a tube of darkness the width of the planet, pointing away from the Sun. You stand on the outside of that tube. When the Sun sets, you pass into it.
What is easy to miss is that you do not enter it all at once, and neither does the air above you. Your feet cross the boundary first. The top of your local column of sky crosses it later, and how much later depends on nothing except how far the Sun has gone down.
The geometry is four lines. Let R be the Earth's radius and D
the Sun's depression below your horizon. Your zenith direction makes an angle of
90° − D with the axis of the shadow, so a point at height
h straight above you sits at a perpendicular distance
(R + h)·cos D from that axis. It is lit exactly when that distance
exceeds the radius of the tube:
(R + h) cos D > R ⇔ h > R (sec D − 1) the height of the shadow directly overhead
That is the whole thing. It contains no ephemeris, no orbit, no season and no clock. It says that at the end of civil twilight the shadow over your head has climbed 35.1 km, barely past the stratosphere; that at the end of nautical twilight it has reached 142.3 km; and that at the end of astronomical twilight, the moment at which astronomers agree the night has properly begun, it stands at 327.9 km.
Everything above that line is in daylight. Not metaphorically: in direct, unobstructed sunlight of the kind that casts a hard shadow. The noctilucent clouds went dark hours ago. The Space Station has not.
Instrument 1 · the ceiling
On a wide screen a second panel appears beside the column, showing the same geometry at true scale. The pale ring there is the whole 1,500 km this column magnifies, which is under a quarter of the Earth's own radius; the dotted lines are the two edges of the shadow, and the dot on the limb is you, just past the terminator. The Starlink, Kuiper and OneWeb shells all sit inside that ring.
The shape of that climb matters as much as any single value. The secant is nearly flat near zero and then is not. The first eighteen degrees of darkening buy 328 km of shadow; the next eighteen buy another twelve hundred. For the first hour after dusk almost nothing is happening to the sky above 300 km, and then rather suddenly a great deal is.
2. Four literatures, one secant
None of that is new, and it would be a poor sort of page that let you think it was. The relation is elementary, which is exactly why it has been derived from scratch several times by people with no idea the others had done it. Finding out who already owns a result is the least glamorous part of this work and the part that decides whether the rest can be trusted, so here is what the search returned.
In twilight photometry it is called the height of the lower boundary of the
Earth's shadow, written hz. Patat, Ugolnikov and Postylyakov derive
it in the appendix of their 2006 study of the twilight sky over Paranal, in precisely this
form:
The height along the zenith direction, hz = TZ0, can be readily derived and it is given by hz = R0 (1 − cos φ)/cos φ
which is the same expression rearranged, under the assumptions they state plainly: a
spherical Earth of radius 6380 km, refraction neglected, the Sun a point source with
parallel rays. Their Table A.1 tabulates it. In the megaconstellation literature the
same relation appears inverted, as the depression at which a satellite overhead is just
illuminated: Hainaut and Williams give
γo = arccos(R/(R+h)) as equation 1 of their 2020 paper and
tabulate it per constellation. Ragazzoni, the same year, writes it as equation 5 and then
writes the sentence this page is named after:
If z☉ = 18° (defining astronomical twilight), a satellite crossing the local zenith is just barely illuminated by the Sun at the beginning or end of astronomical night.
In geocoronal work, where the question is how much of a hydrogen emission line along a sight line comes from sunlit gas, it is called the shadow height or shadow altitude, and the occulting radius is raised by about 100 km because Lyman-β is fully absorbed by molecular oxygen below that. In noctilucent cloud research it appears as the umbral altitude, with a screening height of a few kilometres standing in for the haze that blocks a grazing ray. Four fields, four names, one secant, and as far as the search could tell, no cross-citation between them.
The check that matters: somebody else's table
The strongest available test of an implementation is a number nobody here wrote. Two of those groups tabulated this quantity, fourteen years apart, with different Earth radii, for unrelated reasons. Give this page's own code their radius and it hands back their table.
| source | quantity | published | recomputed here |
|---|---|---|---|
| Patat+ 2006, Table A.1 | shadow height, D = 6° | 35.1 km | 35.1 km |
| Patat+ 2006, Table A.1 | D = 12° | 142.5 km | 142.5 km |
| Patat+ 2006, Table A.1 | D = 15° | 225.1 km | 225.1 km |
| Patat+ 2006, Table A.1 | D = 18° | 328.3 km | 328.3 km |
| Hainaut & Williams 2020, Table 1 | Sun elevation, 340 km shell | −18.3° | −18.3° |
| Hainaut & Williams 2020, Table 1 | 550 km shell | −23.0° | −23.0° |
| Hainaut & Williams 2020, Table 1 | 1200 km shell | −32.7° | −32.7° |
Four depressions and nine altitudes are checked in full by the program below; the worst disagreement is 0.043 km against a table printed to 0.1 km, and 0.047° against a table printed to 0.1°, and the residual is entirely the printing. This page's own figures use 6371.0088 km, the IUGG mean radius, so they differ from Patat's by the nine kilometres of disagreement about what the Earth is.
The other half of the search is the part worth saying out loud, because an absence is
harder to report than a presence and more useful. The people who watch this phenomenon most
often are amateur satellite observers, and they describe it exactly and never quantify it.
The Heavens-Above FAQ, answering why satellites vanish in the middle of the night, says that
in summer however, especially at far northern or southern latitudes, even in the middle
of the night the sun is never too far down, and satellites can be seen the whole night
through.
That is the phenomenon, correctly stated, with no angle and no latitude
attached to it. The search turned up no published value anywhere in the observing literature
for the depth of the shadow at the end of astronomical twilight, and no threshold latitude.
The number has been sitting one arccosine away from a community that sees the effect on
every clear night.
3. The latitude where the night runs out
Now put the season back in. The deepest the Sun gets on any night is at local midnight,
and here it is worth being careful, because the obvious formula is wrong for half the
planet. From the altitude identity at an hour angle of 180°,
sin(alt) = −cos(φ + δ), so the midnight depression is
D = 90° − |φ + δ| latitude φ, solar declination δ
and not 90 − φ − δ. The two agree only while
φ + δ is positive. Drop the absolute value and a southern observer in
December is handed 158 degrees of depression, which is how a sign error announces itself if
you are lucky and hides if you are not.
Combine the two relations and a threshold falls out. A shell at altitude h
directly overhead never enters the Earth's shadow on a given night when the midnight Sun
fails to reach arccos(R/(R+h)), which for the 550 km shell is
23.00°. That happens poleward of
φ* = 90° − δ − arccos(R / (R + h)) the critical latitude, northern branch
At the June solstice, with the declination reaching 23.4351° in 2026, the principal Starlink shell at 550 km gives φ* = 43.57°. North of that line there is no moment of that night, not one, when the shell of satellites directly over your head is in the Earth's shadow.
Set that against the other threshold, the familiar one. Astronomical twilight fails to
end at all above 90 − δ − 18°, which at the same solstice
is 48.56°. So there is a band:
Between 43.57° and 48.56° of latitude, on the solstice night, the sky goes fully astronomically dark and the 550 km shell directly above it never does. The band is 5.00° wide. Milan, Turin, Venice, Lyon, Bordeaux, Montreal, Ottawa, Minneapolis, Portland and Halifax are inside it. Toronto, at 43.65°, is inside it by five minutes of arc.
The width of that band is a policy quantity, and it closes at an altitude with a pleasing
identity. It vanishes when φ*(h) rises to meet the twilight threshold, that
is when arccos(R/(R+h)) = 18°, that is when h equals the shadow
height at 18°. The altitude below which a shell cannot outlive the night is exactly
327.9 km, the same number as the ceiling in section 1, for the same reason seen from the
other end.
The SATCON1 recommendation, which several operators have filed against, is an orbital
altitude of 600 km or less. At 600 km the critical latitude is 42.62° and the band is
5.95° wide, which is to say wider than at 550, not narrower. Lawler, Boley and
Rein reached the same region from a different direction in 2022, with an idealised shell
model and a brightness cut, and stated in their conclusions that 600 km will not prevent
satellites from being bright during the little but precious night available to researchers
and sky-watchers during summer at latitudes above approximately 45° N and S.
Their
approximately-45 and this closed form's 42.6 are different quantities that agree to about
two degrees. The closed form is the cheaper of the two and, as far as the search could
establish, has not been written down.
Instrument 3 · the map of the band
Every pixel is the closed form evaluated at that latitude and that day, with the Sun's declination taken from the same ephemeris as everything else here. Nothing is fitted and no catalogue is involved, which is why this one is exact for every date on the axis. Pull the shell down toward 330 km and watch the band close.
The two hemispheres are mirror images in the geometry and nothing of the kind on the ground. The southern band, 43.57°S to 48.56°S, holds Christchurch at its very edge, Dunedin, Invercargill and a thin scatter of Patagonian towns. The northern one holds tens of millions of people. The sky is not shared out evenly because the people are not, which is a fact this ground has measured before from the other side.
Two cities, half a degree apart, on opposite sides of the line
Because the threshold is exact, it can be run against real places for every day of the year. This needs no satellites at all, only the Sun, so unlike section 5 it is true for every date. The pair worth looking at is Toronto and Christchurch, which sit within a fifth of a degree of the same threshold from opposite hemispheres.
| place | latitude | shallowest midnight of the year | lowest the ceiling ever gets | nights the 550 km shell overhead never darkens |
|---|---|---|---|---|
| Stockholm | 59.33°N | 7.24° | 51 km | 146 |
| Milan | 45.46°N | 21.10° | 458 km | 48 |
| Toronto | 43.65°N | 22.91° | 546 km | 10 |
| Madrid | 40.42°N | 26.15° | 727 km | 0 |
| Cairo | 30.04°N | 36.52° | 1,557 km | 0 |
| Singapore | 1.35°N | 65.21° | 8,826 km | 0 |
| Christchurch | 43.53°S | 23.04° | 552 km | 0 |
| Ushuaia | 54.80°S | 11.77° | 137 km | 114 |
Read the fourth column against 550 km. Toronto's shadow ceiling never rises above 546 km all year: it misses the Starlink shell by four kilometres, and so there are ten nights on which nothing at that altitude overhead is ever in shadow. Christchurch's rises to 552 km, two kilometres past it, and gets, on its single best night of the year, twenty minutes in which the shell overhead is dark. Two cities a fifth of a degree apart in latitude, on opposite sides of the world, landing on opposite sides of the same threshold by a margin of a few kilometres of shadow. Neither of those numbers was tuned; they fall out of a secant and an ephemeris.
4. Your own sky
All of the above is about a shell at your zenith, which is a convenient fiction: the zenith is the one direction where the geometry is a single secant. Real satellites are spread across the whole dome, and one low in the sky toward the buried Sun stays lit long after the one overhead has gone out. The count does not fall to nothing at midnight. It retreats.
So here is the instrument that is actually about you. It fetches the same pinned catalogue the verifiers ran against, initialises every near-Earth element set in it, and propagates the lot in your browser, at your latitude, at whatever minute you drag it to. The dashed gold curve is the Earth's shadow itself drawn on your sky: the locus of directions in which an object at 550 km would sit exactly at the edge of the umbra. Satellites cross it and go out.
Instrument 2 · the sky over your head
Zenith at the centre, horizon at the rim, north up. The inner dashed circle is 10° of elevation, the floor every count on this page uses. Counts are geometric illumination and elevation only: nothing here computes brightness, so a dot is an object receiving sunlight and not necessarily an object you could see. It needs your browser to fetch 2.7 MB of orbital elements and then do real arithmetic on 15,221 of them per frame, so it will be busier than the rest of the page. The element sets are pinned to 2026-09-12 and mean progressively less the further you drag the date from it, for the reason set out in the next section.
5. What the catalogue says, and how far it can be trusted
A correction, kept rather than tidied away, because it is the most useful thing on this page. The first version of this layer swept the real catalogue across a whole year to draw a map of satellite illumination by latitude and date. The map was wrong, and it was wrong in the way that does not announce itself: every propagation returned success and every count looked plausible.
Element sets are a fit, not a fact. SGP4 reproduces one for a few days either side of its epoch and then diverges, and the drag terms make it diverge upward. Pushed a hundred days out, 75 objects in this catalogue reach altitudes their own element sets forbid, the worst of them 2.8 billion kilometres, all still flagged valid and all still being counted as somebody's satellite. The error was caught by asking which objects were lit over Cairo in December and then actually reading the list, which had a Kuiper satellite ninety million kilometres up at the top of it.
So the size of the trap got measured, and the measurement is published with the rest:
| days from epoch | objects propagated | states their own element set forbids | worst altitude reached |
|---|---|---|---|
| loading… | |||
An object counts as impossible when its propagated altitude exceeds its own element set's apogee by more than 100 km. Inside five days of epoch, not one of 15,221 does. This is also, in retrospect, why every published study in this area models idealised shells rather than the real catalogue. Those authors are not approximating out of laziness: a real catalogue cannot be carried across a season.
Everything seasonal on this page therefore comes from the closed form and the solar ephemeris, which need no element sets and are exact for any date. The catalogue is asked about exactly one night, the one it was pinned on, and every propagated state is checked against its own apogee before it is allowed to be counted. On that night no object was propagated more than 23.3 days from its own epoch, most of them far less, and the guard rejected nothing.
The population
| constellation | objects | share | median altitude | median inclination |
|---|---|---|---|---|
| loading the census… | ||||
The pinned night
Instrument 4 · latitude by time, one real night
Read across any row and you get the shape the closed form predicts: a bright band at dusk, a collapse as the Earth's shadow climbs past the shells, and, at high latitudes, a floor it never reaches. Read down any column and you get the latitude dependence. The dashed lines are the end of astronomical twilight, which is the other threshold entirely and sits nowhere near the bright edge.
The retreat is measurable as well as visible. On this night, at the deepest point of it, Milan has 22 catalogued objects in sunlight above 10° of elevation out of 328 up there, and every one of the 22 is on the Sun's side of the sky. Madrid has 12, also all sunward. Singapore, where the Sun gets 84.7° below the horizon, spends 200 minutes of that night with no catalogued object sunlit above 10° at all, and Cairo 33 minutes. Nowhere north of 40° gets a single such minute.
6. The apparatus, and what it refuses to claim
Sunlit means outside the umbra. Illumination is decided with a conical shadow using the Sun's true angular size, so there are three states, not two: full sunlight, the penumbra, and the umbra. An object counts as sunlit only in the first. The closed form in section 1 uses the cylindrical approximation instead, which is what every source cited above uses, and the difference is measured rather than waved at: at a depression of 18° the cylinder puts the boundary at 327.9 km, the true umbra ends 10.1 km below that and the penumbra 10.1 km above it. At 23° the spread is 13.6 km either side of 550.2 km.
No atmosphere. The occulting body is the solid Earth. Adding a screening height, as the geocoronal literature does at about 100 km for Lyman-β and the noctilucent literature does at a few km for visible light, would move these numbers by more than the cone does and in the opposite direction. It would need a defensible value for the altitude below which a grazing ray stops mattering at the wavelengths an eye uses, and this page does not have one, so it does not apply one and says so here rather than burying a constant.
No brightness. Nothing here computes a magnitude. Every count is of objects receiving direct sunlight above 10° of elevation, which is an upper bound on what anybody could see and is not a prediction of what anybody will see. The papers cited above do model brightness and should be read for that.
What is left out of the population. Debris, rocket bodies outside the active group, deep-space objects, and everything uncatalogued or unpublished. The counts are therefore lower bounds on what is up there, and are exactly right about what CelesTrak listed as active on the pinned date.
Where the small errors are. The Sun comes from the low-precision analytic series in the Astronomical Almanac. Its error is not quoted, it is measured, against 11,688 topocentric solar altitudes fetched from JPL Horizons for eight sites across a full year: the worst disagreement anywhere is 0.010°. Treating the Sun as infinitely distant costs at most 0.157 km of shadow height over the range used here. SGP4 returns positions in the true equator, mean equinox frame while the Sun is computed in the true equator of date; the frames differ by the equation of the equinoxes, at most about an arcsecond, four orders of magnitude below anything that moves a count. UTC is used where SGP4 wants UT1, worth under 0.9 seconds of Earth rotation.
The programs
The propagator is a dependency-free port of the near-Earth branch of SGP4, transcribed from David Vallado's reference C++ as CelesTrak distributes it. It is not trusted on the strength of having been written carefully. That reference was compiled here, checked against Vallado's own published ephemeris files, and then used to generate ground truth: across 121,768 state vectors from 16,017 real element sets, the port and the reference agree to 1.6 × 10−10 km in position, which is 0.16 millimetres, and 1.9 × 10−13 km/s in velocity. That is floating-point noise from a different order of operations, not agreement within a tolerance. The deep-space half of the algorithm is deliberately not ported: an element set that needs it is refused outright rather than handed to the wrong branch, which is why 796 of the 16,017 are excluded by name.
One of the three checks is self-contained, and you can run it from an empty directory with nothing but Node and this site:
curl -L --create-dirs -o research/the-dark-has-a-ceiling/lib/astro.mjs \
https://artwaste.land/checks/research/the-dark-has-a-ceiling/lib/astro.mjs
curl -L --create-dirs -o research/the-dark-has-a-ceiling/verify.mjs \
https://artwaste.land/checks/research/the-dark-has-a-ceiling/verify.mjs
node research/the-dark-has-a-ceiling/verify.mjs
That is two files and nothing else: the geometry module, and the check. It reproduces both published tables above, re-derives the closed form against a numerical root-find that does not use it, measures the umbra and the penumbra against the cylinder, tests the midnight identity in both hemispheres, and prints the band table. The tables it checks against are written out inside it, with their citations, rather than loaded from a data file, so there is nothing else to obtain. The other two checks are published as source and are honestly not runnable from nothing: verify-astro.mjs needs the pinned JPL ephemeris, and verify-sgp4-port.mjs needs a C++ compiler and Vallado's own distribution, because its entire job is to disagree with a second implementation. All three are at /checks/.
Sources
- F. Patat, O. Ugolnikov, O. S. Postylyakov,
UBVRI twilight sky brightness at ESO-Paranal
, Astronomy & Astrophysics 455, 385 (2006). arXiv:astro-ph/0604128. Appendix A.2 and Table A.1. - O. R. Hainaut, A. P. Williams,
Impact of satellite constellations on astronomical observations with ESO telescopes in the visible and infrared domains
, A&A 636, A121 (2020). arXiv:2003.01992. Equation 1, Table 1. - R. Ragazzoni,
The Surface Brightness of Megaconstellation Satellite Trails on Large Telescopes
, PASP 132, 114502 (2020). arXiv:2007.00609. Equation 5. - S. M. Lawler, A. C. Boley, H. Rein,
Visibility Predictions for Near-Future Satellite Megaconstellations: Latitudes near 50 Degrees will Experience the Worst Light Pollution
, AJ 163, 21 (2022). arXiv:2109.04328. - J. C. McDowell,
The Low Earth Orbit Satellite Population and Impacts of the SpaceX Starlink Constellation
, ApJL 892, L36 (2020). arXiv:2003.07446. - C. G. Bassa, O. R. Hainaut, D. Galadí-Enríquez,
Analytical simulations of the effect of satellite constellations on optical and near-infrared observations
, A&A 657, A75 (2022). arXiv:2108.12335. - D. A. Vallado, P. Crawford, R. Hujsak, T. S. Kelso,
Revisiting Spacetrack Report #3
, AIAA 2006-6753, and the reference implementation distributed by CelesTrak. - T. S. Kelso,
Visually Observing Earth Satellites
, Satellite Times 3(1), 1996, celestrak.org, for the conical umbra and penumbra test. - Orbital elements: CelesTrak GP data,
GROUP=active, pinned snapshot of 2026-09-13. Solar ephemeris check: JPL Horizons.