About the score
How we collapse cloud cover, moonlight and astronomical darkness into a single 0–10 number — and what we deliberately leave out.
The question
Whether tonight is worth it depends on three things: how much sky you can see (clouds), how dark it is (sun and moon) and where you are (light pollution). The score combines the first two. Light pollution shapes what is visible from your location, but it isn’t part of the number.
Three scores per night
- Headline — Average across the full astronomical-darkness window (sun ≥ 18° below the horizon). The honest answer to “how good is tonight overall”.
- Peak 2h — The best two-hour slice of the night. Use it when you only have a short window to step outside.
- Prime 21–01 — What you actually get if you head out around 21:00 and turn in around 01:00, regardless of when astronomical darkness starts.
The formula
The score combines clearness (the share of sky not covered by cloud) and darkness (how little the moon brightens the sky), with a soft visibility gate.
score = visibility × (clearness × 0.6 + darkness × 0.4) / 10 clearness = 100 − cloudCover% darkness = 100 − moonPenalty visibility = min(1, clearness / 30)
The visibility factor recognises that clouds gate everything: if it’s mostly overcast, even a perfectly dark sky earns no points. Above 30% clearness, visibility = 1 and the formula reduces to the plain weighted average. Below 30%, the score scales linearly to zero.
The moon penalty
Moon illumination is tiered, with a discount for late-night windows when the moon is more likely to be setting.
- Less than 25% lit (new or crescent moon): no penalty.
- 25–75% lit (around quarter moon): penalty equals illumination × 0.5.
- More than 75% lit (gibbous or full moon): penalty equals illumination × 1.0.
- If the window starts between 00:00 and 03:00 AND illumination is over 50%, the penalty is multiplied by 0.6.
What’s not in the score
- Light pollution (Bortle class, derived from VIIRS satellite data) shapes the “Visible Tonight” deep-sky list, not the number.
- Wind, humidity and precipitation are visible in the timeline if you scroll, but they don’t change the score.
- Forecast confidence. We don’t downgrade the score when the weather model is uncertain — we trust the forecast and let the next refresh correct it.
Worked example: a clouded-out night
Amsterdam · 5 May 2026
moonPenalty(83, 23) = 83 × 1.0 = 83 clearness = 100 − 100 = 0 darkness = 100 − 83 = 17 visibility = min(1, 0 / 30) = 0 raw = 0 × (0×0.6 + 17×0.4) / 10 = 0.0
Worked example: a great night
Same place · clear sky, crescent moon
moonPenalty(15, 23) = 0 (< 25% bracket) clearness = 100 − 8 = 92 darkness = 100 − 0 = 100 visibility = min(1, 92 / 30) = 1 raw = 1 × (92×0.6 + 100×0.4) / 10 = 9.52
Sources
- Open-Meteo: hourly cloud cover, sun and moon times, wind, humidity.
- VIIRS Day/Night Band: light pollution, used to estimate Bortle class for the “Visible Tonight” list.
Update cadence
Forecasts refresh every 30 minutes upstream. The score endpoint caches at the edge for 30 minutes (s-maxage=1800). The seven-night forecast updates daily.