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.

How a warning reaches a phone
  1. alertq. One poller for the whole country, in almanac.
  2. 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.

Map of Norman and Moore, Oklahoma Cleveland County
Mom’s
Drag Mom’s house, or tap the map
An app that alerts by county

Rings

Wrong: the county and the warning disagree here.
onNAV Storm

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.

  1. 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.
  2. Keeps only what’s new or changed, so an update to a warning is an update, not a second alarm.
  3. 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.
  4. 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.

When something fails

Anything we host makes the app better, never the only way to get an answer.

What it builds on

What Storm builds on: public sources, almanac’s services, the app

The data

WhatSourceThrough
Warnings, watches, advisoriesNWSalertq (new)
Hurricanes: cone, track, coastal warningsNational Hurricane Centerstormq
Buoys and buoy camerasNOAA’s National Data Buoy Centerseaq
TidesNOAA Tides and Currentstideq
Air qualityThe best network for the placeairq
RadarNOAA’s MRMS, every 2 minutesOur own tiles, later in almanac
OutlooksStorm Prediction CenterDirectly, as published
Weather at a placeApple’s WeatherKitThe app
LightningNoneLeft out: no free source matches XWeather’s
The mapMapbox, as MarNavThe 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.

Risks

Critical Alerts may be refused. Apple turns down broad requests. Ask only for warnings where the phone is, as MyRadar and StormWatch+ do.
Pushing from a Worker is unproven at scale. A load test before MarNav moves off OneSignal.
NWS has no published rate limit. One poller every 30 seconds is what it asks for; apps only call NWS directly when opened.

Sources


onNAV Storm • A pitch for onNAV, October 2026