The lifecycle, at a glance

Write the secret
Locked instantly, on your device
Stored as scrambled data only
Link + key sent two separate ways
Recipient unlocks it
Shown once, then gone for good

Step by step

Someone writes a secret message in their browser.

Nothing is transmitted anywhere yet.

Message composed client-side only

Behind the scenes, the browser quietly creates five random "codes."

Ouh — this part: a record number, two secret codes, and two supporting values, all generated instantly on your device.

Message ID, URL Secret, Challenge Secret, KDF salt, IV — 96 to 256 bits each

Before it leaves the device, the browser locks the message.

Like sealing a letter in a tamper-proof envelope only the right key can open.

AES-256-GCM, performed in-browser via the Web Crypto API

The lock actually needs two separate keys, not one.

Like a safe deposit box that needs both a bank key and a customer key together — and those two secrets get turned into two different working keys, one for locking and a completely separate one just for proving identity later.

Two keys derived via HKDF-SHA-256, domain-separated so neither can do the other's job

Only the sealed envelope is sent to the server.

Never the original message, never either key.

Only ciphertext, an IV, and a one-time proof are POSTed

The server stores the sealed envelope, nothing more.

Even someone with full database access would only find scrambled, unreadable data.

Ciphertext-only storage via parameterized queries

The sender gets a link and a separate Challenge Key.

Meant to travel through two different channels — the link by email, the key by text, for example.

URL Secret lives in the link's fragment, never sent to any server

The recipient's browser combines both pieces to unlock it.

Without ever sending anything unlockable anywhere.

Keys re-derived locally via HKDF; no server round-trip needed first

The server checks a one-time proof, then deletes its copy instantly.

In the same instant it confirms the proof is correct.

Atomic transaction: lock, verify in constant time, delete, then respond

The recipient's browser unlocks and displays the message, once.

Refreshing the page, or trying the link again, brings back nothing.

Client-side decryption; the database row no longer exists
The one-sentence version: the server only ever handles a locked box it cannot open, and the moment the right person opens it, the box is destroyed — so there is never a point in time where the message exists, readable, anywhere outside the two browsers involved.