Your secret is never stored. Not encrypted at rest — never written.
Where the encryption happens
In your browser, before anything is sent. The page uses the cryptography built into the browser itself: the two devices agree on a key between themselves, and the secret is encrypted on yours and decrypted on theirs.
What our server receives is two public keys — which are public by definition — and a block of encrypted bytes it has no key for. It is a relay, not a keeper: there is no copy of the key here to lose, to leak, or to hand over to anyone who asks for it.
Step by step
- Alice opens a room. Her browser creates a key pair on the spot. Not even the public half is sent to us yet: only a fingerprint of it, which binds her to that key without showing it. The room is created in memory.
- Bob follows the link. His browser makes a key pair of its own and sends us its public half, and is handed Alice's fingerprint. Only once Bob's key is in the room does Alice's browser send its own public key, and Bob's browser checks it against the fingerprint. The order matters: a server that held both keys before showing either side anything could search for two keys of its own that make both screens show the same symbols. With Alice's key bound in advance and revealed last, it has nothing to search against.
- The two browsers agree on a key. Holding their own private key and the other's public one, both work out the same shared secret — and that secret never travels. From it they derive the key that will encrypt the secret. The derivation also folds in the room and both public keys, so if anything in the middle had swapped a key, the two sides would end up with different results.
- Four symbols, and a person to check them. Four bytes of that derivation are not used as a key: they become the four symbols on both screens. Someone sitting in the middle can only build two separate sessions, so the two screens would disagree — which is why this is the one step we never let you skip. Once you both confirm, the room is ready.
- The secret is encrypted where it is written. The browser holding it encrypts it, and what reaches us is a block we have no key for. We check it is not oversized and keep it in memory, attached to the room.
- Picked up once, then gone. The other browser collects it, and the moment it leaves, the memory holding it is overwritten with zeroes and the room is burned: the link stops working. If nobody ever collects it, the same happens by itself when the room expires a couple of minutes later. The receiving browser then decrypts it and shows it.
Up to 8 KB
A password, a key, a PEM, a short config: that is what this is for. Anything larger is refused, because a service that carries files is a different thing with different costs and different abuse.
What we guarantee
- The readable secret never exists on the server, at any moment.
- Nothing is written to disk: no database, no queue, no log of what you sent.
- We do not hold the key and cannot work it out: we only ever see public keys.
- The link carries no secret, so it is safe to paste in a chat.
What we cannot promise
- A compromised server could serve modified JavaScript that leaks the key. This is true of every end-to-end web app. The answer is to run your own copy.
- Your browser is inside the circle, not outside it. An extension that can read the page, or a computer somebody else controls, sees the secret exactly as you do — nothing this page encrypts can help with that. The terminal client has no extensions.
- The person receiving it can screenshot it or paste it anywhere.
- The readable secret does sit in both browsers' memory while you use the page.
- We see two IP addresses. Run your own copy and even those stay with you.
Why the words are in English
The symbol is the real value; the word under it only gives the two of you one agreed way to say it out loud. It stays in English for everyone, so that two people never end up reading each other different words for the same picture.
Comparing the symbols in a chat
If what worries you is that Slack keeps things forever — the usual case — comparing the symbols inside Slack is fine: the secret itself never goes there.
If what worries you is that someone is inside Slack reading, compare them somewhere else: whoever can see the link can also stage the comparison.
Why you should not simply trust us
Every promise on this page is invisible from the outside. So the code is open, it is small enough to read in an afternoon, and you can check for yourself that it never writes anything down. If you would rather not take our word for it, run your own instance: it is one binary, no database, no external service.