Bitchat never asks for an account, a phone number, or an email address. Instead, your identity is a pair of cryptographic keys generated entirely on your device the first time the app runs. Those keys live in the iOS or macOS Keychain — they never leave the device unencrypted, and no server ever sees them. This page explains what each key does, how your peer ID is derived, what you reveal on the radio, and the tools available to manage trust with other people.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/permissionlesstech/bitchat/llms.txt
Use this file to discover all available pages before exploring further.
Key Material
Each device holds two long-term keypairs stored in the Keychain, plus an optional third keypair for the Nostr internet path.- Curve25519 Static Key
- Ed25519 Signing Key
- Nostr secp256k1 Key (Optional)
Used for Noise XX key agreement with peers. When two devices connect over Bluetooth, they run the Noise XX handshake using their respective Curve25519 static keys. Successful completion produces a shared session secret that encrypts all private payloads between those two peers.The SHA-256 fingerprint of this key is your stable identity — it is what other devices save when they favorite you, and it is the root from which your peer ID is derived. The raw public key is broadcast in cleartext in signed presence announcements, so any device in radio range can read it.
Peer ID
Every device on the mesh is identified by a short 8-byte peer ID. It is the first 8 bytes of the SHA-256 fingerprint of the device’s Curve25519 Noise static public key.MessageRouter routing decisions, courier addressing, and the peer list UI.
Mesh Presence
Devices announce themselves to the mesh using signed presence announcements that propagate multi-hop across the network. Each announcement carries:- Nickname — the chosen display name (cleartext)
- Noise static public key — the Curve25519 key used for session establishment (cleartext)
- Ed25519 signing public key — used to verify this and future packets from the sender (cleartext)
- Capability flags — a bitmask indicating supported protocol features
- Up to 10 direct-neighbor IDs — the peer IDs of directly connected peers, giving receivers a shallow topology map
Favorites and Mutual Trust
Favoriting a peer pins their full Noise public key into local storage. This survives app restarts and means you can recognize and securely communicate with that person even after a gap where no announcement was heard — the key fingerprint from a previous session is trusted directly. When two peers both favorite each other, they form a mutual favorites relationship. Mutual favorites:- Exchange their Nostr
npubpublic keys, enabling private message delivery over the Nostr relay network when Bluetooth is unavailable - Receive preferential treatment in the courier system — mutual favorites can deposit up to 5 courier envelopes per sender, versus 2 for verified strangers
QR Verification
For the strongest identity binding, Bitchat supports optional in-person QR code verification. Scanning another person’s QR code binds their displayed nickname to the full Noise key fingerprint in your local verified-peer store. This eliminates any ambiguity about whether a given peer ID on the mesh corresponds to the person you think it does. The QR flow is facilitated byVerificationModel and routes through the Transport interface’s challenge/response methods:
Privacy Caveat
The static peer ID and the public keys in announcements mean a passive radio listener can track a device across time and place without connecting to it. This is a documented limitation of the current protocol, not an implementation defect. The whitepaper notes:“Unlinkable presence is not a property this protocol currently provides.”Specific exposure points:
- The 8-byte sender ID in every packet header is derived from a key that never rotates.
- Announcements broadcast the Noise static key and Ed25519 signing key in cleartext.
- Announcements carry up to 10 direct-neighbor IDs, handing a single sniffer the local adjacency graph.
- Origin packets leave at the default TTL (7), so hop distance from the source is observable.