Share an HTML file. Keep the key.
Zero-knowledge, end-to-end encrypted HTML file sharing. Your browser encrypts the file with AES-256-GCM before anything is uploaded. The decryption key lives after the # in the share URL — browsers never send that part to the server. We store only ciphertext.
- Drop an HTML file on the homepage
- Your browser generates two random keys: a view key (AES-256-GCM) and an edit key
- The file is encrypted in-browser and uploaded as ciphertext
- You get two links:
- Share link
/v/{id}#viewKey— give this to anyone you want to read the file - Edit link
/e/{id}#editKey— keep this private; it lets you replace the file later without changing the share link
- Share link
- Files self-destruct after the chosen expiry (7 days, 30 days, or never)
The server stores:
- The encrypted blob
- The view key encrypted with the edit key (so the edit page can re-encrypt without exposing the view key)
SHA-256(editKey)for authorization — never the plaintext keys
- Zero-knowledge uploads — server cannot read any uploaded content
- Key-in-fragment — browsers strip the URL fragment before sending HTTP requests; the key never reaches the server
- Edit authorization —
SHA-256(editKey)stored; raw editKey verified only on update requests - Expiry enforcement — daily cron deletes blobs and DB rows past their expiry date
- 10 MB upload limit enforced server-side
- CSRF protection on all state-mutating routes
- Laravel 12 (PHP 8.5+)
- SQLite (swap to MySQL/Postgres via
.envfor production) - Vite (CSS build pipeline)
- Web Crypto API (all crypto is browser-native; no external crypto libraries)
cp .env.example .env
php artisan key:generate
php artisan migrate
npm install && npm run build
php artisan serveFor production, add a cron entry to run the scheduler:
* * * * * cd /path/to/html.cloud && php artisan schedule:run >> /dev/null 2>&1
Clone, configure .env (APP_URL, DB_* if using MySQL/Postgres), run behind nginx or Caddy. The encrypted blobs are stored in storage/app/documents/ — back that directory up alongside the database.
MIT