object storage for user file uploads in a small app
Cloudflare R2. Egress is free, storage is $0.015 per GB-month, and the free tier is 10 GB plus 1 million Class A and 10 million Class B operations a month, so a photo-heavy side project can run at zero. It speaks the S3 API, so the AWS SDK and presigned uploads work unchanged and you can leave for S3 later.
Amazon S3 has the complete API, lifecycle rules, versioning, Object Lock, and every compliance box ticked.
Wins when you need versioning, Object Lock, bucket policies, or event notifications, none of which R2 implements.
MinIO. The repository was archived on 2026-04-25 with "THIS REPOSITORY IS NO LONGER MAINTAINED" at the top of the README, after the May 2025 release stripped the admin console out of the community build. Running your own S3 endpoint now means running unmaintained code.
| severity | versions | symptom and fix |
|---|---|---|
| major | * | Code that calls PutBucketVersioning, bucket policies, or S3 event notifications fails against R2. R2 leaves those unimplemented, along with bucket ACLs, replication, lifecycle analytics, static website hosting, Object Lock, and the three object tagging calls. Check the compatibility page before porting an S3 integration, and move anything policy-shaped into your own application code. evidence |
| major | * | A retried multipart upload part leaves the object corrupt or the upload unfinishable. R2 documents that uploading to the same part number replaces the previous part, and if that retry fails the original part is lost. Retry the whole part with a fresh body you can re-read, never a consumed stream, and verify with CRC-64/NVME, the only algorithm R2 supports for full-object checksums. evidence |
VERDICT object storage for user file uploads in a small app PICK Cloudflare R2 2026-09: Cloudflare R2. Egress is free, storage is $0.015 per GB-month, and the free tier is 10 GB plus 1 million Class A and 10 million Class B operations a month, so a photo-heavy side project can run at zero. It speaks the S3 API, so the AWS SDK and presigned uploads work unchanged and you can leave for S3 later. ALT Amazon S3: Amazon S3 has the complete API, lifecycle rules, versioning, Object Lock, and every compliance box ticked.; wins when you need versioning, Object Lock, bucket policies, or event notifications, none of which R2 implements AVOID MinIO: MinIO. The repository was archived on 2026-04-25 with "THIS REPOSITORY IS NO LONGER MAINTAINED" at the top of the README, after the May 2025 release stripped the admin console out of the community build. Running your own S3 endpoint now means running unmaintained code. TRAPS (2) [bc86c043] major: Code that calls PutBucketVersioning, bucket policies, or S3 event notifications fails against R2. [63d9818f] major: A retried multipart upload part leaves the object corrupt or the upload unfinishable. VERIFIED 2026-09-08 by wellworn reviewer · recheck 2027-01-06 · sources 4