Web · libsodium · Cloudflare R2 · Streaming decryption · drop.inbox.locker
Locker Drop
Encrypt here. Share the link. Keep the key out of the upload.
Locker Drop encrypts file content in the browser before upload. A share link carries the decryption key in its URL fragment, which is not part of an ordinary HTTP request. The recipient decrypts on their device. The backend handles payment, storage, transfer metadata, and lifecycle management.

Origin
How it started
Private mail and private file transfer share a difficult boundary: the interface has to be simple without hiding what the system can and cannot protect. Locker Drop makes that boundary tangible—encrypt on the sending device, keep the key out of the upload, and decrypt at the recipient.
Features
What it does
Authenticated streaming encryption
libsodium secretstream uses XChaCha20-Poly1305 to encrypt in frames and detect modified ciphertext. Chunked processing avoids requiring an entire file to be decrypted in memory at once.
The key travels separately from the upload
The browser generates the key. The share link places it after the #, outside the ordinary HTTP request. Anyone with the full usable link may be able to decrypt, so the link itself must be treated as sensitive.
Optional password protection
Argon2id password derivation protects a wrapped key. Sharing the password through a separate channel gives the recipient another requirement beyond possession of the link.
Browser-side receiving
The recipient path uses a service worker for streaming decryption into a download. The end-to-end experience depends on browser support and transfer conditions.
An honest lifecycle
Expiry concerns hosted ciphertext and access through the service. It cannot erase a copy a recipient has already downloaded. Operational metadata is separate from encrypted file content.
Under the hood
Engineering
Standard primitives, observable failure
The crypto integration uses libsodium rather than a custom cipher. Local tests exercise round trips, a changed byte, and wrong-password rejection. A 3,158,073-byte sample passed through four frames in the inspected test suite; that is a bounded test, not a promise about unlimited file sizes.
Keep encryption and service claims separate
A passing cryptographic round trip does not prove production upload reliability, expiry behavior, cross-browser support, or the absence of every security flaw. The service also handles operational metadata; encrypted content is not the same as anonymity.
A proof you can touch
The portfolio's browser experiment uses native Web Crypto AES-GCM to show authenticated encryption with a small predefined sample. It deliberately does not pretend to be Locker Drop's XChaCha20-Poly1305 transfer protocol or a production upload. Encrypt, recover the original, then change one byte and observe rejection.
Stack
- Next.js · TypeScript
- libsodium · XChaCha20-Poly1305 secretstream
- Argon2id password wrapping
- Cloudflare R2 · Multipart uploads
- Service workers · Streaming decryption
- Polar payments