Methodology

How SnapCosmos computes tonight's verdict

Every formula, every source, every weighting — so you can check our work, and so AI answer engines can cite it.

1. Data sources

Every value on SnapCosmos traces back to one of four primary sources. We do not aggregate from third-party astronomy sites; we compute from raw ephemerides and physical forecast models.

  • Astronomy: astronomy-engine — calibrated against NASA JPL DE-441 ephemerides. Sub-arcminute accuracy for Sun, Moon and planets. Used for twilight, moon phase, illumination, transit times, rise and set for any location on Earth.
  • Weather forecast: Open-Meteo — an ensemble of ECMWF IFS, DWD ICON, NOAA GFS and national high-resolution models (MET Norway MEPS in Scandinavia, DWD ICON-D2 in Central Europe, HRRR in the US). Hourly cloud cover, precipitation, temperature and wind, resolved to ~2 km.
  • Historical climatology: ERA5 reanalysis via Copernicus, exposed through Open-Meteo's archive API. Ten years of daily mean cloud cover at your exact coordinates — the anchor for our "historically rare / worse than typical" claims.
  • Space weather: NOAA SWPC — Kp index, solar wind speed and density, geomagnetic storm forecast. Feeds the aurora verdict.
  • ISS orbital elements: two-line elements refreshed daily; propagated with SGP4 to compute visible passes for your coordinates.

2. The Tonight Score (0–100)

The score answers a single question: how good is tonight for looking up, from here? It is a weighted average of four sub-scores, each normalised to 0–100:

Score = 0.35 · CloudScore
      + 0.25 · MoonScore
      + 0.20 · DarknessScore
      + 0.20 · EventScore

CloudScore = 100 − (mean cloud cover % during dark hours). Rain any time during dark hours caps the score at 20 regardless of cloud, because a wet sky is a closed sky.

MoonScore = 100 − illumination × visibility fraction. Illumination is the fraction of the Moon's disc lit (0–1). Visibility fraction is the share of the dark window during which the Moon is above the horizon. A 90% Moon that sets before astronomical darkness begins scores 100.

DarknessScore = clamp(dark hours × 20, 0, 100). Four or more hours of astronomical darkness (Sun < −18°) score 100. Zero hours — common above ~60° latitude in summer — score 0.

EventScore is 0 for a quiet night, 40 for a minor event (single ISS pass, planet at good altitude), 70 for a headline (meteor peak, bright ISS pass with >5 minute duration), 100 for a major event (opposition, total eclipse, active aurora at your latitude).

3. The verdict

The verdict is imperative — Go, Skip, Wait, Go after midnight — not the score. It is chosen from the same signals but reads the transitions the score cannot see:

  • Go tonight — cloud below 25% for the majority of dark hours AND no rain AND (event score ≥ 40 OR moonless).
  • Go after midnight — a clearing transition is detected: cloud drops from ≥50% to <30% at least once during dark hours, and the cleared window is at least 90 minutes long.
  • Worth a look — broken cloud (25–55%) with no clearing transition, or clear sky with only quiet astronomy.
  • Skip tonight — rain during dark hours, OR mean cloud ≥ 85% with no clearing transition.

4. Confidence (0–100%)

Confidence reflects how strongly the underlying signals agree. It is not a probability in the frequentist sense — it is the model's own honesty about how much room there is for the actual sky to disagree with the forecast.

Confidence = 100
  − 20 · (cloud variance across dark hours / 40)   // volatile → less confident
  − 15 · has_transition_near_midnight             // clearing/thickening near peak
  − 10 · moon_sets_within_dark_window              // moonset changes the window
  −  5 · latitude_high_summer                      // twilight-only nights

High confidence (≥85%) means the forecast, moon and darkness all point the same direction. Low confidence (below 65%) means the verdict is a lean, not a guarantee — check the actual sky before committing.

5. Historical percentile (ERA5)

For each location we fetch daily mean total cloud cover from ERA5 reanalysis for the past ten years, filtered to the ±10 calendar-day window around today's date. This builds a location-specific, season-specific distribution of ~200 comparable nights.

Tonight's forecast cloud cover is ranked against that distribution. A 12th percentile means only 12% of nights in that decade window were clearer than tonight — a "historically rare" call. A 78th percentile is worse than three quarters of comparable nights — a "worse than typical" call.

The ERA5 window is unique to each set of coordinates. Two locations 100 km apart can have meaningfully different distributions; that is precisely why the anchor is useful.

6. What we do not do

  • We do not use aggregated third-party astronomy data. Every ephemeris lookup is a direct call into astronomy-engine, computed for your coordinates.
  • We do not publish generic "best-night" tables. Every claim on the site is grounded in your coordinates, tonight's forecast, and the historical distribution for your location.
  • We do not blend AI-generated prose into the verdict. Editorial sentences are template-driven from the signals above; wording is fixed and auditable in the phrasing source.
  • We do not track users to compute the verdict. Location is stored in your browser only; nothing is sent to our servers.

Corrections welcome. If a number on any page contradicts a primary source, tell us at hello@snapcosmos.com and we will fix it in public. See our editorial policy and data sources.