Skip to main content
Offline Protocol routes over configured, available transport bridges. BLE, Wi-Fi paths, internet relay, Reticulum and Nostr have different platform and infrastructure requirements. See the compatibility matrix.

Local communication

BLE can connect nearby participating devices without an access point or internet. Offline Protocol’s forwarding over BLE is an application protocol; it is not a promise of Bluetooth SIG Mesh interoperability. Range and capacity depend on the radios, environment and workload. Python TCP peer streams require an existing IP path. From v0.28.0 the phone Wi-Fi managers carry traffic too; see phone Wi-Fi peer streams for what each platform reaches.

Routing and delivery

DORS scores eligible paths and applies switching controls. Multi-hop forwarding needs participating peers, sufficient lifetime and a viable route. Retry and outbox policies retain bounded work while connectivity changes. From v0.29.0 two devices that have never been in range of each other start an encrypted session through a third. While a message waits for a peer no carrier reaches directly, the sender hands its key package to its neighbours to carry, and the Welcome comes back the same way; the device in between carries frames it cannot read. A resend is also offered to the mesh when no carrier reaches the recipient, and a message the mesh carried settles with message_delivered when the recipient answers. A device with allowRelay on carries these handshake frames too. The threat model records the reach of this as residual risk R24. A Python host running offline-protocol-service starts every transport its configuration enables: peer streams on the LAN, Bluetooth LE through BlueZ on Linux, and the relay. See local API service. Disabling internet demonstrates cloud independence only if the remaining observed path carries the workflow. To demonstrate recovery from an access-point failure, test a separately qualified direct path; a LAN test alone does not establish that result.

Gateways

A gateway is provisioned against a defined contract, including identity, delivery verdicts and recovery. A device that happens to have internet access does not automatically become a trusted upload destination for every application.

Phone Wi-Fi peer streams

The wifiDirect transport slot is the peer-stream slot: a byte stream to exactly one peer, with whole messages framed by length up to 1 MiB. The first frame in each direction is an identity assertion, and a peer is announced to the protocol only under the address it proved. A peer that sends anything else first, or nothing for ten seconds, is disconnected. Every bundled manager speaks this framing from v0.28.0. An Android Wi-Fi Direct group does not include iPhones or Python hosts; they meet an Android phone on 0.29.0 or later on a shared Wi-Fi network instead. That needs a network that allows multicast and does not isolate clients, which many guest and office networks do not. A Wi-Fi network with no internet counts. With the slot enabled, every device on the network can see the phone’s address, as with a Bluetooth LE advertisement. On Android, dials are bound to the Wi-Fi network, the lower address keeps a duplicate stream as on iOS and Python, and Android 10 and later use a 15-second keepalive. The LAN path needs no runtime permission until an app targets Android 17 (API 37); from then the app must declare and request ACCESS_LOCAL_NETWORK before start(). iOS used MultipeerConnectivity up to v0.27, so an iPhone on 0.28.0 does not see one on 0.27 or earlier over this slot. The hop itself is plain TCP on all three platforms; payloads are sealed end to end either way. An Android group’s name and passphrase are derived from the mesh app identifier. They keep apps apart and are not a secret: a device in range that knows the identifier can join the group or run one under its name. It then learns which addresses are present and can carry, delay or drop their frames, as any relay can, but every stream still proves its peer and every message stays end-to-end encrypted. The threat model records this as residual risk R22. Android groups of three or more devices are untested. transport_switched reports Wi-Fi Direct when the first link proves a peer, and None when the last one ends. Platform setup is in React Native installation.