How It Works
NWS publishes a warning. alertq sees it within 30 seconds and finds the places inside it. onNAV hands each phone to Apple.

- alertq. One poller for the whole country, in almanac.
- onNAV. Delivery stays on onNAV’s account, with onNAV’s Apple key.
The warning, not the county
NWS draws a severe warning as a shape around the storm. Most apps still ring the whole county. NWS’s own studies found the shapes cover about 70% less ground. Drag Mom’s house and see who rings.
Rings
Wrong: the county and the warning disagree here.Tells her: “4 mi from a warning”
© Mapbox © OpenStreetMap. The warning is made up; the county line is simplified. Try the southwest corner, where the warning crosses into the next county.
alertq, in almanac
A new Worker beside stormq, seaq and tideq, at alertq.almanac.observer.
- Polls NWS every 30 seconds for every active alert in the US: one request to
api.weather.gov/alerts/active, about 112 KB compressed on a quiet day. That’s the rate NWS asks for. - Keeps only what’s new or changed, so an update to a warning is an update, not a second alarm.
- Matches places. A severe warning comes with its shape: one test per place. Everything else names forecast zones and counties, looked up once for each place when it’s saved.
- Answers by place, like every almanac service, so any app can ask what’s in effect here. Storm, MarNav, or the next one.
Delivery, on onNAV’s account
Pushes come from a small Worker on onNAV’s own Cloudflare account. It holds onNAV’s Apple key and the list of phones, and listens to alertq for changes. The data is shared; the users are onNAV’s.
- What a phone sends: a push token, and each place’s point rounded to about 1 km, with the levels it wants. No name, no email, no account, no history.
- Straight to Apple. No OneSignal. A big outbreak fans out through a queue, because a Worker gets six connections at a time.
- One ring per warning. Updates change the banner and the countdown; they ring again only if the warning grows to cover somewhere new.
When something fails
Anything we host makes the app better, never the only way to get an answer.
- almanac or the push Worker is down: pushes stop. The app asks NWS itself whenever it’s open, and in the background when iOS allows, and still shows every warning.
- NWS is slow: nothing beats NWS. On August 12, 2026 a failed upgrade inside NWS delayed warnings to apps, TV and phones by up to 20 minutes. Storm always says how old its news is.
- No signal: the last warnings stay on screen with their end times, so an expired one says so.
What it builds on

The data
| What | Source | Through |
|---|---|---|
| Warnings, watches, advisories | NWS | alertq (new) |
| Hurricanes: cone, track, coastal warnings | National Hurricane Center | stormq |
| Buoys and buoy cameras | NOAA’s National Data Buoy Center | seaq |
| Tides | NOAA Tides and Currents | tideq |
| Air quality | The best network for the place | airq |
| Radar | NOAA’s MRMS, every 2 minutes | Our own tiles, later in almanac |
| Outlooks | Storm Prediction Center | Directly, as published |
| Weather at a place | Apple’s WeatherKit | The app |
| Lightning | None | Left out: no free source matches XWeather’s |
| The map | Mapbox, as MarNav | The one cost that grows with users |
NWS, NOAA and APNs cost nothing. almanac runs on Cloudflare’s Workers plan, $5 a month. WeatherKit comes with the developer account. The real costs are the map, and our time.
In the app
The same shape as our other SwiftUI apps: one app state of observable parts, small operations for every side effect, and providers as the only code that knows a wire format.
- AlertProvider is the only code that knows alertq’s answer, and NWS’s for when it asks NWS directly.
- The shape test runs in alertq and on the phone from one set of test cases, so the two can’t disagree about who’s inside a warning.
- The countdown on the Lock Screen starts from the push and ends at the warning’s end time, even if nothing else arrives.
- Widgets draw what the app published and never fetch, so a widget can’t disagree with the app.
Risks
Sources
- NWS API and alerts; sizes measured October 31, 2026
- Storm-based warnings and the ground they save, Iowa State
- What Wireless Emergency Alerts send
- MRMS on AWS and SPC’s outlooks
- workerd #4841: Apple’s push service from a Worker
- The August 12, 2026 delay
- Downloads during Winter Storm Fern
onNAV Storm • A pitch for onNAV, October 2026