How the number is produced
Every figure on this site comes from the formula below applied to published data. This page states the formula, the constants, the assumptions that are substituted when data is missing, and the things the model does not attempt. If something here does not match what the site shows you, the page is wrong and the code is right — the constants on this page are imported from the modules that apply them, so they cannot silently disagree.
The hourly rate formula
The International Meteor Organization's standard relation defines the zenithal hourly rate from an observed count:
ZHR = HR · r^(6.5 − Lm) / ( sin(h_R) · F ) This site runs it backwards. Given a published ZHR, it produces the rate a single observer with an unobstructed field of view should expect:
HR = ZHR · sin(h_R) / ( r^(6.5 − Lm) · F ) ZHR- Zenithal hourly rate at maximum, from the shower table. Ranges from 5 to 150 across the twelve showers here.
h_R- Radiant altitude in degrees, computed for your coordinates and the hour in question. At or below 0° the rate is exactly 0 — not a small number, zero. This is why the site reports "not visible from your latitude" rather than a low rate for a radiant that never rises.
r- Population index: the ratio between the counts of successive magnitude classes. Across these twelve showers it runs from 2.1 to 3.2. A higher r means the shower is richer in faint meteors and therefore loses more to a bright sky.
Lm- Naked-eye limiting magnitude — see the next section.
F-
Cloud obstruction correction,
1 / (1 − cloud cover). Above 90% cover the rate is set to 0. When no cloud forecast is available,F = 1and the result is flagged as cloud-unknown; the site says "cloud data unavailable" rather than assuming a clear sky.
Limiting magnitude
Lm is where sky brightness, the Moon and twilight enter the
calculation:
Lm = clamp( (Lm_base − moon penalty) × twilight factor, 0, 7.5 ) Lm_base — from sky brightness
Measured sky brightness in magnitudes per square arcsecond is converted to a Bortle class using the thresholds in the project specification, and each class carries a limiting magnitude:
| Bortle class | Lm_base |
|---|---|
| 1 | 7.5 |
| 2 | 7.5 |
| 3 | 7 |
| 4 | 6.5 |
| 5 | 6 |
| 6 | 5.5 |
| 7 | 5 |
| 8 | 4.5 |
| 9 | 4 |
These are the upper bound of the classic Bortle naked-eye-limiting-magnitude range for each class, chosen because that rule reproduces the one value the project specification pins by hand (Bortle 4 → 6.5) instead of contradicting it.
Moon penalty
The Moon costs up to 2 magnitudes, scaled by the illuminated fraction multiplied by the sine of the Moon's altitude. A Moon below the horizon costs nothing at all, which is why a half-lit Moon that sets early can leave a night untouched while the same phase later in the month ruins it. The site applies this hour by hour rather than from the phase alone.
Twilight
The remaining limiting magnitude is scaled linearly from full at a Sun altitude of -18° (the end of astronomical twilight) down to zero at -6°. At or above -6° the sky is treated as unobservable and the rate is 0. Scaling what is left, rather than subtracting a fixed amount, is what makes Lm land on exactly zero at the boundary for every sky brightness.
Assumptions currently in force
No location on this site has measured sky brightness. The light-pollution ingest is blocked: the satellite nighttime-lights archive it depends on is behind an account wall, and every sky-brightness column in the city table is empty. 0 of the 300 main cities currently have a value.
The rate formula still needs a limiting magnitude, so the model substitutes a single stated constant rather than inventing a per-location one:
- Assumed sky brightness
- 21 mag/arcsec²
- Which Bortle class that lands in
- 4
- Resulting Lm_base
- 6.5
21 mag/arcsec² sits inside the Bortle 4 band, whose limiting magnitude is 6.5. That is not an arbitrary pick: 6.5 is the limiting magnitude the IMO's zenithal hourly rate is defined at, so under it the rate formula reduces to ZHR × sin(h) ÷ F and the model adds no sky correction it cannot justify. It is a stated reference condition and it is not a claim about your sky. Consequences you should know about:
- No Bortle class is displayed anywhere on the site. Where one would go, you will see "light-pollution data coming soon".
-
The public API returns
bortle: nullandlightPollutionKnown: falserather than the assumed value. - If your sky is genuinely darker than an average suburb, the rates shown here are pessimistic. If you are in a city centre, they are optimistic. The direction of the error is knowable even though the size is not.
One more caveat that applies even after real data lands: sky-brightness maps model the artificial brightness at the zenith, while the Bortle scale is a subjective assessment of the whole sky from horizon to zenith. The two are not equivalent. That is why this site only ever says "equivalent to Bortle N skies" — a statement about the sky the model assumed — and never asserts a Bortle class as a measured fact about where you are standing. The point is made explicitly by David Lorenz, whose light-pollution atlas is the most widely copied source of these maps.
How the four tiers are decided
The verdict is a function of the best hourly rate reachable tonight and the cloud cover across that window. The thresholds are fixed and published:
| Tier | Condition |
|---|---|
| Worth going out | Rate ≥ 10 per hour and cloud below 40% |
| Worth a gamble | Rate ≥ 5 per hour, or rate ≥ 10 with cloud between 40% and 70% |
| Not tonight | Rate below 5 per hour, or cloud above 70% |
| Not visible from your latitude | The radiant stays below the horizon for the whole night |
The last two tiers always carry a next-good-night suggestion. A verdict that only says no is half a product.
Peak instants and solar longitude
Shower maxima are published as a solar longitude, not a date — the Earth reaches the same point in its orbit at a slightly different clock time each year. Two conventions exist for that longitude, referenced either to the equinox of date or to the J2000.0 equinox, and in 2026 they differ by about 0.36°, which is roughly nine hours of solar motion. Getting this wrong shifts every peak on the site by most of a night.
This site uses the J2000.0 convention, which is what the IAU Meteor Data Center's own column header states and what reproduces the published maxima. The build pipeline confirmed it against four independently published maxima; the site's own solver was then checked against all twelve of the pipeline's 2026 peak instants and agrees to between 5 and 21 minutes, which is the accuracy of the low-precision solar position the pipeline used. That check runs as a test, so a regression fails the build rather than shipping quietly.
Peaks for the pipeline's reference year are quoted from the pipeline itself so the site and its data report cannot disagree; other years are solved from the same tabulated solar longitude.
Cloud forecasts
Two sources are used, chosen for licences that permit commercial use: MET Norway Locationforecast (CC BY 4.0) worldwide and NOAA/NWS (public domain) inside the United States. Requests carry a contactable User-Agent as both services require.
Coordinates are snapped to a 0.1° grid — about 11 km — before any request is made. That is deliberately coarser than the coordinates you give: cloud fields do not vary meaningfully over a kilometre, and gridding raises the cache hit rate by orders of magnitude, which is how the site stays within the upstream rate limits without being asked to.
When a request fails, times out or falls outside a provider's coverage, the hour is marked as unknown. It is never treated as clear.
What this engine does not model
- Meteor storms and outbursts. Predicting them requires integrating the parent body's ejecta trails forward in time, which is outside this engine's scope. Every rate here is the regular-activity baseline. For showers with a storm history — the Draconids, the Leonids — treat the number as a floor rather than an expectation.
- Local terrain and buildings. The radiant altitude is computed against a mathematical horizon. A hill, a tree line or the block of flats opposite can remove a large part of your sky, and the model knows nothing about any of it.
- Forecast decay. Cloud cover comes from a numerical weather model. It is useful inside about a day and degrades steadily beyond that. A verdict for tonight is worth far more than a verdict for next week, which is why this site does not publish one.
- You. The rate is what one observer with an ideal, unobstructed field of view would count. Real observers, looking at part of the sky, blinking, and losing dark adaptation to a phone screen, typically count 30–50% fewer.
Error ranges
- Peak instants: agreement between the two independent solvers used in this project is 5–21 minutes for 2026. The underlying solar longitude is published to two decimal places, roughly a quarter of an hour of orbital motion, so quoting a peak to better than about half an hour would be false precision.
- Radiant positions: taken from the IAU Meteor Data Center and reduced to the tabulated maximum using the published drift. Cross-checked against an independent copy of the same solutions to within 2° of arc, the largest case being a near-polar radiant where right ascension converges and the true angular difference is under half a degree.
- Activity windows: the calendar dates shown are for a reference year. Because they are derived from solar longitudes, they move by up to a day in other years.
- Rates: dominated by the sky-brightness assumption above, not by the arithmetic. Until measured light-pollution data is connected, treat the rate as an order-of-magnitude guide and the verdict tier as the useful output.
Data sources and licences
Radiants, drift, velocity and solar longitude
Meteor shower radiant, drift, geocentric velocity and solar longitude data are taken from the IAU Meteor Data Center (established shower list, V.2).
Jenniskens, P.; Jopek, T. J.; Janches, D.; Hajduková, M.; Kokhirova, G. I., et al., Planetary and Space Science, vol. 182, article id. 104821.
Jopek, T. J.; Kaňuchová, Z., 2017, Planetary and Space Science, vol. 143, pp. 3–6.
Rates, population indices and activity periods
Zenithal hourly rates, population indices and activity periods were seeded from the Stellarium project's
MeteorShowers.json(Meteor Showers plugin resource, format version 2). Imported once at build time; not used at runtime.
Cities
City names, coordinates, elevation, timezone and population are from GeoNames (
cities15000), licensed under CC BY 4.0.
Weather
Cloud forecasts from MET Norway Locationforecast (CC BY 4.0) and the NOAA National Weather Service API (public domain).
Astronomical calculations
Astronomical calculations use astronomy-engine (MIT License).
Light pollution
No light-pollution source is credited, because none is in use. A commercially licensed satellite nighttime-lights product was selected for this purpose, but its download requires an account this project does not have, so no value derived from it appears anywhere on this site. Until that changes the dataset is deliberately left unnamed here as well as uncredited: naming it would read as a credit, and the credit has not been earned. Both the name and the citation will be added at the same moment the data is. Doing it now would be a false attribution.
Two sources were considered and rejected. The World Atlas 2015 dataset is licensed CC BY-NC, which excludes any site carrying advertising or affiliate links. David Lorenz's light-pollution atlas carries no licence statement at all, and an unstated licence is not a permissive one.
Using these numbers yourself
The computed results are available from the public API under CC BY 4.0. Attribution and a link back are the only conditions. The upstream sources above keep their own licences and must be credited separately when you redistribute them.