End-to-end encrypted secret sharing. Zero trust required.
Send passwords, API keys, and sensitive text to anyone ā encrypted in your browser before it ever touches a server. The passphrase never leaves your device.
š Try it live
Most secret-sharing tools ask you to trust that the server isn't logging your data. This one doesn't. Here's why:
Every line of source code is public. This app is built on Val Town, where the code that runs the server is the code you can read ā no hidden build steps, no compiled bundles, no deploy pipeline that could inject anything. What you see at stevekrouse/secret-share is exactly what runs when you use the app.
That means you can verify:
client/app.tsx and shared/crypto.tsserver/db.tsmain.tsesm.town with no bundler in betweenEven the app's author cannot read your secrets. The database contains only encrypted noise without the passphrase.
Rendering mermaid diagram...
| Layer | Detail |
|---|---|
| Encryption | AES-256-GCM (authenticated encryption) |
| Key Derivation | PBKDF2 with SHA-256, 600,000 iterations |
| Salt | 128-bit random per secret |
| IV | 96-bit random per secret |
| Passphrase | User-supplied or auto-generated, never transmitted |
| Server storage | Ciphertext + IV + salt only ā no plaintext, no passphrase, no key material |
| Expiry | Configurable: 1 hour ā 30 days (default 1 week) |
| Deletion | Receiver can destroy immediately after reading |
secret-share/
āāā main.ts # Hono HTTP routes + API endpoints
āāā server/
ā āāā db.ts # SQLite CRUD (stores only ciphertext)
ā āāā render.tsx # Server-side React rendering
āāā client/
ā āāā app.tsx # React UI (create + reveal views)
ā āāā hydrate.tsx # Client-side hydration
āāā shared/
āāā types.ts # Shared TypeScript interfaces
āāā crypto.ts # AES-256-GCM encrypt/decrypt (Web Crypto API)