• Blog
  • Docs
  • Pricing
  • We’re hiring!
Log inSign up
stevekrouse

stevekrouse

secret-share

E2E encrypted secret sharing with expiring links
Public
Like
secret-share
Home
Code
5
client
2
server
2
shared
2
README.md
H
main.ts
Connections
Environment variables
Branches
1
Pull requests
Remixes
History
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.
Sign up now
Code
/
README.md
Code
/
README.md
Search
…
Viewing readonly version of main branch: v20
View latest version
README.md

πŸ” Secret Share

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

Why This Is Trustworthy

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:

  • βœ… The passphrase is never sent to the server β€” check client/app.tsx and shared/crypto.ts
  • βœ… The server only stores ciphertext, IV, and salt β€” check server/db.ts
  • βœ… The API never receives or returns plaintext β€” check main.ts
  • βœ… Encryption uses AES-256-GCM with PBKDF2 key derivation (600K iterations, SHA-256) via the Web Crypto API β€” no homebrew crypto
  • βœ… The client-side code served to your browser is the same source file from this repo, transpiled by esm.town with no bundler in between

Even the app's author cannot read your secrets. The database contains only encrypted noise without the passphrase.

How It Works

Rendering mermaid diagram...

Security Model

LayerDetail
EncryptionAES-256-GCM (authenticated encryption)
Key DerivationPBKDF2 with SHA-256, 600,000 iterations
Salt128-bit random per secret
IV96-bit random per secret
PassphraseUser-supplied or auto-generated, never transmitted
Server storageCiphertext + IV + salt only β€” no plaintext, no passphrase, no key material
ExpiryConfigurable: 1 hour β†’ 30 days (default 1 week)
DeletionReceiver can destroy immediately after reading

Project Structure

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)

Tech Stack

  • Runtime: Val Town (Deno)
  • Server: Hono
  • UI: React 18 (SSR + hydration, JSX only β€” no HTML/CSS/JS strings)
  • Styling: Twind (Tailwind-in-JS)
  • Database: Val Town SQLite
  • Crypto: Web Crypto API (built into every modern browser and Deno)

Usage

  1. Create: Enter your secret β†’ passphrase is auto-generated (or type your own) β†’ click "Encrypt & Create Link"
  2. Share: Copy the link and passphrase β€” send them via different channels (e.g. link in Slack, passphrase in a text message)
  3. Receive: Open the link β†’ enter the passphrase β†’ read the secret
  4. Destroy: Click "Delete This Secret Now" to remove it before expiry

πŸ“– View the full source code on Val Town β†’

FeaturesVersion controlCode intelligenceCLIMCP
Use cases
TeamsAI agentsSlackGTM
DocsShowcaseTemplatesNewestTrendingAPI examplesNPM packages
PricingNewsletterBlogAboutCareers
We’re hiring!
Brandhi@val.townStatus
X (Twitter)
Discord community
GitHub discussions
YouTube channel
Bluesky
Open Source Pledge
Terms of usePrivacy policyAbuse contact
Β© 2026 Val Town, Inc.