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
Sky brightness is measured for all 300 of the main cities, and assumed everywhere else. Those two states are never mixed on a page, and you can always tell which one you are looking at: a city page names the brightness it used, while a bare-coordinate page says the sky is unknown.
For a city, the figure comes from satellite night-lights data run through the atmospheric model described below. For any other coordinate the tile pyramid needed to answer point queries is not uploaded yet, so the rate formula falls back to 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² is the sky 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. Where you see it, it is a stated reference condition and not a claim about your sky. Rates quoted against it run high for anyone in a town.
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" — an equivalence, not a survey of your street — and never grades your whole sky from a single number computed for the zenith. 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
This product was made utilizing VIIRS Nighttime Lights (VNL)
data produced by the Earth Observation Group, Payne Institute for
Public Policy, Colorado School of Mines, released under CC BY 4.0.
The 2024 annual composite (median_masked) is the input; the
figures on this site are derived from it, not copied from it.
C. D. Elvidge, M. Zhizhin, T. Ghosh, F.-C. Hsu and J. Taneja, "Annual
time series of global VIIRS nighttime lights derived from monthly
averages: 2012 to 2019," Remote Sensing 13(5) 922, 2021,
doi:10.3390/rs13050922.
C. D. Elvidge, K. Baugh, M. Zhizhin, F. C. Hsu and T. Ghosh, "VIIRS
night-time lights," International Journal of Remote Sensing 38,
5860–5879, 2017.
From satellite radiance to the sky over your head
A satellite measures light leaving the ground, which is not the same thing as the brightness of the sky above you. Getting from one to the other means modelling how that light scatters back down through the atmosphere. We use the model published by R. H. Garstang: molecular (Rayleigh) and aerosol (Mie) scattering in an exponential atmosphere over a curved Earth, with extinction along both the outbound and return paths and a correction for light that has already been scattered once. Every source within 300 km of a city contributes.
R. H. Garstang, "Model for artificial night-sky illumination,"
PASP 98, 364, 1986.
R. H. Garstang, "Night-sky brightness at observatories and sites,"
PASP 101, 306, 1989.
Implementation follows the open formulation in P. Cinzano, F. Falchi,
C. D. Elvidge and K. E. Baugh, "The artificial night sky brightness
mapped from DMSP satellite Operational Linescan System measurements,"
MNRAS 318, 641–657, 2000.
The natural background is taken as 22.0 mag/arcsec², the reference value used by F. Falchi et al., "The new world atlas of artificial night sky brightness," Science Advances 2, e1600377, 2016. Artificial and natural light are added as luminances and converted back to magnitudes; brightnesses never add in the magnitude domain.
The one number we fitted, and how wrong it is
One quantity cannot be derived from physics alone: the conversion from the satellite's radiometric band to visual luminance, because it depends on the local mix of lamp spectra. We fitted that single scalar to 15 published ground measurements of zenith sky brightness at sites worldwide, and publish every residual rather than quoting a headline accuracy.
- Root-mean-square error 0.178 mag.
- Largest single miss 0.437 mag; median miss 0.095 mag.
- All 15 anchors land inside ±0.6 mag.
- Leave-one-out cross-validation, so the fit cannot launder a modelling error: worst held-out residual 0.480 mag.
The full anchor table, with each measurement's source and quote, is in
docs/data-report.md §3.6.
What this does not model
- Terrain. No shielding by hills or ridges, so mountain cities read brighter than they are.
- Regional aerosols. One global clean-atmosphere value is used, while real aerosol content varies by more than a factor of two between, say, Reykjavík and Delhi.
- Snow and season. Snow cover reflects light back up and can add several percent; an annual composite averages over it.
- Zenith only. This is the brightness straight overhead. The Bortle scale is a judgement about the whole sky from horizon to horizon, which is why every mention of a class on this site is hedged as an equivalence rather than asserted as a fact about where you stand.
- Cities only. Outside the 300 main cities there is no measured value at all, and the stated assumption above is used instead.
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. Garstang's model is a published method that anyone may implement, and is unrelated to either dataset.
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.