- TypeScript 95%
- Nix 3%
- CSS 1%
- HTML <1%
drop #
Encrypted file sharing with allowlisted uploads and public share links. A fork of Juliet Philippe’s Drop, adapted for Cloudflare Workers, R2, and D1.
live: drop.zzstoatzz.io
install #
Requires Node.js 22.23.4 or later and Bun. Use the version in .node-version; earlier Node 22 builds can fail while loading the Cloudflare Vite configuration.
bun install --frozen-lockfile
bun install --frozen-lockfile --cwd web
use #
Sign in with an approved AT Protocol account, choose files and a lifetime, then copy the generated link. Recipients need the entire link, including its fragment, to decrypt files. They do not need an account.
design #
- Browser encryption keeps filenames and contents out of server requests. The server receives ciphertext and operational metadata.
- Server sessions establish the uploader’s DID through OAuth; every upload checks the current DID allowlist.
- Public downloads use unguessable file IDs and a decryption key carried in the URL fragment.
- Atomic claims let one download attempt consume a burn-after-read link. Interrupted downloads still consume it.
- Bounded storage reserves capacity before streaming ciphertext to R2.
develop #
bun run dev # Worker and frontend at http://127.0.0.1:8787
bun test # unit tests and Workers runtime integration tests
bun run typecheck # Bun, Worker, and frontend types
bun run build # Cloudflare deployment bundle and static assets
bun run deploy # deploy the configured Worker and custom domain
Use Node from .node-version when running the Cloudflare commands. Initialize local D1 with the migrations before testing authenticated routes; see the operations guide.
docs #
Operations covers deployment, limits, allowlists, abuse response, and verification. Security and operating risks records the review scope, legal exposure, cost assumptions, and performance tradeoffs.
license #
ISC. Upstream copyright remains with Juliet Philippe.