Threat model, stated plainly

Security

What we protect against, what we do not, and what an attacker with our disks would actually get. Written to be checked, not to reassure.

Keys stay client-side

A transfer key is derived in the client and placed in the URL fragment. Browsers never send fragments to a server, so the key does not reach us even by accident.

Ciphertext at rest

Blocks are sealed with XChaCha20-Poly1305 before upload. We hold ciphertext, block hashes and sizes — enough to route and deduplicate, not to read.

Integrity end to end

Every block carries a SHA-256 declared in the manifest. A block that does not match is rejected at ingest, not silently stored.

What an attacker with our storage gets

DataVisible to usNote
File contentsnoSealed client-side; the key never leaves the sender.
File namesnoPart of the encrypted manifest.
Block sizes and countyesRequired for routing and dedupe. Padding is available per session.
Sender's key IDyesNeeded for billing and the audit log.
Recipient address family and ASNyesKept 14 days for abuse handling, then discarded.
Full recipient IPnoTruncated at ingest before anything is written.
Traffic analysis is not solved. Block sizes and timing are observable to us and to a network observer. Per-session padding raises the cost of that analysis; it does not eliminate it. Anyone claiming otherwise is selling something.

Retention

Reporting a vulnerability

Send the details to security@fileexchange.site. We acknowledge within two business days and will tell you plainly whether we consider it in scope. Please do not run load or denial-of-service tests against production.

In scope: authentication and authorisation, key handling, tenant isolation, link policy enforcement. Out of scope: findings that require a compromised sender device, missing headers with no demonstrated impact, and reports produced solely by a scanner.