What happens to a message
No radio system can promise a message gets through. If there's no path to command, there's no path. What CertMesh does promise is that a volunteer can always see where their message is, and that the app keeps trying without them retyping it. This page is how that works.
Last updated October 21, 2026
Five statuses
Every message on a volunteer's phone shows one of these, and only moves forward:
| Status | What it means |
|---|---|
| Queued | Waiting its turn, or waiting for any path to command. |
| Sending | Going out over the radios, piece by piece. |
| Sent | Every piece was confirmed by the radio network. That alone doesn't mean command has it. |
| Received | Command's app has the whole message. |
| Acked | A person at command looked at it and acknowledged it. |
The gap between Sent and Received is the one people get wrong with other tools. Sent means the radios passed it along. Received means it actually reached command. Acked means someone read it. A volunteer who needs an answer should wait for Acked.
There's no "failed"
If a send stalls (the radio's out of range, the battery died, nobody's in between), the message stays where it is and the app tries again 15 seconds later, or right away when something changes, like the radio reconnecting or a new radio coming into range. When the radio can't hear anyone at all, it still tries once a minute, since sending is how the app finds out a path has opened.
The outbox is saved to the phone on every change, so closing the app or restarting the phone doesn't lose anything.
After an hour in the queue a message is marked stale and stops going out on its own. The volunteer gets two choices: "Still relevant" sends it, "Clear it" drops it. A report of a blocked road from an hour ago may not be worth the airtime anymore, and the volunteer is the one who knows.
Over the radios
The radios carry about 200 bytes at a time, which is roughly one text message. CertMesh packs messages tightly to fit: a filled damage assessment form (CERT 1) is under 120 bytes. Anything longer goes as numbered pieces.
- Each piece is confirmed before the next one goes. If a send stops partway, it picks up from the last confirmed piece and nothing already sent goes again.
- When the check-in names command's radio, messages go straight to it and every piece gets a receipt. Otherwise they go out on the incident channel for every radio in range to pass along.
- One message is on the air at a time. A new one goes first, because the volunteer is watching it, and anything it interrupted resumes afterward from where it stopped. The rest of the queue goes oldest first.
- Command's side keeps the pieces of a half-received message for 30 minutes, so a long form can arrive across a gap in coverage.
- Every radio in an incident has to be on the same range setting (long or medium) or they can't hear each other. The check-in sets it, so volunteers don't.
No duplicates
The phone gives every message an ID when it's written. A retry reuses the same ID, and command's app and our server both throw away anything they already have. So a message that went out twice, or that reached command by radio and by internet, shows up once. The ID goes into the ICS 309 communications log too, so the paper trail matches what was sent.
Over cell service
The message format and the IDs are the same on both paths, so command can take a message from whichever gets there first. Our server already accepts messages from phones and drops duplicates.
The piece of the field app that sends over the internet isn't finished. Until it is, messages from the field go over the radios, and the phone's cell connection is used for signing in, checking in and downloading maps. Messages that can only go over the internet (a volunteer checking themselves out without command, for one) wait in the outbox until it's done.
What we've tested
On the bench, with two radios: the app connects to a radio, sets it up for an incident, sends a message and gets it confirmed by the second radio. Phone Bluetooth, the full check-in at staging and field range are next. We'll post the results here as they come in, including the bad ones.