wellworn
recommend · verified 2026-09-08

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.

alternative · 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 for Cloudflare R2 (2)
severityversionssymptom 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
what your agent receives
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