Chat without
a place.
No server. No account. No phone number.
- A relay peels one layer and sees only its two neighbours
- The message inside stays sealed end to end
- Nothing stores it on the way
Where does your message rest?
-
Typical cloud messenger
The server keeps a copy and sees who talks to whom.
-
Network with mailboxes
Nodes hold it for days, so a stranger holds your ciphertext.
-
Sine Loco
Nothing holds it. Unsent texts wait in your own memory.
docs/COMPARISON_SESSION.md, docs/DELIVERY.md
One key per contact, not one ID for all
README.md, docs/KEY_ROTATION.md
What you need to start
Phone numberEmail addressAccountServerCloud
A key you swap with your contact.
README.md
Sealed, then resealed
- Noiseframework
- KKpsk0+psk2both keys known, plus a shared secret
- 25519curve, with ML-KEM-768 added
- ChaChaPolycipher
- BLAKE2shash
crates/core/src/session.rs:34
If one key leaks
What one password guess costs
512 MiB
of memory for every guess at your vault password, using Argon2id. One dot is 1 MiB.
XChaCha20-Poly13054 KiB bucketsno plaintext header
Where it runs
- Linux terminalone static x86_64 binary, about 1.5 MB
- Linux desktopnative app, .deb, targeted for 0.2
- AndroidTor connects on an emulator, no real phone yet
Project pulse
–
stars
Latest release
–
Recent releases
Loads from this site's own server. Without JavaScript, see releases on GitHub.
Status and limits
- Unaudited. Version 0.1.0, no independent audit.
- 33 review rounds, by AI. Not a human audit.
- Online only. Both people must be online, unless the outbox is on.
- Online time is visible to anyone who knows a contact's onion address.
- Out of scope: a compromised device, a global observer, RAM remanence.
- Android has never run on a real phone.
README.md, docs/SECURITY_TRACKER.md. Report vulnerabilities with GitHub's private “Report a vulnerability” form.
Every claim, with its source
Every claim, with its source file
| Property | Value | Source |
|---|---|---|
| Handshake | Noise KKpsk0+psk2, fresh ephemeral keys on every connection. The prologue binds the version and both signing keys. | crates/core/src/session.rs |
| Post-quantum | X25519 plus ML-KEM-768 hybrid, with an ephemeral ML-KEM exchange inside the handshake. | docs/SECURITY_TRACKER.md R2-H1 |
| Signatures | Ed25519, strict verification. Weak keys and low-order X25519 points are rejected. | crates/core |
| Rekey | Transport key replaced by a one-way function of itself after 32 cells or 10 minutes. | docs/DELIVERY.md |
| Vault | Argon2id 512 MiB, 3 passes, 4 lanes. XChaCha20-Poly1305. Length bucketed to 4 KiB, no plaintext header, rollback counter, optional keyfile. | crates/vault/src/lib.rs |
| Messages | In memory by default. History is opt-in: separate encrypted file, 6-hour key buckets wrapped per 24-hour epoch. | docs/DELIVERY.md |
| Panic and purge | F12 wipes memory and screen and exits. Ctrl+] also overwrites and deletes the vault. Swap refused, core dumps off. | README.md |
| File metadata | JPEG and PNG rebuilt from an allowlist in a seccomp sandbox, then padded to size buckets. | crates/sandbox, crates/strip |
| Network | Per-contact onion services, v3 client authorization, proof-of-work defence on, per-contact stream isolation, Tor in a private RAM directory. | docs/TRANSPORT.md |
| Build | Static musl binary, about 1.5 MB. Two consecutive release builds gave identical SHA256SUMS. | scripts/release.sh |
| Supply chain | cargo-deny passes, fuzz targets exist, cargo-vet initialised with all 210 crates still exempted. | deny.toml, fuzz/ |
| Licence | AGPL-3.0-or-later. | LICENSE |