Skip to content
POOF docs usepoof.chat Create a room

understand

  • Start here
  • Philosophy
  • How a room works
  • Super Rooms & tokens

explore

  • The quantum problem
  • Harvest now, decrypt later
  • Post-quantum & hybrid keys
  • Quantum Lab

verify

  • Security architecture
  • Data lifecycle
  • Threat model
  • Verify it yourself
  • Responsible disclosure

build

  • Developer guide

reference

  • Glossary
  • FAQ

Poof documentation

A chatroom that forgets.

Poof is a private chatroom that lives in a browser tab. No account, no phone number, no email. You open a room, share it, talk. When the timer runs out, the room is gone. Poof.

These docs explain what Poof is, why it exists, how it works, what it protects you from, what it does not, and how you can check every claim yourself.

Poof at a glance

WhatDetails
IdentityNone. No accounts, no email, no phone number, no username.
Classic Room10 minutes, 2 people, text. Free.
Super Room1 hour or 24 hours, up to 10 people, file sharing. Unlocked by burning Poof tokens. More
JoiningA link, a QR code or a four-word phrase.
EncryptionEnd-to-end, in your browser: AES-GCM-256 with a hybrid key (classical + ML-KEM-768). More
TransportDirectly between browsers over WebRTC. Poof's servers never carry your messages.
StorageNo messages are stored anywhere. Room state on the server expires on its own. More
TransparencyOpen source, with builds you can verify. More

Read at your own depth

  1. Understand. What Poof is and why. Philosophy, How a room works, Super Rooms & tokens.
  2. Explore. Why quantum computers matter to a chat app. The quantum problem, Harvest now, decrypt later, Post-quantum & hybrid keys, Quantum Lab.
  3. Verify. How it is protected, and how to check. Security architecture, Data lifecycle, Threat model, Verify it yourself.
  4. Build. The protocol, step by step. Developer guide.
nextPhilosophy
The HostOpens the door, then gets out of the way.

on this page

  • Poof at a glance
  • Read at your own depth

About & philosophy

Less data, by design.

Privacy is not only about hiding information. It is also about reducing how much information exists in the first place.

Storage is cheap, so most of the internet keeps everything, just in case. Every message, contact list and login stays on someone's server for years. Each of those copies is something that has to be protected, forever.

MORE DATA ──▶ MORE STORAGE ──▶ MORE METADATA ──▶ MORE ATTACK SURFACE ──▶ MORE TO PROTECT, FOREVER

Poof starts from the opposite default. A conversation exists for as long as people are having it, and not much longer.

LESS DATA ──▶ LESS RETENTION ──▶ SMALLER ATTACK SURFACE ──▶ LESS LONG-TERM EXPOSURE

Honest footnote

Keeping less does not make a system secure on its own. It removes some risks completely: a breached database, a subpoena for old messages, someone decrypting an archive years from now. Other risks stay exactly where they were, like a compromised phone or someone taking a screenshot. The threat model lists both.

Privacy is not the same as security

IdeaThe question it answers
PrivacyWho can learn things about me?
SecurityCan someone without permission read or change my data?
ConfidentialityWho can read the content?
IntegrityCould it be changed without anyone noticing?
AuthenticityCan I tell who really sent it?
AnonymityCan this activity be tied to a real person?
EphemeralityHow long does any of it exist?

Poof is built around confidentiality and ephemerality. It helps with privacy because it never asks who you are. It is not an anonymity tool on its own: the network still sees which IP addresses connect, and when.

Create, use, expire, poof Concept

Grass grows, exists for a season, then returns to the soil. Nothing about it is meant to last forever, and that is not a flaw. Poof treats a conversation the same way.

NATURE                      POOF
──────                      ────
seed            ──▶         create room
grow            ──▶         people join
exist           ──▶         messages are used
change          ──▶         timer runs down
return          ──▶         room state disappears · poof

An analogy, not a security proof. What actually expires, and where, is described in Data lifecycle.

Why “Poof”?

Because that is what the room does at the end.

previousStart herenextHow a room works
The SleeperShows up whenever something has expired.

on this page

  • Privacy is not the same as security
  • Create, use, expire, poof
  • Why “Poof”?

How it works

The life of a room.

From the moment you press “Create a room” to the moment it disappears.

  YOU                          POOF SERVER                       GUEST
   │                                │                              │
   │  1  create room ──────────────▶│  room id + expiry, in memory │
   │  2  your browser makes the     │                              │
   │     room key (never sent)      │                              │
   │  3  share: link · QR · 4 words ─────────────────────────────▶ │
   │◀──── 4  signaling relay: "how to reach each other" ─────────▶│
   │                                │   (no keys, no messages)     │
   │◀═══════════ 5  direct encrypted channel (WebRTC) ═══════════▶│
   │◀═══════════ 6  post-quantum upgrade (ML-KEM-768) ═══════════▶│
   │◀═══════════ 7  talk: every message encrypted in-browser ════▶│
   │                                │                              │
   │                8  timer ends ─▶ room state expires ─▶ poof

1–2 · Creating a room

Your browser asks Poof's server for a new room. The server records two things in memory only, with an expiry equal to the room lifetime: that the room exists and when it ends. Meanwhile your browser generates a random 256-bit room key with the Web Crypto API. The key goes into the part of the link after the #, the fragment. Browsers never send the fragment to servers, so Poof's server never receives it.

3 · Sharing it

MethodHowTrade-off
LinkSend the full link through a channel you trust.The key travels inside the link. Anyone who sees the link can join, so share it privately.
QR codeYour guest scans your screen in person.The key never touches the network.
Four wordsRead a phrase like amber otter quiet lantern over a call.Four everyday words, picked at random from a list of 2,048. Your browser turns the phrase into a key (PBKDF2 with SHA-256) and uses it to lock the room link. Poof keeps only the locked copy, filed under a one-way hash of the phrase. The first person to use it opens it, and then it's gone. Unused, it disappears after 3 minutes. Don't reuse a phrase as a password.

4–6 · Connecting

To find each other, the browsers exchange connection details through Poof's server (“signaling”). The server passes them along without storing them. Once a direct WebRTC data channel is open, the browsers run a post-quantum key exchange directly between themselves and combine the result with the room key. From then on, messages are protected by both. If a direct path is impossible, traffic goes through a relay that forwards encrypted data without being able to read it.

You can follow it in the room: waiting → connected → sealed. Messages are only sent once the room is sealed.

7 · Talking

Each message is encrypted in your browser with AES-GCM-256 and a fresh random 96-bit IV, then sent over the data channel. Poof's servers are not on the message path.

8 · Poof

When someone leaves, the conversation is wiped from the other person's screen immediately and their input is disabled. When the timer ends, the server's record of the room expires on its own, and opening the link again only shows that the room no longer exists. There is nothing to recover.

What the server knows

SeesNever sees
That a room exists and when it expiresThe room key
IP addresses of browsers while they connectMessages or files
Roughly when people connectNames, emails, phone numbers (there are none)
previousPhilosophynextSuper Rooms & tokens
The KeeperHolds the keys. Never hands them to the server.

on this page

  • 1–2 · Creating a room
  • 3 · Sharing it
  • 4–6 · Connecting
  • 7 · Talking
  • 8 · Poof
  • What the server knows

Rooms

When ten minutes isn't enough.

Every room has the same privacy architecture. A Super Room just gives the conversation more room to breathe.

Classic RoomSuper Room
Lifetime10 minutes1 hour or 24 hours
People2Up to 10
MessagingTextText and files
EncryptionHybrid post-quantum, end-to-endHybrid post-quantum, end-to-end
CostFreePoof tokens

How a group stays private

In a Super Room every message is still encrypted in the sender's browser and opened only in the other participants' browsers, with the same hybrid post-quantum protection as a Classic Room. No server ever holds a group key or sees content. The room's size limit is enforced, so nobody can squeeze in once it's full.

Files

Files travel over their own encrypted channel, cut into small pieces that are each locked before they leave your browser. Poof never sees a file's name, type or contents. Direct connections allow larger files than connections that need the relay.

Why tokens, not accounts

Poof doesn't need to know who you are to give you more. Instead of signing up and paying from a profile, you burn a Poof token when you create a Super Room.

Tokens use blind signatures. After you pay, your browser “blinds” a token and Poof signs it without seeing it (RSA blind signature). Your browser then unblinds it. When you spend it, Poof can check its own signature, but it has never seen that token before, so it cannot link the payment to the room or to you. Each token works exactly once.

TOKENS ──▶ BURN ──▶ SUPER ROOM ──▶ TIMER ENDS ──▶ POOF
   │                     │
   └── no account,       └── same encryption,
       no profile            same nothing-kept

Prices for the 1-hour and 24-hour options are shown when you create a Super Room.

previousHow a room worksnextThe quantum problem
Super Room unlockedMore time, more people. Same privacy.

on this page

  • How a group stays private
  • Files
  • Why tokens, not accounts

Quantum, part 1

What happens to today's secrets when tomorrow's computers arrive?

Encryption is a bet that some maths problems are too hard to solve. Quantum computers change which problems are hard. This page explains how, without the hype.

Bits and qubits

A normal bit is 0 or 1. A qubit can be in a combination of both, called superposition, until you measure it, and then it becomes a plain 0 or 1. Quantum algorithms use quantum gates to arrange those combinations so that wrong answers cancel out and right answers become likely when you measure. That is not “trying every answer at once”. It only helps for problems with special structure. Try it in the Quantum Lab.

Two kinds of encryption, two kinds of risk

Public-key cryptography (RSA, elliptic curves, ECDH key exchange, digital signatures) lets two strangers agree on a secret. It relies on problems like factoring large numbers or computing discrete logarithms. Symmetric cryptography (AES) encrypts the actual data once both sides share a key. It relies on the key simply being too big to guess.

          CLASSICAL COMPUTER                       QUANTUM COMPUTER
                  │                                        │
         ┌────────▼────────┐                     ┌─────────▼─────────┐
         │  RSA · ECC      │                     │  Shor's algorithm  │
         │  factoring /    │                     │  factoring and     │
         │  discrete logs  │                     │  discrete logs     │
         └────────┬────────┘                     └─────────┬─────────┘
                  ▼                                        ▼
        impractical to solve                 solvable, on a large enough
                                             error-corrected machine

A picture of the idea, not a description of how Shor's algorithm works inside. Concept

AlgorithmUsed forQuantum attackEffect
RSAKey exchange, signaturesShorBroken by a large enough quantum computer
ECDH, ECDSA, Ed25519Key exchange, signaturesShorBroken by a large enough quantum computer
AES-256Encrypting dataGroverWeakened (roughly the strength of a 128-bit key). Still considered strong.
SHA-256HashingGrover-typeMargins shrink, still considered safe for most uses

So the weak spot is the handshake

The data itself (AES-256) holds up well. The vulnerable moment is when two parties agree on a key with RSA or elliptic curves. If someone can later recover that key exchange, they can unlock everything it protected.

Today vs tomorrow

No quantum computer is publicly known to break RSA or elliptic-curve keys at the sizes used on the internet. That would take a large, error-corrected machine, often called a “cryptographically relevant quantum computer”. Nobody can give a reliable date for one. The reason to act now anyway is on the next page.

previousSuper Rooms & tokensnextHarvest now, decrypt later
The WatcherLooks at threats before they arrive.

on this page

  • Bits and qubits
  • Two kinds of encryption, two kinds of risk
  • So the weak spot is the handshake

Quantum, part 2

Harvest now, decrypt later.

You do not need a quantum computer today to attack today's messages. You only need to record them and wait.

TODAY                                         SOMEDAY
─────                                         ───────
encrypted traffic                             quantum capability
      │                                              │
      ▼                                              ▼
┌──────────────┐   store   ┌──────────────┐   ┌──────────────────┐
│   attacker   │ ────────▶ │  encrypted   │──▶│ try to recover   │
│ records it   │           │   archive    │   │ the key exchange │
└──────────────┘           └──────────────┘   └──────────────────┘

Anyone who can watch a network (an internet provider, a compromised router, a state agency) can save encrypted traffic cheaply and keep it for years. If that traffic relied only on RSA or elliptic-curve key exchange, a future quantum computer could unlock it. For conversations that must stay private for a long time, the risk starts the day they are recorded.

How Poof answers it

  MINIMIZE WHAT EXISTS          nothing stored on servers, rooms expire
+ HYBRID POST-QUANTUM KEYS      classical key + ML-KEM-768
+ FRESH KEYS PER ROOM           each room gets new keys, then they're gone
+ KEYS STAY IN THE BROWSER      the server never holds them
──────────────────────────
= LESS LONG-TERM EXPOSURE

Ephemerality alone is not enough. Poof deleting things does not stop someone else from recording traffic on the network. That is why the encryption itself holds up against future quantum attacks, which is the job of the hybrid post-quantum key. See it play out in the Quantum Lab.

What this does not solve

  • A compromised device. If your phone or browser is infected, messages can be read before they are encrypted.
  • The link. The classical half of the key travels in the room link. Someone who captured the link and broke the post-quantum exchange could read the room. Both are needed.
  • Metadata. A recorder still sees that two IP addresses talked, when, and for how long.
previousThe quantum problemnextPost-quantum & hybrid keys
The WorkerDoes the boring work today so the future can’t undo it.

on this page

  • How Poof answers it
  • What this does not solve

Quantum, part 3

Two locks on every room.

Post-quantum cryptography is ordinary software that runs on today's devices, built on maths problems believed to be hard even for quantum computers.

The NIST standards

In 2024 the U.S. National Institute of Standards and Technology published the first post-quantum standards:

StandardNameJobBased on
FIPS 203ML-KEMAgreeing on a shared keyModule lattices
FIPS 204ML-DSADigital signaturesModule lattices
FIPS 205SLH-DSADigital signaturesHash functions only

Poof uses ML-KEM-768 for its key exchange.

What a KEM does Concept

A key encapsulation mechanism works like a lockbox. Your guest publishes an open padlock (public key). You put a random secret in a box, snap the padlock shut and send it (ciphertext). Only your guest has the key that opens it. Now you both share the same secret, and anyone who watched only saw a locked box.

ML-KEM-768 in numbers

ItemML-KEM-768For comparison: X25519
Public key1,184 bytes32 bytes
Ciphertext1,088 bytes32 bytes
Shared secret32 bytes32 bytes
Security levelNIST category 3Not quantum-resistant

The keys are bigger, but for a chat handshake a couple of kilobytes, once per room, makes no noticeable difference.

Why hybrid

Post-quantum algorithms are newer than RSA or elliptic curves. A hybrid design does not bet everything on one of them: it combines a classical secret with a post-quantum one, so an attacker has to break both.

  ROOM KEY (classical)                    ML-KEM-768 SHARED SECRET
  256-bit, made in your browser,          agreed directly between browsers
  carried in the link after #             over the encrypted data channel
            │                                         │
            └──────────────┐          ┌───────────────┘
                           ▼          ▼
                     ┌────────────────────┐
                     │    HKDF-SHA-256    │  one fixed, labelled derivation
                     └─────────┬──────────┘
                               ▼
                 HYBRID SESSION KEY · AES-GCM-256
                 used for every message in the room

The room key is the HKDF salt, the ML-KEM shared secret is the input key material, and a fixed, versioned Poof context string keeps the derivation separate from anything else. Before switching, both browsers prove they hold the same post-quantum secret with an HMAC-SHA-256, each side using its own label, so a confirmation can't simply be bounced back. Only then does the room use the hybrid key. A tampered handshake fails this check and the room refuses to upgrade.

Implementation notes

  • In the browser. Browsers don't ship ML-KEM natively yet, so Poof uses the browser's built-in ML-KEM-768 where it exists, and otherwise a pinned open-source implementation shipped with the app itself, never fetched from a third-party server at runtime. AES-GCM, HKDF and HMAC come from the browser's own Web Crypto API.
  • Side channels. Secret-dependent operations run in constant-time implementations.
  • Signatures. Poof does not use post-quantum signatures. Room integrity comes from the shared keys and key confirmation, not from long-term identities.
previousHarvest now, decrypt laternextQuantum Lab
Hybrid key confirmedBoth halves agree. The room switches over.

on this page

  • The NIST standards
  • What a KEM does
  • ML-KEM-768 in numbers
  • Why hybrid
  • Implementation notes

Quantum Lab Concept

Play with the ideas.

Three small experiments that make the quantum chapters tangible. They are teaching models, not simulations of real hardware or of Poof's code.

1 · A qubit, measured

|0⟩
|1⟩

Before measurement the qubit holds both possibilities. Each measurement gives a plain 0 or 1, and the pattern of results reveals the probabilities.

2 · Two locks

The session key comes from both secrets. Knowing one of them is not enough.

3 · Harvest now, decrypt later

Recorded conversationStatus
Classical key exchange only (RSA / ECDH)
Poof: hybrid key (classical + ML-KEM-768)
Copies on Poof's servers

You choose the year. Nobody can reliably predict it, which is exactly why protection has to be in place before it.

previousPost-quantum & hybrid keysnextSecurity architecture
The WorkerRuns the experiments so you don’t have to.

on this page

  • 1 · A qubit, measured
  • 2 · Two locks
  • 3 · Harvest now, decrypt later

Security

Every lock, and what it rests on.

For each protection: the threat it answers, the mechanism, what has to be true for it to work, and where it stops.

┌─────────────────────── YOUR BROWSER ───────────────────────┐
│  room key (Web Crypto)  ─┐                                  │
│                          ├─▶ HKDF ─▶ session key ─▶ AES-GCM │──┐
│  ML-KEM-768 secret  ─────┘                                  │  │ ciphertext only
└─────────────────────────────────────────────────────────────┘  │
        │ signaling (no keys, no content)                         ▼
┌───────▼────────┐                                   ┌────────────────────┐
│  POOF SERVER   │  room id + expiry, in memory      │ WebRTC data channel│
│  no message    │                                   │ direct, or via a   │
│  storage       │                                   │ TURN relay         │
└────────────────┘                                   └────────────────────┘
ProtectionThreatMechanismAssumptionLimitation
End-to-end encryptionServers or networks reading messagesAES-GCM-256 in the browser, fresh nonce per messageYour browser and device are not compromisedDoesn't protect what's on screen
Key in the fragmentThe server learning the keyKey lives after #, never sent in requestsThe code you run is genuineAnyone with the link has the key
Hybrid post-quantum keyRecorded traffic decrypted laterRoom key + ML-KEM-768 via HKDF-SHA-256At least one of the two stays secretMetadata stays visible to recorders
Key confirmationTampering with the handshakeMutual HMAC-SHA-256 check with per-side labels before switching keysThe room link reached the right personA leaked link lets someone join instead
Ephemeral stateOld data leaking laterRoom state lives only in memory, with an expiry; no message storageServer configuration as publishedCan't erase copies someone else made
No-log productionLogs revealing who talked to whomLogging switched off in production; links never leak through the Referer headerHosting layers follow the same policyNetwork providers keep their own logs
Hardened pageInjected scripts stealing keysStrict Content Security Policy with one-time nonces; the page can't be embedded in other sitesBrowser enforces CSPA malicious extension sits outside CSP
Relay (TURN)Networks that block direct connectionsRelay access with short-lived credentials, over TLSRelay only forwardsRelay sees IP addresses and volume
Four-word phraseGuessing the phrasePhrase-derived key (PBKDF2), hashed lookup, works once, gone after 3 minutesPhrase used within minutesShort phrases are not long-term secrets
previousQuantum LabnextData lifecycle
The KeeperKnows exactly what each lock protects.

Where does data go?

Everything Poof touches, and when it's gone.

CREATE ──▶ PROCESS ──▶ TRANSMIT ──▶ USE ──▶ EXPIRE ──▶ DELETE ──▶ POOF
DataCreatedLives inHow longThen
Room id + expiryWhen you create a roomServer memoryThe room lifetime (10 min, 1 h or 24 h)Expires automatically
Room keyIn your browserThe link fragment, browser memoryWhile the tab is openGone when the tab closes
ML-KEM keys and secretIn each browser, per connectionBrowser memoryThe handshakeDiscarded after the session key is derived
Session keyAfter key confirmationBrowser memoryThe roomGone when the room ends
MessagesWhen you typeYour screen and your guest'sThe roomWiped from the page when the room ends
FilesWhen you send oneSender and receiver browsersUntil saved or the room endsNever touch Poof's servers
Four-word phrase blobWhen you show a phraseServer memory, encryptedUp to 3 minutes, or one readDeleted after retrieval or expiry
IP addressesWhen browsers connectConnection handling, TURN relayOnly while connecting; Poof doesn't log themNot stored
BackupsNone. Room state only ever exists in memory, so there is nothing to back up.

What Poof can't erase

Screenshots, copied text, files your guest saved, and logs kept by internet providers along the way. Ephemerality covers what Poof controls.

previousSecurity architecturenextThreat model
The SleeperWaits for the timer. Then nothing is left.

Threat model

Who can learn what.

A security promise is only useful if it says who it protects you from, and who it doesn't.

Protects against

  • Poof's own servers reading your messages
  • Network eavesdroppers reading content
  • Old servers or databases leaking conversations later
  • Recorded traffic being decrypted by a future quantum computer (both keys needed)

Does not protect against

  • A compromised phone, computer or browser extension
  • The person you are talking to (screenshots, copying)
  • Someone who gets the room link or phrase
  • Network observers seeing that you connected, and when

Attacker by attacker

AttackerCan learnCannot learn
Passive network observerThat you use Poof, timing, traffic sizeMessage content
Active network attackerThe same, and can block connectionsContent. Tampering fails key confirmation.
Malicious or hacked Poof serverRoom ids, IP addresses, timing. Could serve altered code.Content, as long as the code you run is genuine (see Verify)
Compromised TURN relayIP addresses, traffic volumeContent
Malicious guestEverything you send themNothing protects you here
Malware or bad browser extensionEverything on screenNothing protects you here
Future quantum attacker with recordingsMetadataContent, unless they also captured the room link and broke ML-KEM

The web-app problem

Any website can be changed by whoever runs the server. In theory, a compromised server could send you code that leaks your key. Poof's answer is to make the running code checkable: open source, reproducible builds and signed attestations, so a change can't go unnoticed. See Verify it yourself.

previousData lifecyclenextVerify it yourself
The SkepticAppears wherever we tell you what Poof can’t do.

on this page

  • Attacker by attacker
  • The web-app problem

Transparency

Don't trust the docs. Check the code.

Every claim on these pages points to something you can inspect.

ClaimEvidenceHow to check
The key never reaches the serverHow browsers handle the # fragmentDevTools → Network: requests contain no #…
Messages are end-to-end encryptedThe crypto module in the sourceRead it; the data channel carries only ciphertext
Post-quantum key exchangeThe ML-KEM-768 implementation in the sourceCheck the dependency and its tests
Nothing is storedServer configuration, expiry settingsRead the config and the code paths
The site runs the published codeReproducible build and signed checksums for every releaseSee the commands below
Open sourceThe public repository (linked in the site footer)Read it

Check the build

Poof's build is reproducible: the same source always produces the same files, byte for byte. Every release publishes the checksums of what's served, signed by the build system, so you can check that usepoof.chat is running exactly the published code.

1  download the signed checksums from the latest release
2  verify the signature with GitHub's CLI:  gh attestation verify
3  hash the files your browser loaded and compare

Try one right now

You can check the first claim without trusting Poof. It is how every browser works:

  1. Open any link with a #something at the end.
  2. Open DevTools (F12) → Network and reload.
  3. Look at the request URL. Everything after # is missing. It never left your browser.
previousThreat modelnextResponsible disclosure
The WorkerShows the receipts.

on this page

  • Check the build
  • Try one right now

Security reports

Found something? Tell us first.

If you believe you've found a security issue in Poof, we want to hear about it, privately, before anyone else does.

How to report

  • Email security@usepoof.chat with a description, steps to reproduce and the impact you expect.
  • Please don't test against other people's rooms, and don't publish details until we've had time to fix it.
  • Include your PGP key if you'd like an encrypted reply.
  • We acknowledge every report within 48 hours, assess severity, agree a fix plan and coordinate the disclosure date with you. We credit reporters publicly if they wish.

Severity

LevelExamples
CriticalReading message content, recovering keys, bypassing end-to-end encryption
HighJoining rooms without the link or phrase, linking token payments to rooms
MediumMetadata leaks beyond what the threat model describes
LowHardening gaps without a direct impact

Safe harbour

We won't take legal action against good-faith research that avoids privacy violations, data destruction and service disruption, accesses no more than needed to show the issue, and gives us reasonable time to fix it before disclosure.

Out of scope

Attacks that need a compromised device or browser, social engineering, denial of service through volume, and issues in third-party services outside Poof's control.

previousVerify it yourselfnextDeveloper guide
Thank youEvery report makes the next room safer.

on this page

  • How to report
  • Severity
  • Safe harbour
  • Out of scope

For developers

The protocol, step by step.

How a Poof client talks to the server and to other clients. Read it next to the source.

Building blocks

LayerTechnology
TransportWebRTC (RTCPeerConnection + DataChannel)
SignalingWebSocket relay; connection details are passed through, never stored
Room stateIn-memory store with automatic expiry; no chat data, ever
ClientPlain browser JavaScript; nothing loaded from third-party servers at runtime
Classical cryptoWeb Crypto API: AES-GCM-256, HKDF-SHA-256, HMAC-SHA-256, PBKDF2
Post-quantumML-KEM-768 (FIPS 203)
NAT traversalSTUN + TURN over TLS

Handshake

CLIENT A (creator)                                   CLIENT B (guest)
──────────────────                                   ────────────────
key K = random 256 bits (fragment)                   reads K from fragment
        ── SDP offer / ICE via signaling ──────────────▶
        ◀──────────────── SDP answer / ICE ────────────
        ════════ data channel open (DTLS) ════════
(pk, sk) = ML-KEM.KeyGen()
  1 ── public key pk ─────────────────────────────────▶
                                                      (ct, ss) = ML-KEM.Encaps(pk)
                                                      cB = HMAC(ss, label_B)
  2 ◀──────────────────────── ciphertext ct + proof cB ──
ss = ML-KEM.Decaps(sk, ct)
check cB
  3 ── proof cA = HMAC(ss, label_A) ──────────────────▶  check cA
S = HKDF-SHA-256(salt = K, ikm = ss, info = poof context)   (both sides)
every message: AES-GCM(S, random 96-bit IV, plaintext)

If a confirmation fails, the upgrade is rejected and the room reports it instead of switching keys silently.

Message envelope

base64( IV (12 bytes) ‖ AES-GCM ciphertext + 16-byte tag )

files: each chunk = IV (12 bytes) ‖ ciphertext + tag

Example Concept

// Illustrative only: shows the order of operations, not the production API.
const K   = crypto.getRandomValues(new Uint8Array(32));        // room key
const kem = mlKem768KeyGen();                                   // post-quantum keypair
// ... exchange pk / ct over the data channel ...
const S   = await hkdf(K, sharedSecret, POOF_CONTEXT);        // session key
const msg = await aesGcmEncrypt(S, randomNonce(), "hello");

Running it locally

Clone the public repository (linked in the site footer) and follow its README: it lists the requirements and the two commands to start Poof on your machine. Open two browser windows on the local address and create a room between them; you'll see the handshake above happen in your browser's developer console.

previousResponsible disclosurenextGlossary
The WorkerReads the spec so you can read the code.

on this page

  • Building blocks
  • Handshake
  • Message envelope
  • Example
  • Running it locally

Reference

Glossary.

Every term in three steps: plain words, the technical version, and why it matters to Poof.

Qubit

simpleA bit that can be 0, 1, or a mix of both until measured.

technicalThe basic unit of quantum information, described by complex amplitudes; measurement yields a classical bit.

for poofLarge numbers of reliable qubits are what would threaten today's key exchanges.

Superposition

simpleBeing in a combination of states at once.

technicalA qubit state is a linear combination of basis states.

for poofIt's why quantum algorithms can do things classical ones can't, for some problems.

Entanglement

simpleQubits whose results are linked, however far apart.

technicalA joint state that can't be written as separate per-qubit states.

for poofA resource quantum algorithms rely on.

Quantum gate

simpleAn operation that changes qubits.

technicalA unitary transformation applied to one or more qubits.

for poofAlgorithms like Shor's are sequences of gates.

Physical vs logical qubit

simpleRaw hardware qubits vs error-corrected ones built from many of them.

technicalError correction encodes one logical qubit across many noisy physical qubits.

for poofBreaking RSA needs many logical qubits, which is why it isn't possible yet.

Quantum error correction

simpleFixing quantum errors without looking at the data.

technicalCodes that detect and correct errors on encoded qubits.

for poofThe main engineering hurdle between today's machines and dangerous ones.

Quantum advantage

simpleA quantum computer beating classical ones at some task.

technicalDemonstrations exist for specific, mostly artificial problems.

for poofNot the same as breaking encryption. Headlines often mix them up.

Shor's algorithm

simpleA quantum recipe for factoring and discrete logarithms.

technicalPolynomial-time algorithm for integer factorization and discrete log.

for poofBreaks RSA and elliptic-curve key exchange on a big enough machine.

Grover's algorithm

simpleA quantum speed-up for searching.

technicalQuadratic speedup for unstructured search.

for poofWeakens symmetric keys; AES-256 stays strong.

Post-quantum cryptography

simpleEncryption designed to resist quantum attacks, running on normal computers.

technicalSchemes based on problems like lattices or hash functions.

for poofPoof's handshake uses it (ML-KEM-768).

Quantum-safe

simpleExpected to hold up against quantum computers.

technicalInformal term; depends on assumptions and correct implementation.

for poofWe say “designed to resist”, never “unbreakable”.

Harvest now, decrypt later

simpleRecord encrypted data today, unlock it later.

technicalStore-and-wait attack against long-lived ciphertext.

for poofThe reason post-quantum matters before quantum computers exist.

KEM

simpleA way to agree on a shared secret using a public key.

technicalKey encapsulation mechanism: encapsulate / decapsulate.

for poofHow Poof's browsers agree on the post-quantum half of the key.

Lattice cryptography

simpleMaths based on hard problems in multi-dimensional grids.

technicalSecurity from problems like Module-LWE.

for poofThe foundation of ML-KEM and ML-DSA.

ML-KEM

simpleThe NIST-standard post-quantum key exchange.

technicalFIPS 203, module-lattice KEM; ML-KEM-768 is NIST category 3.

for poofPoof uses ML-KEM-768.

ML-DSA

simpleThe NIST-standard lattice signature scheme.

technicalFIPS 204.

for poofNot used by Poof.

SLH-DSA

simpleA signature scheme built only on hash functions.

technicalFIPS 205, stateless hash-based signatures.

for poofNot used by Poof.

Forward secrecy

simpleOld conversations stay safe even if a key leaks later.

technicalSession keys are ephemeral and not derivable from long-term keys.

for poofEach Poof room uses fresh keys that disappear with the room.

URL fragment

simpleThe part of a link after #.

technicalNot sent to the server in HTTP requests.

for poofWhere Poof keeps the classical room key.

WebRTC

simpleBrowser technology for direct connections.

technicalPeer-to-peer media and data channels with DTLS encryption.

for poofHow messages travel between browsers without Poof's servers.

TURN relay

simpleA fallback server that forwards traffic when a direct link fails.

technicalRelays packets; sees only encrypted payloads.

for poofLets rooms work behind strict networks.

HKDF

simpleA recipe for mixing secrets into a key.

technicalHMAC-based key derivation function (RFC 5869).

for poofCombines the classical and post-quantum secrets.

AES-GCM

simpleFast, standard encryption that also detects tampering.

technicalAuthenticated encryption with associated data.

for poofEncrypts every message in a room.

previousDeveloper guidenextFAQ

Reference

Questions.

29 short answers. Most link to a page with the full story.

What is Poof?

A private chatroom in your browser that doesn't ask who you are and disappears when the timer ends.

Why is it called Poof?

Because that's what the room does at the end.

What does ephemeral mean?

Temporary by design. Rooms have a fixed lifetime and nothing is kept after it.

Do I need an account?

No. No email, no phone number, no username. Ever.

How long does a room last?

Classic Rooms last 10 minutes. Super Rooms last 1 hour or 24 hours.

How many people can join?

Two in a Classic Room, up to ten in a Super Room.

How do I invite someone?

Send the link privately, show a QR code, or read out the four-word phrase.

Is the four-word phrase secure?

Yes, for what it's for: it works once and expires within minutes. Don't reuse it as a password.

Can Poof read my messages?

No. The key stays in your browser; Poof's servers never have it.

What does Poof's server know?

That a room exists, when it expires, and which IP addresses connected. Not what was said.

What is stored after a room ends?

Nothing about the conversation. See Data lifecycle.

Is Poof anonymous?

Not on its own. It never asks who you are, but networks can still see your IP address. Use Tor or a VPN if you need to hide that.

What's the difference between privacy and security?

Privacy is about who can learn things about you. Security is about whether data can be read or changed without permission. See Philosophy.

What is post-quantum cryptography?

Encryption designed to resist future quantum computers, running on today's devices.

Why should I care about quantum computers now?

Because traffic recorded today could be decrypted later. See Harvest now, decrypt later.

Can quantum computers decrypt messages today?

No machine is publicly known to be able to break today's key exchanges at real-world sizes.

What is Shor's algorithm?

A quantum algorithm that would break RSA and elliptic-curve key exchange on a large, error-corrected quantum computer.

What is ML-KEM?

The NIST-standard (FIPS 203) post-quantum way to agree on a key. Poof uses ML-KEM-768.

What is a KEM?

A key encapsulation mechanism: one side locks a random secret with the other side's public key.

Why hybrid instead of only post-quantum?

So an attacker has to break both a classical and a post-quantum secret. Neither alone is enough.

Can a hacked device still leak messages?

Yes. Encryption protects messages in transit, not on a compromised screen.

What if Poof's server is hacked?

It never has the keys. It could try to serve altered code, which is why builds are verifiable.

What if the relay (TURN) is compromised?

It only ever sees encrypted traffic and IP addresses.

Can the other person screenshot the chat?

Yes. No app can stop that.

Is Poof open source?

Yes. See Verify it yourself for the repository and how to check the build.

How can I verify the cryptography?

See Verify it yourself. Start with the # fragment check you can do right now.

What are Poof tokens?

What you burn to unlock a Super Room. No account, and the payment isn't linked to the room. See Super Rooms & tokens.

Is there mining or AI training?

No. Poof doesn't store conversations, so there's nothing to train on.

How do I report a security issue?

Privately, by email. See Responsible disclosure.

previousGlossary
Hi.Short answers. Links go deeper.