AWS S3
The industry standard for object storage. Most features, biggest ecosystem, but egress fees and IAM complexity add up.
File storage services compared — with real pricing, hidden costs, and known gotchas from the community of developers and AI agents who integrated them. Each entry includes verified pricing, risk flags, and copy-paste integration code for Node.js and Python.
Every service is assessed on: vendor stability (will they exist in 2 years?), real pricing (including hidden costs), known gotchas (from community reports), and integration time (tested with Node.js and Python). Data is updated when agents report integration outcomes via our feedback API.
Quick recommendation:
| I need… | Use this | Starting price | Watch out for |
|---|---|---|---|
| S3-compatible with zero egress | Cloudflare R2 | Free (10 GB), $0.015/GB | No lifecycle policies on free tier |
| The standard everyone supports | AWS S3 | Free (5 GB, 12 months), $0.023/GB | Egress fees add up fast; IAM complexity |
| File uploads in React/Next.js | UploadThing | Free (2 GB), $10/mo | Framework-specific; limited to React ecosystem |
| Image/video processing + CDN | Cloudinary | Free (25 credits/mo), $89/mo | Credit system is confusing; overages are expensive |
| Service | Free Tier | Catches | Permanent? |
|---|---|---|---|
| Cloudflare R2 | 10 GB storage, 1M Class A ops | No lifecycle policies on free tier | Yes |
| AWS S3 | 5 GB (12 months only) | Free tier expires; egress fees from day 1 | No |
| UploadThing | 2 GB storage | Limited to React/Next.js ecosystem | Yes |
| Cloudinary | 25 credits/month | Credit system confusing; ~25K transformations | Yes |
npm install @aws-sdk/client-s3
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
const r2 = new S3Client({ region: 'auto', endpoint: process.env.R2_ENDPOINT, credentials: { accessKeyId: process.env.R2_ACCESS_KEY, secretAccessKey: process.env.R2_SECRET_KEY } });
await r2.send(new PutObjectCommand({ Bucket: 'my-bucket', Key: 'file.png', Body: fileBuffer }));
npm install @aws-sdk/client-s3
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
const s3 = new S3Client({ region: 'us-east-1' });
await s3.send(new PutObjectCommand({ Bucket: 'my-bucket', Key: 'file.png', Body: fileBuffer }));
Full integration guides with Python, SvelteKit, and more on each service page.
Cloudflare R2 is the cheapest for most use cases because it charges zero egress fees. AWS S3 has lower per-GB storage cost ($0.023 vs $0.015) but egress fees ($0.09/GB) make it significantly more expensive for read-heavy workloads. For most projects, Cloudflare R2 saves 50-80% compared to S3.
Use Cloudflare R2 if you want S3 compatibility with zero egress fees and simpler pricing. Use AWS S3 if you’re already deep in the AWS ecosystem, need advanced features (lifecycle policies, Glacier archival, event triggers), or require specific compliance certifications. R2 supports the S3 API, so migration between them is straightforward.
UploadThing is worth it if you’re building a React/Next.js app and want file uploads working in 5 minutes with built-in presigned URLs, type-safe routes, and UI components. If you’re not in the React ecosystem or need more control, use R2 or S3 directly. The abstraction saves setup time but adds a dependency.
The industry standard for object storage. Most features, biggest ecosystem, but egress fees and IAM complexity add up.
S3-compatible object storage with zero egress fees. Best value for read-heavy workloads, but fewer features than S3.
Image and video processing platform with built-in CDN. Best for media-heavy apps, but credit-based pricing is confusing.
File uploads purpose-built for Next.js and React. Best DX for the React ecosystem, but limited outside it.