FastDDL Now Supports 5GB Uploads & 1TB Storage
Streaming upload engine, 5GB files, 1TB R2-backed storage — and no memory crashes.
Today we're shipping three major infrastructure upgrades:
5GB File Uploads
Max file size has been increased from 2GB to 5GB. The actual technical limit is 4.9GB to stay under Cloudflare R2's single-part upload boundary. For marketing purposes we say 5GB — you can upload files up to approximately 5GB.
New Streaming Upload Engine
The previous upload pipeline used Next.js's built-in request.formData() which buffers the entire file in memory before streaming starts. For files above ~1GB, this caused out-of-memory kills on our 2GB server.
We built a new busboy-powered streaming endpoint at /api/upload-stream that:
- Parses multipart data as a true Node.js stream
- Writes directly to disk — zero memory buffering for the file content
- Encrypts from the temp file using the existing AES-256-GCM streaming pipeline
- Uploads to Cloudflare R2 as a single 4.9GB (or smaller) object
Tested with a 4GB upload: HTTP 200, 250 seconds, no OOM.
1TB Total Storage
Shared storage cap was increased from 20GB to 1TB. Since all encrypted files are stored on Cloudflare R2 (which scales to petabytes), the 20GB cap was unnecessarily tight. The 1TB limit is generous enough for most use cases while still providing an abuse prevention boundary.
What else changed
- Torrent uploads: 200MB → 1GB
- Expiry options: now 4 hours, 48 hours, or 7 days
- Permanent storage: reduced from 50,000 $DDLX to 5,000 $DDLX
- Nginx body limit: 5500MB
- Upload timeout: 15 minutes
Why not unlimited?
Two hard limits we can't bypass without more engineering:
R2 single-part limit: Cloudflare R2's S3-compatible PutObject has a 5GB ceiling. Files larger than that require multipart upload, which adds complexity. If demand warrants, we'll implement multipart upload for >5GB files.
Server RAM (2GB): Next.js's formData() reads the full request body into memory. The streaming endpoint bypasses this, but the standard upload API still uses formData for small files. For 5GB files, always use the streaming endpoint or upload-from-URL.