Documentation

Ephemera documentation

How end-to-end encryption, rooms, messaging and expiry work under the hood, and what Ephemera deliberately doesn't do yet.

How the encryption works

The two devices in a room negotiate an AES-256-GCM session key themselves, using ephemeral ECDH on curve P-256. Each device generates a fresh key pair, commits to a hash of its public key and a random nonce, then reveals the actual key and nonce — the commit-then-reveal order stops a malicious relay from grinding a keypair that would reproduce an expected result after seeing the other side's key first. Both sides then run the shared ECDH output through HKDF-SHA256 (salted with the room ID, bound to both public keys) to derive the actual session key. The server relays public keys and commitments — both meaningless to an eavesdropper — and never sees the shared secret or the resulting key.

Every message and image is sealed with that key using AES-256-GCM before it leaves your device, with a fresh random IV per message and the room ID bound in as additional authenticated data (so a ciphertext can't be replayed into a different room). The server's WebSocket handler only accepts handshake frames and encrypted envelopes — a plaintext text or image message is rejected outright, which is what makes end-to-end encryption a property of the protocol rather than a client-side convention.

Both devices display a short safety code derived from the two agreed public keys. Comparing it (read one aloud, or look at both screens) confirms the handshake wasn't intercepted — if a relay substituted its own keys toward either side, the resulting safety codes would differ. Keys are ephemeral per room and never stored, so a key recovered later cannot decrypt an earlier conversation.

How rooms work

Creating a room requests a short room code from the server. Anyone with that code — or a direct /r/<room-id> link, which auto-joins — can enter the same room. Everyone connected to a room communicates over a shared WebSocket connection, so encrypted text and images sent by one participant appear instantly for everyone else in the room.

What you can send

  • Text messages, delivered instantly to everyone in the room.
  • Images up to 2 MB. Click a shared image to open a full-view preview, then copy or download it from there.

Only images are supported — there is currently no support for other file types.

Room lifecycle

LimitValue
Maximum active rooms, system-wide3
Image size limit2 MB
Empty room cleanup~2 minutes after the last participant leaves
Inactive/unused room registry entryexpires after ~10 minutes

Because the system currently allows only 3 active rooms at once, you may occasionally see a capacity message when trying to create a new room. This is a deliberate constraint of the current MVP, not a bug.

What happens if you lose a room code

There is no recovery flow. Ephemera has no accounts, no room directory, and no admin access — by design, since adding any of those would work against the goal of a zero-sign-in, fully ephemeral tool. If you forget a code:

  1. Ask another participant still in the room to share the code or room link again.
  2. If nobody has it, create a new room.
  3. If the system is at capacity, wait a few minutes for an abandoned room to expire.

Known limitations

  • No forced verification — the safety code detects a tampered handshake, but nothing requires participants to actually compare it.
  • No authentication or identity — anyone with a room's code can join it, and the safety code confirms a shared key, not who's holding the other device.
  • No persistent message history.
  • No room recovery if a code is lost.
  • Images only — no other file types.
  • Image "copy to clipboard" depends on browser support and secure-context rules, so it may not work in every browser.

Source

Ephemera's source is not currently public. If that changes, this page will link to it.

Related

Back to the product page, release notes, or privacy details.

Product overview Changelog Privacy policy