uvlevel.net answers one question in under a second: is the sun dangerous right now, when does it become dangerous, and how long can your skin take it? It is a safety tool, not a weather app. Every design decision below follows from that.
How the blend works
Every forecast on this site comes from two independent UV models: Open-Meteo's weather forecast, and Copernicus Atmosphere Monitoring Service (CAMS) data. They disagree fairly often (clouds and aerosols are hard to model), so where both have a value for an hour, the site takes the higher of the two.
That is a deliberate choice, not an average or a "best guess". A warning that fires a little early costs nothing: a bit more sunscreen, a few extra minutes of shade. A warning that fires late costs a burn. When there is doubt, the site is built to err toward caution.
On top of that, an altitude correction is applied above 300 m elevation: uv = max(weatherUv, camsUv) × (1 + 0.08 × metres/1000). Thinner air scatters and absorbs less UV, so the same sun angle burns faster at altitude. This matters for places like Cusco, La Paz, Quito, Denver, Bogotá, Mexico City, Addis Ababa, Johannesburg and Nairobi. The exact same function runs on the server, when a push warning is prepared, and in your browser, when the page renders, so a notification can never say something the dashboard disagrees with.
The four services
Burn time
UV index 1 corresponds to 0.025 W/m² of erythemal irradiance, so unprotected skin reaches its minimal erythemal dose (MED) in minutes = MED / (UVI × 1.5). Sunscreen multiplies that figure by its SPF rating. The MED varies by Fitzpatrick skin type:
| I · always burns, never tans | 200 J/m² |
| II · burns easily | 250 J/m² |
| III · burns sometimes | 350 J/m² |
| IV · rarely burns | 450 J/m² |
| V · brown skin | 600 J/m² |
| VI · deeply pigmented | 1000 J/m² |
SPF ratings are measured with a 2 mg/cm² layer applied in a lab. Real-world application is usually about a third of that, so every treated burn time on this site is a ceiling, not a promise: reapply, don't rely on the number.
Timezones
Open-Meteo returns naive local timestamps plus a UTC offset in seconds. uvlevel.net treats every timestamp as a pseudo-epoch whose UTC clock fields equal the location's own wall clock: never the viewer's device timezone, and never a timezone-aware date library.
That is what makes a Berlin user checking Sydney's forecast, or Auckland, Santiago, Cape Town, Reykjavík or Nairobi, show the correct local hours. Parsing those strings in the viewer's own zone is exactly the bug this design exists to prevent.
Warnings and degraded operation
There are exactly three warnings, and no more: a morning forecast, a threshold-crossed alert, and a reapply reminder. Alert fatigue is the failure mode that kills a feature like this, so the count is fixed on purpose.
Degradation is a feature, not a bug: if the warning service is unreachable, the button on the dashboard disables itself and says so, while the forecast keeps working. If every forecast service is unreachable, the site falls back to computing UV from solar elevation alone and says plainly that the numbers are approximate. The shape of the day is still right, just not the precision.
Licence attribution
Forecasts and elevation from Open-Meteo. The second UV opinion contains modified Copernicus Atmosphere Monitoring Service (CAMS) information; neither the European Commission nor ECMWF is responsible for how it is used here. Place names from BigDataCloud, requested only when you share your device location.
Medical disclaimer
uvlevel.net gives general sun-safety guidance, not medical advice. Photosensitising medication, skin conditions, infants and a history of skin cancer all call for stricter limits than shown here. If in doubt, ask a clinician rather than a website.