sendit.chat

Private, end-to-end encrypted chat & file sharing.
No accounts. No logs. No persistent storage.

1 session started since last deploy

Create new session

Start a private room in your browser. We generate the join secret and X25519 keys locally, then give you a short invite link to share — the server never sees your messages, files, or private keys.

🔗

Join existing session

Have a session link? Paste the invite URL below to join.

Why sendit.chat?

🔒

Zero-knowledge server

Messages are encrypted in your browser before anything leaves your device. The server only ever sees scrambled ciphertext it can never decode.

👤

No accounts, ever

No sign-up, no email, no phone number. Nothing to register, nothing to breach. Start a conversation in one click.

💨

Nothing stored

Messages and files exist only for the life of your session. Close the tab and they're gone — no logs, no history, no trace.

Instant, no installs

Works in any modern browser. Share a link and you're chatting in seconds — no app stores, no updates, no waiting.

How it works

1

Create a session

Your browser generates a join secret and X25519 identity locally, derives the session ID client-side, and encrypts the private key into sessionStorage.

2

Share the link

The session can create a one-time /j/<token> invite for easy sharing, while the underlying capability stays in the URL fragment and is only ever kept in server memory until first use or expiry.

3

Chat securely

A 3-message Noise_XX handshake bootstraps the Signal Double Ratchet, so chats get authenticated end-to-end encryption with forward secrecy and optional direct P2P when Privacy Mode is off.

How we compare

Most messaging apps need your phone number just to say hello. We don't.

sendit.chat WhatsApp Telegram Signal
No account or phone number
No app install needed ~
Messages never stored
E2E encrypted by default
Server is fully blind to content
Open source ~

🔒 All messages and files are protected by a Noise_XX + Signal Double Ratchet stack (X25519 + HKDF-SHA256 + ChaCha20-Poly1305, with AES-256-GCM protecting stored private keys). The server only relays encrypted blobs and temporary invite tokens — it never has the chat keys.

🔑 Server Public Key Transparency

The server generates an Ed25519 signing key pair at startup and uses it to sign the SHA-384 script-integrity manifest. Comparing the public key below against the one published in the source repository lets you independently verify that this server is running genuine, unmodified code. A substituted malicious server would show a different key. The machine-readable JSON is available at /.well-known/pubkey. ⚠ Key is ephemeral (regenerated on restart). Set SERVER_SIGNING_KEY for a stable, pinnable key.

Ed25519 public key 770512fb2f93d4b4583faea5df73980ec8a13e995a39b1d403af7330f0a4bcb7
Signature over script hashes c7e0861d9fecaf55a8650ebe3b7019c653f0ebe995907027881c3b8bc54612207811b08536d73579e10c422e8f57eac3f51380523dc53bd04ca142f14e84410c

🔍 Script Integrity Verification

Every session script is protected by a SHA-384 Subresource Integrity hash. Your browser enforces these hashes automatically — any script that does not match is blocked before it can run. To independently detect a compromised server, compare the hashes below against the /.well-known/sri.json endpoint or the reference values published in the source repository.

Script SHA-384 integrity hash
js/socket.io.min.js sha384-2huaZvOR9iDzHqslqwpR87isEmrfxqyWOF7hr7BY6KG0+hVKLoEXMPUJw3ynWuhO
js/qr-creator.min.js sha384-cmmVU8dn+rGH6Yvlt0Q1+31iG9lS4wdVsqV/ZP/53RBddef+VZcYakA+NhG4S8wE
js/noble-bundle.js sha384-5Ebee1TT4HsgIqMOhDJRWdKOqeD4jWEfN/2hOfFkzc46I29kXcDB/EtqDqz9jaHb
js/noise.js sha384-9kGQ0g7mwTbaR7FjCU/EoUUti6tBf9tLPYoaFvjSthRKB+59aO7xwGG7H029Kalt
js/ratchet.js sha384-qHzLumbwrhKZxELTEVp/UnzvciLzBmkmzIvehTPGImohd4ZwJpo9v1U2xHB5pG50
js/crypto.js sha384-OjLZ7A5d53zeDS5E5iv1/qPGxENEP2dzTOmT9ft2cSSurhtjy9IdcXBf4uzhSARz
js/session.js sha384-Y6GU1N5stzRu5zfiLojx+joDl3mThj3dtWvDmE5GRFuBZkLwnSPzlWeLCvK9A636

Advertisements

Ads help fund sendit.chat, but we keep them on the public landing page only — never inside private chat sessions — and separate them from the app’s buttons and join controls.