Security Whitepaper

Version 1.0 — July 2026 · Operator: JAD Apps (sole trader), Wellington Close, Warsop, Mansfield, Nottinghamshire, NG20 0JL, UK · support@jadapps.app

1. What SecureSend is

SecureSend is a one-time file handover service. A sender encrypts a file in their own browser; the service escrows only a small one-time decryption key and releases it exactly once — to whoever presents the correct link token and PIN — destroying it in the same operation. The encrypted file travels by whatever channel the sender already uses. SecureSend never receives, stores, relays, or can read the file.

2. Architecture

The service runs entirely on Cloudflare Workers and Durable Objects. There is no object storage, no database server, and no file upload endpoint anywhere in the codebase — API request bodies are limited to a few hundred bytes of metadata.

3. What the service holds, and for how long

DataWhereRetention
Wrapped one-time keyFileDOUntil first open, lockout, or TTL expiry — destroyed atomically
Transfer metadata (filename shown to recipient, size, hashes of token/PIN)FileDOErased 90 days after terminal state
Account/subscription records (email, tier, Stripe customer id)AccountDO / OrgDOLife of the account
Business audit events (see §5)AuditDO (one per organisation)24 months, then swept — the sweep is itself an audit event

Never held anywhere, in any form: file contents; unwrapped content keys after seal; PINs or link tokens in plaintext (hashes only).

4. Threat model

5. Business audit trail — exact schema

For Business organisations only, every lifecycle transition is recorded in an append-only, per-organisation store. The complete schema — there are no other fields:

FieldContent
timestampUTC, at event emission
typeOne of: org_created, send_created, send_refused, delivery_dispatched, open_success, open_denied, lockout, burn_expired, burn_cancelled, seat_invited, seat_accepted, seat_revoked, seat_role_changed, settings_changed, export, retention_sweep, org_offboarded
actorSeat email, "recipient", "billing", "operator", or "system"
outcomeShort status code (e.g. ok, wrong_pin, locked_out, revoked_seat)
recipientDelivery contact exactly as the sender entered it (org sends only)
sizeFile size in bytes
labelOptional sender-supplied label — never the filename
file_idOpaque random UUID for correlation
detailShort whitelisted context (e.g. TTL, attempt count)

Events are written after — never inside — the atomic key transaction, and no field permits reconstruction of file contents. Filenames are excluded from the trail by construction: the event constructor accepts only the fields above. The trail has no update or delete API for anyone, including us; the only removals are the 24-month retention sweep and offboarding deletion, both recorded as events. Every export is itself an audit event.

6. Sending infrastructure

Delivery emails are sent via Resend from the verified jadapps.app domain. Organisation branding changes only the display name, reply-to, and body of the email — the sending address and domain never change, so SPF, DKIM and DMARC alignment are structurally identical for every organisation. See the subprocessor list.

7. Honest limits

Consistent with our public claims, and stated here for your assessor:

8. Operational security

Contact

Security questions or disclosures: support@jadapps.app. See also: data-flow diagram · template DPA · subprocessors · privacy notice.