README.md

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.