← Hoppr

Threat Model & Anonymity Guide

What Hoppr protects, what it does not, and how to build a real privacy stack.

No communication system, anywhere, is 100 percent anonymous against every threat. Anyone who tells you otherwise is selling something. This page is the honest version.

TL;DR

What Hoppr protects

Every direct message between two devices is wrapped in a Noise XX handshake producing forward-secret session keys. Actual message bytes are encrypted with ChaCha20-Poly1305 and authenticated. The cryptographic suite is the same family used by Signal, WireGuard, and modern TLS.

Concretely, this means:

For mesh broadcasts and geohash public rooms the story is different. Those messages are signed but not encrypted. Anyone subscribed to the same geohash sees them in plain text. Treat them like an open radio channel.

What Hoppr does NOT protect

Be honest with yourself about the following. No amount of cryptography fixes these.

Threat matrix

Casual snooper nearby
Cannot read messages. Can see a Hoppr device exists.
Local LAN/ISP
Irrelevant for mesh. For Nostr fallback they see Tor traffic only.
Nostr relay operator
Sees encrypted gift-wrap. Does not learn sender, recipient content, or IP (through Tor).
Tor exit or global passive adversary
Traffic analysis possible with sufficient resources. Content stays encrypted.
Someone with a BLE sniffer in a city
Can triangulate device presence. Cannot read content.
Your chat partner
Sees everything you send. Full stop.
Malware on your device
Defeats all encryption. Reads messages on screen.
Physical device seizure
If unlocked, complete compromise. If locked, depends on iOS version and attacker capability.
Future quantum computer
Would break Curve25519 if and when it becomes practical. Current estimates: 10 to 20 years, possibly never. Not a short-term worry.

Channels explained

Hoppr has two kinds of public channels, plus private direct messages. These are often confused. The difference matters for your privacy.

Mesh channel (#mesh)
Local Bluetooth LE broadcast. No internet. Up to seven hops. Anyone in radio range sees the signed cleartext.
Geohash channel (#u1, #u33db, ...)
Public Nostr events routed over Tor. Global reach. Anyone on the internet subscribed to that geohash sees the signed cleartext.
Direct message (@nickname)
End-to-end encrypted via Noise XX. Travels over mesh when the peer is nearby, over Nostr-over-Tor when they are not. Only the two ends read it.

Simple rule: public channels are an open radio. Only DMs are private. Do not say anything in a mesh or geohash channel that you would not say on a megaphone.

Are there Hoppr servers?

No. There is no Hoppr backend. There is no BitChat backend either. Both apps build on top of Nostr, which is a decentralised protocol similar in spirit to email. "Channels" are not hosted anywhere specific. They are a convention: every message in a geohash channel is tagged with a geohash value, and public Nostr relays forward it to anyone subscribed to that tag.

The relays Hoppr uses by default are independently operated by the Nostr community, not by us:

relay.damus.io
Operated by the Damus iOS client project.
nos.lol
Run by Mike Dilger.
relay.primal.net
Operated by the Primal.net team.
offchain.pub
Community relay.
nostr21.com
Community relay.

These are not ours. Think of them as public bulletin boards. We route through Tor so relay operators see only ciphertext and no IP addresses. If any relay disappears, the others continue to work. You can also point Hoppr at your own relay if you run one.

Where do names like "Region", "Block", or "Friesland" come from?

Two layers, computed entirely on your device:

The underlying identifier is a geohash. A geohash is a short text code that represents a rectangle on Earth. Your phone takes your GPS coordinates, computes the full geohash for your position, and then takes the first few characters to form rooms at different zoom levels:

2 chars (e.g. u1)
Region. Covers several hundred kilometres. All of northern Europe fits in a handful of these.
4 chars (e.g. u33d)
Province or large metropolitan area.
5 chars (e.g. u33db)
City or neighbourhood.
6 chars (e.g. u33dbc)
Block. A few streets.
7 chars (e.g. u33dbcx)
Building. Roughly one address.

The human-readable label next to the code (for example "Friesland" or "Berlin" or "Region") is produced by Apple's CoreLocation framework doing reverse geocoding on your own device. It does not leave your phone. The geohash itself is what other users see on the wire, not the label.

This means the same geohash shows up with different human labels depending on the user's language settings. "Berlin" for one user might display as "BerlĂ­n" for a Spanish-language device. The underlying geohash is identical.

Shared namespace with other apps

Because Hoppr speaks standard Nostr for these channels, it shares the public channel namespace with any other app that speaks the same convention. Practically that includes BitChat, since the protocols match. You may see messages in a channel from users of another client, and they may see yours. Your DMs remain end-to-end encrypted regardless. Only the public channels cross app boundaries.

Who Hoppr is for

Hoppr is well suited for people who need one or more of the following:

Hoppr is not sufficient on its own for:

Building a realistic anonymity stack

Three tiers for three threat levels. Pick the highest one that matches your actual risk. Do not over-engineer: complexity is itself an attack surface.

Tier 1. Casual privacy

For anyone who does not want their mesh conversations readable by curious bystanders, parents, roommates, or Wi-Fi operators at a coffee shop.

Tier 2. Journalist or activist

For people who might be profiled, tracked, or whose sources need deniable contact.

Tier 3. High-risk source or dissident

For the threat model where a state actor is the adversary. Hoppr is one layer here, not the whole plan.

The question of which phone matters less than what you do with it. A jailbroken legacy BlackBerry is not a secure device in 2026. Modern BlackBerry-branded phones are Android and will run Hoppr like any Android. For maximum security in 2026, GrapheneOS on a Pixel is the community-audited choice.

Detecting a MITM

The single most important habit: verify fingerprints.

When you first chat with a new peer, Hoppr performs a Noise XX handshake. Without out-of-band verification, an attacker relaying the handshake can substitute their own keys and read everything. The remedy is simple: scan the other person's QR code, in person, and confirm the fingerprint matches on both devices.

If a contact's fingerprint ever changes without them telling you first, stop communicating through that channel. Verify out of band, via a different medium and ideally in person, before trusting the new key.

If your device is seized

Responsible disclosure

If you discover a vulnerability in Hoppr, email security@hoppr.chat. We respond within three business days. The PGP key fingerprint is published in the app under Settings and in /.well-known/security.txt.

Last updated: 2026-04-19