Meshbell Documentation

Meshbell is a neighborhood-scale emergency instrument. Its design principle is unusual for a consumer app: verification is the substrate, not a feature. This is how that works.

Overview

A hazard warning in Meshbell is a small, signed record — an assertion. Assertions are content-addressed (named by the hash of their own bytes), signed with a device key, and never altered: a correction is a new assertion that references the old one. That immutability is what lets a warning and its correction travel together across a mesh, and what lets any device re-check any message it receives.

Everything above the network is designed so that losing a connection, a server, or a model costs you an annotation, never the alert.

The trust model

Meshbell keeps two questions apart, because they are different facts and blurring them is how misinformation spreads:

QuestionWhat answers itWhat it can say
Which record is this, and is it intact?Content-address + signature check on your devicebound / preview / tampered
Who signed it, and can I check?The on-device keyringverified · could-not-check · forged

The second axis is deliberately three-valued. A forgery (checked against a known key, failed) is not the same as an unknown key (no way to check yet) — collapsing them into one "invalid" would hide exactly the distinction a person needs. A message is stored as trusted only when the keyring says verified.

Verified off the air, with no prior copy

A short radio frame is a preview — a pointer at a record. But a record can also be sent in full as a self-authenticating envelope, split across several frames and reassembled on the far side. A device that has never seen the record before can then reconstruct it, re-derive its content address, and verify its signature — reaching a verified verdict on a pure-radio neighborhood with no internet anywhere in the loop.

The instruction firewall

The one thing an emergency app must never do is turn a rumor into an order. Meshbell enforces this structurally, not by review discipline:

The promise, in one line: the app never launders a rumor into an instruction — and that sentence is a property of the code, not a mission statement.

Working offline

Degradation is the expected state, not an error. When a data path is down, Meshbell serves the last known good data labeled with its age ("as of 40 minutes ago") rather than a confident-looking blank. The zero-ML tier — an old phone with no on-device model — is a first-class product tier: an emergency app that only works on the newest hardware fails the people most likely to need it.

Radios & hardware

Meshbell runs on your phone alone. Radios extend its reach when the network is down. A neighborhood mesh is built from inexpensive, off-the-shelf LoRa hardware running open MeshCore firmware:

PieceRole
A companion LoRa radio (e.g. a Heltec node)Your phone pairs with it over Bluetooth to send and hear bulletins on the mesh.
More radios around the neighborhoodEach one is a hop. Three or more begin to form real multi-hop reach across blocks and ridgelines.
An optional always-on node (e.g. a Raspberry Pi)Bridges the mesh to the wider internet whenever any uplink is available, and keeps a durable log — "the phone is the head, the mesh is the body."
US radio settings: Meshbell's reference bench runs 910.525 MHz, 62.5 kHz bandwidth, SF7 — inside the license-free 902–928 MHz band. Always read your radio's configuration back before transmitting; the region default may be a band you are not licensed to use.

Architecture

The domain logic is pure and portable — it builds and tests on a Raspberry Pi with no Apple hardware in the loop, so the parts that decide whether a message is trustworthy are verified continuously, not just at release. The iOS app is a thin renderer over it.

Honest limits

Stated plainly, because an emergency tool that oversells itself is dangerous:

← Back to the overview