Hoppr, encrypted peer-to-peer mesh messenger

Encrypted peer-to-peer messaging over Bluetooth mesh networks.

No internet. No servers. No carrier. No account. Just radios talking to radios.

Overview

Hoppr is a messaging platform engineered for environments where internet access is unavailable, degraded, or untrusted. Messages propagate device-to-device through a Bluetooth Low Energy mesh, requiring no centralized infrastructure, accounts, or identifiers.

Vision

Decentralisation has come in layers. Each one removed a dependency.

Bitcoin freed value from custodians. Nostr freed identity and publication from centralised hosts. Hoppr removes the last assumption: that a network has to exist at all. A phone without service, a city under blackout, a protest, a festival, a desert. The mesh still carries.

The same Bluetooth radio your device already has, used the way radios were always meant to be used: direct, local, and unowned.

Architecture

  1. Devices within Bluetooth range establish peer sessions automatically.
  2. Messages are relayed hop-by-hop through intermediate nodes toward the recipient.
  3. All traffic is end-to-end encrypted using the Noise XX handshake pattern with Curve25519, ChaCha20-Poly1305, and Ed25519 signatures.
  4. A dual-stack layer runs two parallel protocol variants on the same radio and the same relays. The Hoppr-native variant (service UUID F71E237E, Nostr kind 20100, tag hg, Noise prologue hoppr-mesh/1, packet version byte 0x02) keeps Hoppr-to-Hoppr traffic isolated. The public interop variant bridges to the wider open mesh population when the user enables it in Settings.

Reach Analysis

In a mesh of N devices with average node degree d, a gossip packet propagates to all peers in expected O(logd N) hops. Under an asynchronous flood at uniform density, the expected number of devices reached after h hops is bounded by:

E[R(h)]  =  min( N ,  d · (d−1)h−1 )

Field example. Five peers on average within Bluetooth Low Energy range (d = 5), default TTL of seven hops (h = 7):

E[R]  =  min( N ,  5 · 46 )  =  20 480 devices

Duplicate packets are suppressed per device by a bounded LRU cache of 1000 recent message identifiers with a five-minute expiry. Lookups are O(1) and deterministic. To reconcile missed messages between peers on reconnection, each node exchanges a 400-byte Golomb-Coded Set summarising what it has seen. For a GCS encoding n elements at target false-positive rate p, the expected bits per element is:

bits / element  ≈  log2( 1 / p )  +  1 / ln 2

Field example. With n = 200 recent identifiers and p = 0.01, each device advertises roughly 200 · 8 ≈ 1600 bits of state, or about 200 B encoded. Under 1% false-positive pressure, a 400-byte summary carries on the order of 400 message identifiers before a peer must ask for the full set.

In practical terms: a packet released into a moderately dense mesh reaches thousands of devices within seconds of radio time, while each individual device rejects duplicates exactly, and missed messages are healed on reconnection through a sync envelope smaller than a single TCP segment.

Capabilities

Feature Highlights

Lean by design

Other chat apps assume a flat-rate data plan and a flagship device. Hoppr does not. Every default is tuned for users on metered networks, weak batteries, and old hardware.

Installed size
under 12 MB on iOS and macOS, target under 20 MB on Android
Voice notes
AAC mono at 8 kHz, around 1 kB per second
Images
resized to 1080 px long edge, re-encoded to WebP, stripped of EXIF
Text messages
typically under 300 bytes on the wire after Noise framing
Auto-cleanup
messages older than 30 days are purged locally by default, user-configurable
Storage cap
local SQLite store is capped at 50 MB, rotates oldest out
Low data mode
a single toggle disables the Nostr fallback entirely so the app sends nothing over the internet
Telemetry
none. no analytics SDK, no crash reporter, no advertising identifier

This is a deliberate limit, not a shortcut. Reach matters more than richness when the device is the only link the user has.

Technology

The stack is intentionally narrow and auditable.

Transport (primary)
Bluetooth Low Energy mesh. Dual-advertise, dual-scan. Seven-hop default TTL with adaptive probabilistic forwarding at elevated peer density.
Transport (fallback)
Nostr over Tor via Arti (Rust, arm64 static library on iOS and macOS, JNI on Android). Gift-wrapped direct messages under NIP-17.
Handshake
Noise XX with Curve25519 key agreement, ChaCha20-Poly1305 authenticated encryption, Ed25519 signatures, SHA-256 hashing. Per-variant prologue binding.
Packet format
TLV body with an outer protocol-version byte. 0x01 is the public interop variant, 0x02 is Hoppr-native.
Dedup
Bounded LRU cache of 1000 recent message identifiers with five-minute expiry. Reconciliation via 400-byte Golomb-Coded Set at a 1% false-positive rate.
Persistence
SQLite via stdlib bindings on iOS and macOS. Equivalent on-device storage on Android. No cloud database.
Keys on iOS and macOS
Apple Keychain with kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly. Never synced to iCloud. Wiped by identity reset.
Nostr relays
Public infrastructure. Subscriptions span kinds 20000, 20001, 20100, and 20101 across the g and hg geohash tags.
Build
iOS 16 plus, macOS 13 plus, Android 10 plus (API 29 plus). No third-party analytics, advertising, or crash-reporting SDKs.

Blog

Signed, long-form notes published by the Hoppr team on protocol design, mesh research, and release notes. Readable without an account, verifiable on any Nostr client.

Open the blog launching soon

Roadmap

Every release is signed. Pre-release builds are not distributed outside of closed testing programmes.

Technical Specifications

Transport
Bluetooth Low Energy mesh
1:1 DMs
Noise XX handshake
Mesh packets
Signed broadcast
Key agreement
X25519 (Curve25519)
Encryption
ChaCha20-Poly1305
Signing
Ed25519. secp256k1 Schnorr for Nostr
Hashing
SHA-256
TTL
7 hops default. Fragment-relay cap 5
Dedup cache
LRU 1000 entries. 5 min expiry
Gossip sync
400 B Golomb-Coded Set. 1% FPR
Voice codec
AAC. M4A. 16 kHz mono 16 kbps
Online relay
Nostr via Tor (Arti)

Availability

Early builds are public. Expect rough edges and breaking changes. See the download page for direct installers.