Privacy
izzy.share is zero-knowledge by construction. The server never sees what you share.
// what is stored
- Ciphertext (opaque encrypted blob) in Cloudflare R2 (EU)
- Opaque metadata (expiry, opens, hashed recipient email if provided) in Cloudflare KV
- An audit log (event type, hashed IP/UA, country) retained 90 days in Cloudflare D1 (EU)
// what is never stored
- Plaintext
- Decryption keys for share-mode links (they live only in the URL fragment, which never reaches our servers).
Exception (request mode): when a client submits a secret to an izzy.share user, the encryption key transits the Worker briefly so we can email it as a URL fragment to the request owner. The Worker holds it in memory for the email send and never logs or persists it — see the request-mode trust note below. - Raw recipient emails (after the open-notification email is sent)
- Raw IP addresses or User-Agent strings
// erasure
Every share auto-deletes on burn or expiry. Senders can manually revoke at any time.
// request mode (trust note)
Request links let someone else send a secret to the link owner. The submitter's browser encrypts locally — the server still never sees plaintext — but the AES key has to reach the owner somehow. We do that by emailing them a one-time inbox URL with the key in the URL fragment:
https://share.izzy.agency/app/inbox/<id>#k=<keyB64u>&iv=<ivB64u> The server holds the key in worker memory only for the duration of the submission request (long enough to call the email provider) and then forgets it. It is never persisted in our databases or logs.
The trust boundary moves to your inbox. If your email is compromised (or your provider is asked nicely), the submission is compromised too. The same applies to forwarded inbox URLs. Treat the email like a one-time key — open it from a secure device, then let it expire or delete it. Defense-in-depth options (passphrase, Turnstile) are coming in a future release.
// share URL email delivery
When creating a share, the sender can tick "email the URL directly to recipient". With that opt-in, the sender's browser hands the full URL — fragment included — to the worker, which immediately passes it to Resend:
https://share.izzy.agency/en/s/<id>#k=<keyB64u>&iv=<ivB64u> The worker holds the URL in memory for a single HTTP call and then drops it. It is never written to D1, KV, R2, or logs. The only audit fact recorded is that a share_url_emailed event happened for this share id — no URL, no plaintext address.
Same trust boundary as request mode: the recipient's inbox becomes the vault. If you'd rather deliver the link out-of-band (Signal, in person, your own encrypted channel), just leave the checkbox unticked and the URL never leaves your browser.
You can also add an optional passphrase on the create form — it is hashed in your browser (PBKDF2) and acts as a second factor the recipient must enter before the ciphertext is released.
// bot protection (Cloudflare Turnstile)
On the public /auth/login and /[lang]/r/[id] pages, izzy.share uses Cloudflare Turnstile in invisible mode to slow down bots that might flood the magic-link issuer or request links. Turnstile collects browser signals to distinguish humans from automated traffic. No share content or decryption keys are passed to it — only the signals needed for the challenge.