Skip to main content

Serverless encrypted paste — the URL is the paste

Create shareable AES-256-GCM-encrypted pastes that live entirely in the URL fragment. No server, no database, optional password protection with PBKDF2 or Argon2id.

Most pastebins store your content on their server. Secure Paste does the opposite: the entire paste is encoded into the URL fragment (after the # symbol). Sharing the link IS sharing the paste — there is no upload, no database row, nothing to subpoena. The paste only exists in copies of the URL.

Optional password protection layers AES-256-GCM on top, with your choice of PBKDF2-SHA256 (fast, every-device-compatible) or Argon2id (memory-hard, GPU-resistant). The encrypted blob still lives in the URL; only key-holders can decrypt.

Auto-expire is local: the saved-pastes list in your browser purges entries after 1 / 7 / 30 days or never. The URL itself does not expire — anyone who saved a copy keeps access until they discard it. For genuinely ephemeral content, use a short expiry on your local list and consider publishing the URL only on a channel that itself expires.

URL-length budget is the main constraint. We warn at 16 KB and hard-block at 64 KB to stay within cross-browser limits. Beyond that, split into multiple pastes or use a different transport.

Frequently asked questions

Where is my paste stored?
Inside the URL itself, base64-encoded after the # symbol. Browsers do not transmit the URL fragment to servers, so even when the URL is requested over HTTP, the paste content stays on the client.
How does password protection work?
AES-256-GCM with a key derived from your password via PBKDF2 (200k iters, SHA-256) or Argon2id (64 MiB memory, 3 iterations). The encrypted blob plus a magic prefix indicating the KDF goes into the URL.
Why pick Argon2id over PBKDF2?
Argon2id is memory-hard, so attackers cannot brute-force it efficiently on GPUs or ASICs. The cost is about a second per derivation on a typical browser — a fair trade for high-value secrets.
How long can my paste be?
The URL must stay under ~64 KB for cross-browser reliability. That is roughly 45 KB of plaintext after base64/JSON expansion. Larger pastes are blocked with a clear error.
Will the link expire?
Not on its own — the URL is just data, not a database row. Local expiry purges the link from your saved list after the chosen interval, but anyone who copied the URL elsewhere still has it. For real ephemerality, use a separate transport with TTL.