AnyTool
Your files never leave your device. All processing happens locally in your browser.

How do I send a self-destructing, burn-after-reading message?

Type your message into Self-Destruct Message and it is encrypted in your browser with AES-256-GCM. The ciphertext — with an optional expiry timestamp and a per-device view budget baked in — is packed into the link’s URL fragment (the part after #), which browsers never send to a server. When the recipient opens the link it decrypts locally, shows a live expiry countdown, and after it is read the tool hides it on that device so re-opening shows “already destroyed”. Everything runs 100% client-side with no backend, so the self-destruct is best-effort, not a server guarantee.

  • AES-256-GCM authenticated encryption via the Web Crypto API — random key or PBKDF2-HMAC-SHA-256 passphrase
  • The ciphertext rides in the URL #fragment, which is never transmitted to a server
  • Optional expiry (15 min–30 days) is embedded in the payload and checked by the reader with a live countdown
  • Burn-after-reading hides the message on a device after it is read; “burn now” clears it manually
  • Honest: with no backend the burn and expiry are enforced only in the reader’s browser, not by a server

What is

Self-destructing (burn-after-reading) message

A self-destructing message is a private note designed to become unavailable after it is read once or after an expiry time. This tool builds a no-backend version: it encrypts the message in the browser with AES-256-GCM and stores the whole ciphertext, plus an optional expiry timestamp and view budget, in the URL fragment (after the # symbol), which browsers never include in the HTTP request. The reader page decrypts locally, enforces the expiry with a client-side countdown, and writes a non-reversible fingerprint to localStorage so the message is hidden on that device after it is viewed. Because there is no server to store and delete the ciphertext, the “self-destruct” is best-effort and device-local rather than a true server-enforced burn.

Security & Privacy

Related terms

AES-256-GCMburn after readingone-time secretURL fragmentPBKDF2end-to-end encryptionephemeral messagePrivateBinOneTimeSecretzero-knowledgeexpiring link

Frequently Asked Questions

No. The message is encrypted in your browser and the ciphertext rides in the URL fragment, which browsers never send to a server.

Encryption happens entirely on your device with the browser’s Web Crypto API. The encrypted payload — including the optional expiry — is stored in the URL fragment, the part after the #, which browsers do not include in the HTTP request, servers and proxies do not log, and the Referer header strips. There is no backend, database, upload or CDN in the crypto path, and no analytics; the message lives only in the link and, briefly, the clipboard.

Best-effort only. With no backend the burn is enforced in the reader’s browser on the device that opened it — the same link still decrypts on another device.

A true burn-after-read needs a server to store the ciphertext and delete it after the first fetch. This tool has no server, so the encrypted message lives inside the link itself. After the recipient reads it, the tool writes a fingerprint to that browser’s localStorage and hides the message, so re-opening on the same device shows “already viewed and destroyed”. But anyone who still has the link (and passphrase) can decrypt it on a different device, or before it is ever opened. For guaranteed one-time access, use a hosted service such as onetimesecret.com or a self-hosted PrivateBin.

The expiry timestamp is encrypted into the link and checked by the reader’s clock. It is a client-side check, not a server-enforced deletion.

When you set an expiry, that timestamp is placed inside the encrypted payload before it becomes a link. The reader page decrypts it, compares it to the device’s clock, shows a live countdown while the message is valid, and refuses to display the message once the time has passed. Because there is no backend, nothing is actually deleted at expiry and a determined holder could ignore the check or set their clock back — treat it as a courtesy limit, not a security guarantee.

A random-key link opens instantly (the key is in the link); a passphrase link keeps the key out of the URL as a second factor you share separately.

In random-key mode a fresh 256-bit AES key is generated and packed into the link, so anyone with the full link can open it — treat the whole link as the secret. In passphrase mode the key is derived from a passphrase with PBKDF2-HMAC-SHA-256 and only the ciphertext is in the link; the recipient must also type the passphrase, which you send over a different channel. A leaked passphrase-mode link alone cannot be decrypted, so it is the better choice for anything sensitive. Either way, send the link privately and delete it after use.

Detailed Explanation

How It Works

What This Tool Does

Self-Destruct Message is a 100% client-side tool for sending a private note as an encrypted, burn-after-reading link. A pure engine (selfDestructEngine.ts) wraps the message in a small versioned envelope carrying an optional expiry timestamp and a per-device view budget, encrypts the whole thing in the browser with AES-256-GCM, and packs the ciphertext into the URL fragment (the part after #), which browsers never send to a server. The recipient opens the link and it decrypts locally with a live countdown; after it is read the tool hides it on that device. There is no backend, no upload and no database — the link itself is the encrypted message.

  • Encrypts a message in the browser with AES-256-GCM (Web Crypto API)
  • Optional expiry and view budget are baked into the payload before encryption
  • The encrypted payload rides in the URL #fragment, never transmitted to a server
  • Reader decrypts locally with a live countdown, copy-and-burn and burn-now
  • No backend, no upload, no CDN in the crypto path
Methodology

How the Envelope and Two Modes Work

Before encryption the engine prepends the message with a small JSON envelope { message, createdAt, expiresAt, maxViews, burnAfterReading }, then reuses the audited fragment-encryption engine (secretShareEngine.ts on textCryptoEngine.ts). In random-key mode a fresh 256-bit AES key is generated with crypto.getRandomValues and iv ‖ rawKey ‖ ciphertext+tag is base64url-encoded into the fragment as #s1k.…, so the link opens with no passphrase. In passphrase mode PBKDF2-HMAC-SHA-256 stretches the passphrase over a random salt into the AES key and only version ‖ iterations ‖ salt ‖ iv ‖ ciphertext+tag is placed in the fragment as #s1p.… — the passphrase is never in the link. GCM is authenticated, so a wrong key or any tampering fails to decrypt.

  • Envelope: { message, createdAt, expiresAt, maxViews, burnAfterReading } encrypted, not exposed
  • Random-key: #s1k.base64url(iv ‖ 256-bit key ‖ ciphertext+tag)
  • Passphrase: #s1p.base64url(version ‖ iterations ‖ salt ‖ iv ‖ ciphertext+tag)
  • PBKDF2-HMAC-SHA-256 key stretching; iteration count stored in the payload
  • AES-GCM authentication tag detects tampering or a wrong passphrase
Technical Details

How the Burn and Countdown Are Enforced

The reader page reads window.location.hash, decrypts the envelope locally, and enforces its rules in the browser. Expiry is a client-side clock check: the reader compares the embedded expiresAt to the device clock, renders a live countdown while the message is valid, and refuses to display it once the time has passed. Burn-after-reading is tracked per device: the engine computes a SHA-256 fingerprint of the fragment and, after a successful view, writes it to localStorage with a view count; once the view budget is spent (or the user presses burn-now) it records a burnedAt time, so reopening on that device shows “already viewed and destroyed” instead of the message. None of this touches the network, and all randomness comes from crypto.getRandomValues.

  • Expiry compares an embedded timestamp to the device clock — a live countdown, then hidden
  • Per-device burn keyed by a SHA-256 fingerprint of the fragment in localStorage
  • A view budget allows N reads on a device before it is hidden
  • Burn-now and copy-and-burn clear the message immediately on the device
  • Fragments are never part of the HTTP request — servers cannot log them
Limitations

Honest Limitations

This is end-to-end encrypted but it is not a true one-time or self-destructing secret. Because there is no backend to store and delete the ciphertext, anyone holding the full link can decrypt it on a different device, or before it is ever opened, and the expiry is a client-side clock check that a determined holder could ignore or defeat by setting their clock back. The burn and “destroyed” state are stored on the opening device only and cannot stop another device from opening the same link. URLs may also be retained in browser history, chat link previews and security scanners, and in random-key mode the key is inside the link, so a leaked link is a leaked message. For guaranteed burn-after-read and server-enforced expiry, use a hosted service such as onetimesecret.com or a self-hosted PrivateBin, and share the link and (in passphrase mode) the passphrase over different channels.

  • No backend → the burn and expiry are best-effort, not server-enforced
  • Anyone with the full link can decrypt it on another device before it burns
  • Expiry is a client-side clock check, not a deletion
  • The destroyed flag is per-device only, not a global lock
  • Random-key links: the link itself is the message — share privately
Privacy & Security

Private by Design

The message is encrypted entirely on the user’s device with the browser’s Web Crypto API, and the ciphertext, with its optional expiry, is stored only in the URL fragment, which is never sent to a server. There is no upload, no database, no logging, no server and no CDN in the crypto path, and no analytics or telemetry anywhere in the tool. The message exists only in the link and, briefly, the clipboard; the reader offers copy-and-burn and burn-now actions and can strip the link from the current tab. The tool works offline once cached, supports dark mode and a mobile-first layout, and the only optional network use anywhere on the site is consent-gated ads, which never see the message.

  • Encryption runs locally — nothing uploaded, logged or stored on a server
  • Ciphertext and expiry live only in the #fragment and the clipboard
  • No server, no CDN, no analytics in the crypto path
  • Copy-and-burn, burn-now and a per-device destroyed flag for the reader
  • Works offline once cached; dark-mode and mobile-first
Client-side self-destruct vs a hosted burn service
AspectThis tool (no backend)Hosted service (PrivateBin / OneTimeSecret)
Where the ciphertext livesIn the URL #fragment onlyOn a server, deleted after first fetch
Burn-after-readBest-effort, per-device (localStorage)Server-enforced — deleted globally on read
ExpiryClient-side clock check embedded in the linkServer deletes the record at expiry
Data uploadedNothing — encrypted in the browserCiphertext uploaded (some services see plaintext)
Best forQuick, no-account private notesGuaranteed one-time access for high-stakes secrets

This tool is end-to-end encrypted and 100% client-side, but with no backend the self-destruct and expiry are best-effort, not guaranteed. For server-enforced burn + expiry use a hosted service. As of July 2026.