Skip to content

Public warnings ​

The Hub reads official public warning feeds and hands each warning that concerns you to your kits as a compact signed digest. A kit puts it on its mesh, as an alert and as a text, and on its APRS bulletin channel, so people with a Meshtastic node or an APRS radio hear it when the phone network does not reach them.

Not an official warning channel

A relay is marked as one on every bearer. It is not NL-Alert, not a cell broadcast and not the sender's own app. Nothing here replaces them.

The feeds ​

SourceWhat it is
DWDDeutscher Wetterdienst, Germany: one CAP document per current warning, open data with the source named
MeteoAlarm, the NetherlandsEUMETNET's feed, KNMI the sender. Redistribution is subject to the feed's terms; MeteoAlarm and KNMI are named wherever a warning is shown

Both are read without a key, every five minutes by default. The text is the sender's own headline, shortened to fit and otherwise unchanged. An Update or a Cancel from the sender replaces or withdraws the warning on the kits as it does at the sender.

Opting in ​

Nothing is relayed until a workspace asks. Open Settings, then Integrations, then Public warnings (last-mile relay):

FieldWhat it does
Enabledrelay warnings to this workspace's kits
Areasone per line: a geocode as the feed names it (EMMA_ID:NL804, WARNCELLID:501000005) or a circle as lat,lon,radius_km
LanguagesISO 639-1 codes in order of preference; the first the warning carries wins
Feedswhich sources to take; empty means all
Also send over satelliteoff by default; see below

A warning goes to every kit of the workspace when one of your areas is in its area, and to a kit on its own when the kit's last reported position lies inside its polygon. A kit with no position never matches by position; a warning with geocodes only, as DWD's are, matches geocodes only.

Satellite delivery ​

Every kit gets the digest on its Hub link. With Also send over satellite on, the same bytes also go to each kit's modem on your own Cloudloop or Rock7 account, about 230 bytes per warning per kit. It is off by default: every warning in the area is then a paid message per kit, on your airtime.

What a kit does with it ​

The digest is signed with the Hub's directory key, which every kit already pins. A kit refuses anything it cannot verify, keeps the warning and never relays the same one twice. Then, once per bearer: on the mesh an alert, which makes a node with its alert setting on buzz, and a text on the primary channel; on APRS a bulletin of at most 67 characters, when the kit's APRS gateway runs.

Every mesh copy carries the label Relay of <sender> warning, issued <time> via MeshSat, not an official NL-Alert, the sender being DWD or KNMI via MeteoAlarm; the APRS form ends in -MeshSat relay. A test is prefixed TEST, a Cancel sends CANCELLED, an Update UPDATE. An expired warning is stored and not relayed.

Test it ​

An owner can inject a test warning: POST /api/warnings/test with a CAP 1.2 document whose status is Test or Exercise. It takes the same path as a real warning, for your workspace alone, and answers which kits matched; with satellite on it spends like a real warning would. GET /api/warnings lists what matched, on the Hub and on a kit. A self-hosted Hub needs HUB_WARNINGS_ENABLED=true.

Not in this version: a geocode-to-geometry table (a DWD cell matches a kit only by the geocode you name), more feeds, and a repeat on the mesh while a warning is in force.