ephemera
End to end encrypted secrets that self-destruct.

- Role
- Design and build
- Status
- Source available
- Stack
- Next.js 16
- tRPC 11
- Drizzle
- PostgreSQL
- Zod 4
- WebCrypto (AES-256-GCM, PBKDF2)
- Vitest against PGlite
- Playwright
Where the key lives
In link mode a random 256-bit key is generated in the browser and carried in the URL fragment. Browsers never send a fragment over the network, so the server sees a token and ciphertext. In passphrase mode the key comes from PBKDF2-SHA256 at 600,000 iterations and only the salt is stored.
The reveal gate
Opening a link does not consume a view. Link previews, mail scanners, and prefetching bots reach a gate page; the recipient must choose to reveal the secret. A wrong passphrase does not cost another view, because decryption is retried locally against the fetched ciphertext.
What it does not protect against
Encryption protects the stored content from someone reading the database. A malicious server operator could still deliver JavaScript that captures a secret or its key. The source is available to inspect, and the project recommends self-hosting.
Screenshots

Expiry and view count are chosen before the browser encrypts anything. 
The reveal gate keeps link previews from consuming a view. 
The recipient decrypts the secret locally before its Markdown is rendered.