Every layer, named and checkable.
No black boxes. Kant is built entirely from published, well-studied building blocks — so you don’t have to take our word for any of it.
From your screen to theirs.
Every hop, every encryption boundary, and every component that touches the data — in one picture.
Double Ratchet session
sees ciphertext only
decrypts locally
No account. No one hands out your identity.
Your identity is a keypair (Ed25519) created on your own device from a private seed. Nobody issues it, and nobody can revoke it. It stays stable across restarts because it’s derived, not assigned.
The first time two people connect, Kant runs the X3DH handshake to agree on a shared secret that is never sent over the network. From then on, every conversation runs on a Double Ratchet: each message moves the keys forward, so one exposed key reveals nothing before or after it.
The same code runs in the Android, desktop and command-line apps — it lives in one shared core library.
A helper, not a server that keeps things.
Kant’s relay is a stateless libp2p circuit-relay v2 bootstrap node. Devices register a signed address, and other devices look it up. That’s the whole job: introductions and relay-assisted connections — never storing messages.
Every request carries a nonce and duplicates are rejected, so a replayed /register call gets nothing. Entries expire on a timer and are removed on disconnect.
The relay’s own identity is derived from a seed, so its address survives restarts and clients reconnect without fuss.
Messages, groups and files.
Transport
Messages travel as length-prefixed frames on two dedicated libp2p protocols.
Frames are one-way: the sender writes and closes. No connection is held open waiting for a reply.
Group chats
Groups have their own key handling and delivery path, separate from one-to-one chats.
- ✓Membership and key rotation handled on devices
- ✓Group state never routed through the relay
- ✓The relay still only sees encrypted frames
File transfer
Files are split into chunks, each encrypted separately and sent so transfers can resume.
- ✓A dropped connection doesn’t mean starting over
- ✓Every chunk is verified on its own
- ✓Retries don’t need re-encryption
Onion routing
OptionalMulti-hop onion routing with cover traffic, layered on the same transport. For people who need to hide who is talking to whom from the relay itself — not just what they say.
Direct or relay-assisted connections are the default. Onion routing is there for the situations that call for it.
Notifications that carry nothing
On Android, a separate push proxy sends a bare “wake up” signal, so relay operators never need Firebase credentials.
Run a relay without flying blind.
The relay exposes the same health and metrics surface you’d expect from any production service. Prometheus-native, no extra tooling.
Prometheus-native metrics
Scrape straight into Grafana. A reference dashboard ships in the repo under ops/monitoring/.
Admin access is locked by default
/admin/reservations needs a configured bearer token and isn’t reachable at all without one.