← Back to home

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.

One score, two helpers

  • Headline — Average across the full astronomical-darkness window (sun ≥ 18° below the horizon). The honest answer to “how good is tonight overall”.
  • Best 2 hours — The best two consecutive hours inside the dark window. A helper for when you only have a short slot; it never replaces the headline.
  • Evening, 21–01 — 21:00 to 01:00, trimmed to the part that is actually dark: what you get if you head out in the evening.

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%     // averaged over the dark window
darkness   = 100 − moonPenalty     // averaged over the same hours
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 brightness is tiered by illumination, then scaled by how high the Moon actually stands during each dark hour.

  • 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.
  • Below the horizon the Moon costs nothing; from 30° altitude it costs the full tier; in between it scales with altitude. Rise, set and altitude come from astronomy-engine for your exact location.

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.
  • Single-model trust. Tonight’s score is cross-checked against ECMWF, GFS and ICON-EU across the full darkness window; if they disagree by more than 25 points anywhere in that window, we lower the score toward the cloudier model (capped at −1.5 points) and the card shows a "Cautious estimate" badge — under-promising is a no-regret bet. After sunset we also blend the current observed cloud cover (METAR, when an airport is in range) and clamp the score down if the sky is much cloudier than the model said.

Worked example: a clouded-out night

Amsterdam · 19 September 2026 · real forecast run

Cloud cover (avg)
96% · 21:43–05:25
Moon
61% · 17:00–23:33
Calculation
moonPenalty = 1   (low Moon, sets 23:33)
clearness  = 100 − 96 = 4
darkness   = 100 − 1 = 99
visibility = min(1, 4 / 30) = 0.13
raw        = 0.13 × (4×0.6 + 99×0.4) / 10 = 0.56
Score
0.6
Stay inside. A solid low cloud deck all night: the visibility gate pushes the score to almost zero. The Moon barely matters: it stays low and sets at 23:33.

Worked example: a great night

Same place · clear sky, crescent moon

Cloud cover (avg)
8%
Moon
Waxing Crescent · 15%
Calculation
moonPenalty = 0     (< 25% lit)
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
Score
9.5
Drop everything and go outside. Crescent moon, mostly clear sky, full astronomical darkness.

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.

For the geeks

How the score is calculated

Deeper walkthrough of layer-weighted cloud forecasts, multi-model confidence, METAR observations, and the calibration feedback loop.

Read the methodology →
← Back to home
How the StarsOut score works