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.
- 2009Bitcoinmoney without banks
- 2022Nostrspeech without platforms
- 2026Hopprmessaging without the internet
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
- Devices within Bluetooth range establish peer sessions automatically.
- Messages are relayed hop-by-hop through intermediate nodes toward the recipient.
- All traffic is end-to-end encrypted using the Noise XX handshake pattern with Curve25519, ChaCha20-Poly1305, and Ed25519 signatures.
- 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, taghg, Noise prologuehoppr-mesh/1, packet version byte0x02) 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
- Mesh-first architecture. Built on the transport layer. Social graphs, feeds, and recommendation systems are absent by design.
- End-to-end encryption. 1:1 direct messages use a Noise XX handshake. Mesh broadcasts are signed packets. Nostr fallback uses NIP-17 gift-wrap.
- Dual transport. Automatic fallback to Nostr relays routed over the Tor network (via Arti) when mesh connectivity is unavailable.
- Adaptive relay control. Seven-hop default TTL with probabilistic forwarding at elevated peer density to conserve battery without reducing reach.
- GCS gossip sync. A 400-byte Golomb-Coded Set reconciles missed messages between peers on reconnection at a 1% false-positive rate.
- QR peer verification. On-device live-camera scan compares Ed25519 and Noise identity fingerprints before a session is trusted.
- Geohash channels. Location-scoped public rooms and location notes ride the Nostr transport.
- Message toolkit. Emoji reactions, message edit, delete, pin, and star across DMs and channels.
- Rich text. Inline Markdown with fenced code blocks and inline code.
- On-device intelligence. Local translation and channel summarization run without leaving the device.
- Privacy controls. Privacy shield in the app switcher, stealth mode, and a Privacy PIN with decoy identity.
- Lightning integration. Zaps receive via NIP-57 and pay-to-message bonds for unsolicited DMs.
- Multi-device. Encrypted backup and QR onboarding bring a second device online without a server.
- Live mesh topology. Real-time visualizer of peers, hops, and link quality in the current radio neighbourhood.
- macOS polish. Menu-bar quick-compose and sticker packs on the native desktop build.
- Panic wipe. A single gesture destroys keys, message caches, and identity state on the device.
- Slash commands. IRC-style controls:
/who,/fav,/block,/unblock,/me,/slap,/help. - Payment chip detection. Lightning bolt11, LNURL, and Cashu tokens are recognised inline and tappable to open a wallet.
- iOS Share Extension. Share text and links from Safari or any app directly into the mesh.
- Native macOS app. Same codebase. Shipping since v1.5.
- Efficient runtime. Approximately 12 MB installed footprint. Cold launch under 400 ms on iPhone 12.
- Data minimization. No telemetry, crash reports, or advertising identifiers are transmitted from client devices.
Feature Highlights
- On-device AI. Translation and channel summarization run locally, so nothing about your conversation leaves the device.
- Lightning-native. Receive zaps over NIP-57 and gate inbound DMs with pay-to-message bonds priced in sats.
- Live mesh graph. Watch peers, hops, and link quality redraw in real time as the radio neighbourhood changes.
- Dual-stack mesh. Hoppr-to-Hoppr traffic runs on a dedicated protocol identifier set. An optional toggle bridges to the wider public mesh for reach without blending the conversation spaces.
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.
0x01is the public interop variant,0x02is 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
gandhggeohash 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
- v1.6 to v2.1Shipped in current build. Settings, reactions, threads, disappearing DMs, zaps receive, voice notes and images.live
- v2.2Voice rooms in geohash channels.2 to 3 weeks
- v2.3Hardware key identity (YubiKey NFC).3 to 4 weeks
- v2.4Voice and video calls via NIP-100.4 to 6 weeks
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.
- macOS alpha Deep debug build. Unsigned DMG. Expect crashes and UI gaps. Apple Silicon only for now.
- Android, direct APK beta arm64 sideload outside the Play Store. Core mesh and protocol are live. Some feature screens still missing.
- Android, Google Play coming soon Review in progress.
- iOS coming soon App Store submission in progress.
- Linux coming soon Native GTK build. Flatpak plus tarball.
- Windows coming soon Signed MSIX installer.