Last month my VPS disk hit 100% because I was dumb enough to store user uploads on local disk. Moving to object storage was overdue — but I refused to pay AWS $0.023/GB plus the infamous egress ransom. So I tested the three free tiers everyone recommends.
Same workload on all three: a 1GB mix of 2,400 files (images + JSON exports from my side project), uploaded via their official S3-compatible SDKs from the same server, same evening.
Free tier limits (the numbers that matter)
| Cloudflare R2 | Backblaze B2 | Storj | |
|---|---|---|---|
| Free storage | 10 GB/mo | 10 GB | 25 GB (trial 30d, then paid) |
| Free egress | Unlimited (zero egress fees) | 3x storage/mo free (= 30 GB) | 25 GB trial |
| Free Class A ops (writes) | 1M/mo | 2,500/day | included in trial |
| Free Class B ops (reads) | 10M/mo | 2,500/day | included in trial |
| S3-compatible API | Yes | Yes | Yes |
Real-world results
Upload throughput for the 1GB batch (multipart, 8MB chunks):
-
R2: 41 MB/s average, zero hiccups.
boto3with the R2 endpoint just worked. - B2: 33 MB/s average, but I hit the 2,500/day Class C (API call) free cap mid-upload on the second run and had to enable billing to continue. The free daily caps are per-day, not per-month — easy to blow past with small files.
- Storj: 27 MB/s, and here's the catch — there is no permanent free tier anymore. The 25GB/25GB is a 30-day trial. After that, $4/TB stored. Their marketing pages still imply "free" in places, which wasted me an evening.
The code (identical for all three, thanks to S3 compatibility)
import boto3
s3 = boto3.client(
"s3",
endpoint_url="https://<accountid>.r2.cloudflarestorage.com",
aws_access_key_id=KEY_ID,
aws_secret_access_key=SECRET,
)
s3.upload_file("backup.tar.gz", "my-bucket", "backup.tar.gz")
Swap the endpoint and credentials and the same script ran on B2 (s3.us-west-004.backblazeb2.com) and Storj (gateway.storjshare.io). That part was genuinely pleasant.
Verdict
- Serving files to users (egress-heavy): R2, and it's not close. Zero egress fees is a structural advantage — B2's "3x storage free egress" evaporates the moment one of your files goes mildly viral.
- Cold backup with rare reads: B2 is fine, and their paid pricing ($6/TB) is the cheapest exit ramp if you outgrow free.
- Storj: interesting decentralization story, but calling a 30-day trial a "free tier" in 2026 comparisons is misleading. Don't build on it expecting free.
The "S3 vs GCS vs Azure Blob" debate is a distraction for side projects. The real question is: who doesn't charge you when your file actually gets downloaded?
I sketched the benchmark script and the multipart upload retry logic with MonkeyCode — free, open-source, and it caught my dumb bug where I forgot to close the multipart upload on retries: https://ly.cyberserval.tech/iIETXiF
Which one are you trusting with your side project's files — and has anyone actually been burned by B2's daily API caps in production?
Top comments (0)