Sine Loco

Chat without
a place.

No server. No account. No phone number.

Download Source

A message crossing Tor A message leaves you wrapped in three layers of encryption. Each relay removes one layer and knows only its neighbours. The two chains of relays meet at a rendezvous point, then the message reaches your contact's onion service. Nothing stores it on the way. you your contact rendezvous relays you pick relays they pick
  • 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
docs/TRANSPORT.md

Where does your message rest?

docs/COMPARISON_SESSION.md, docs/DELIVERY.md

One key per contact, not one ID for all

ID 7f3a ID 7f3a ID 7f3a
One shared ID. Any two contacts can compare notes and see the same you.
key A key B key C key D
A fresh key pair and onion address for each contact. Nothing ties them together.

README.md, docs/KEY_ROTATION.md

What you need to start

  • Phone number
  • Email address
  • Account
  • Server
  • Cloud

A key you swap with your contact.

README.md

Sealed, then resealed

  1. Noiseframework
  2. KKpsk0+psk2both keys known, plus a shared secret
  3. 25519curve, with ML-KEM-768 added
  4. ChaChaPolycipher
  5. BLAKE2shash

crates/core/src/session.rs:34

If one key leaks

One key against a key that moves on With a single key for the whole session, a leak exposes every message, before and after. With a new key every 32 cells or 10 minutes, messages before the leak stay sealed. Later ones are exposed until a new handshake. One key for the whole session Sine Loco: new key every 32 cells or 10 minutes key leaks earlier cells stay sealed later cells exposed until a new handshake
docs/DELIVERY.md. A rekey is one-way, so it protects the past, not the future.

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

crates/vault/src/lib.rs

Where it runs

Project pulse

–

stars

Latest release

–

    Recent releases

      Loads from this site's own server. Without JavaScript, see releases on GitHub.

      Status and limits

      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
      PropertyValueSource
      HandshakeNoise KKpsk0+psk2, fresh ephemeral keys on every connection. The prologue binds the version and both signing keys.crates/core/src/session.rs
      Post-quantumX25519 plus ML-KEM-768 hybrid, with an ephemeral ML-KEM exchange inside the handshake.docs/SECURITY_TRACKER.md R2-H1
      SignaturesEd25519, strict verification. Weak keys and low-order X25519 points are rejected.crates/core
      RekeyTransport key replaced by a one-way function of itself after 32 cells or 10 minutes.docs/DELIVERY.md
      VaultArgon2id 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
      MessagesIn memory by default. History is opt-in: separate encrypted file, 6-hour key buckets wrapped per 24-hour epoch.docs/DELIVERY.md
      Panic and purgeF12 wipes memory and screen and exits. Ctrl+] also overwrites and deletes the vault. Swap refused, core dumps off.README.md
      File metadataJPEG and PNG rebuilt from an allowlist in a seccomp sandbox, then padded to size buckets.crates/sandbox, crates/strip
      NetworkPer-contact onion services, v3 client authorization, proof-of-work defence on, per-contact stream isolation, Tor in a private RAM directory.docs/TRANSPORT.md
      BuildStatic musl binary, about 1.5 MB. Two consecutive release builds gave identical SHA256SUMS.scripts/release.sh
      Supply chaincargo-deny passes, fuzz targets exist, cargo-vet initialised with all 210 crates still exempted.deny.toml, fuzz/
      LicenceAGPL-3.0-or-later.LICENSE