Vercel Blob vs Hetzner vs DigitalOcean vs AWS S3: Object Storage Showdown
Software engineer and entrepreneur based in San Francisco.

Vercel just announced that Vercel Blob is now generally available on all plans. This durable storage solution is already powering production apps like v0.dev and storing over 400 million files. With this announcement, it's a good time to compare Vercel Blob with other popular object storage options like Hetzner Object Storage, DigitalOcean Spaces, and the industry standard AWS S3.
The Elephant in the Room: S3 Compatibility
Before diving into the comparison, let's address something that's often overlooked: most modern object storage solutions are S3-compatible, meaning you can use the AWS SDK to interact with them directly from any programming language. This compatibility layer means you're not locked into AWS's ecosystem to use S3-like storage.
Whether you're using JavaScript, Python, Go, or any other modern language, you can typically point your S3 client to a different endpoint and use alternative object storage services with minimal code changes.
Feature Comparison
Let's compare the key features of these four object storage solutions:
Feature | Vercel Blob | Hetzner Object Storage | DigitalOcean Spaces | AWS S3 |
---|---|---|---|---|
Underlying Technology | AWS S3 backend | Ceph clusters | Proprietary (S3-compatible) | Native AWS infrastructure |
S3 API Compatibility | Partial (proxied to S3) | Yes (S3-compatible) | Yes (S3-compatible) | Native |
Durability | 11 nines (via S3) | Not explicitly stated | Not explicitly stated | 11 nines |
Global CDN | Yes (Vercel Edge Network) | No built-in CDN | Yes (built-in, 25+ PoPs) | Optional (CloudFront) |
Data Center Locations | AWS regions, global cache | Germany, Finland | 5 regions (US, EU, Asia) | Dozens globally |
Storage Classes | Single (standard) | Single (standard) | Single (standard) | Multiple (Standard, IA, Glacier, etc.) |
Advanced Features | Deep Vercel integration, global caching, simple API | S3 API, Ceph, WORM, public URLs | Built-in CDN, simple UI | Lifecycle, Object Lock, Replication, Batch Ops, rich IAM |
Pricing Comparison
Now let's look at how these services compare in terms of pricing:
Provider | Storage Price (per GB/month) | Data Transfer Out (per GB) | Minimum Monthly Price | Free Tier |
---|---|---|---|---|
Vercel Blob | $0.023 | $0.05 (regional) | $0 (with Hobby plan) | 1GB storage & 10GB transfer (Hobby), 5GB storage & 100GB transfer (Pro) |
Hetzner Object Storage | ~$0.0064 (1TB for $5.99) | $0.0013 ($1.20/TB) | $5.99 | 1TB storage & 1TB transfer included in base price |
DigitalOcean Spaces | $0.02 | $0.01 | $5 | 250GB storage & 1,024GB transfer included in base price |
AWS S3 (Standard) | $0.023 (first 50TB) | $0.09 | $0 (pay as you go) | 5GB storage & 100GB transfer (AWS Free Tier, 12 months) |
Cost Comparison for Different Storage Needs
Let's see how these services compare for different storage volumes:
Provider | Price for 250GB | Price for 1TB | Price for 5TB |
---|---|---|---|
Vercel Blob | ~$5.75 (Hobby + extra) | ~$23.00 (Hobby + extra) | ~$115.00 (Hobby + extra) |
Hetzner Object Storage | $5.99 (for 1TB) | $5.99 | ~$29.95 (5TB) |
DigitalOcean Spaces | $5.00 | ~$20.00 | ~$100.00 |
AWS S3 (Standard) | ~$5.75 | ~$23.00 | ~$115.00 |
Note: These calculations focus on storage costs only and don't include data transfer or API operation costs, which can significantly impact your total bill depending on usage patterns.
Integration with Modern Programming Languages
One of the great things about all these services is how easily they integrate with modern programming languages. Here are some examples:
JavaScript/TypeScript Integration
Using AWS SDK v3 with any S3-compatible service:
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
// Configure for AWS S3
const s3Client = new S3Client({
region: "us-east-1",
credentials: {
accessKeyId: "YOUR_ACCESS_KEY",
secretAccessKey: "YOUR_SECRET_KEY"
}
});
// For Hetzner or DigitalOcean, just change the endpoint
const hetznerClient = new S3Client({
region: "eu-central-1",
endpoint: "https://s3.eu-central-1.hetzner.com",
credentials: {
accessKeyId: "YOUR_ACCESS_KEY",
secretAccessKey: "YOUR_SECRET_KEY"
}
});
// Upload example
async function uploadFile(client, bucket, key, body) {
const command = new PutObjectCommand({
Bucket: bucket,
Key: key,
Body: body
});
return client.send(command);
}
For Vercel Blob, you can use their dedicated SDK:
import { put } from '@vercel/blob';
export async function uploadToVercelBlob(file) {
const blob = await put(file.name, file, {
access: 'public',
});
return blob.url;
}
Python Integration
Using boto3 with any S3-compatible service:
import boto3
# Configure for AWS S3
s3_client = boto3.client(
's3',
region_name='us-east-1',
aws_access_key_id='YOUR_ACCESS_KEY',
aws_secret_access_key='YOUR_SECRET_KEY'
)
# For Hetzner or DigitalOcean, just change the endpoint
do_client = boto3.client(
's3',
region_name='nyc3',
endpoint_url='https://nyc3.digitaloceanspaces.com',
aws_access_key_id='YOUR_ACCESS_KEY',
aws_secret_access_key='YOUR_SECRET_KEY'
)
# Upload example
def upload_file(client, bucket, key, file_path):
return client.upload_file(file_path, bucket, key)
Go Integration
Using the AWS SDK for Go with any S3-compatible service:
package main
import (
"context"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
// Configure for AWS S3
cfg, _ := config.LoadDefaultConfig(context.TODO(),
config.WithRegion("us-east-1"),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
"YOUR_ACCESS_KEY", "YOUR_SECRET_KEY", "",
)),
)
s3Client := s3.NewFromConfig(cfg)
// For Hetzner or DigitalOcean, add custom endpoint resolver
customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
return aws.Endpoint{
URL: "https://s3.eu-central-1.hetzner.com",
}, nil
})
hetznerCfg, _ := config.LoadDefaultConfig(context.TODO(),
config.WithRegion("eu-central-1"),
config.WithEndpointResolverWithOptions(customResolver),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
"YOUR_ACCESS_KEY", "YOUR_SECRET_KEY", "",
)),
)
hetznerClient := s3.NewFromConfig(hetznerCfg)
// Upload example
// s3Client.PutObject(...)
}
When to Choose Each Service
Each of these object storage solutions has its strengths and ideal use cases:
Vercel Blob
Best for:
- Vercel-hosted applications
- Projects needing tight integration with Vercel's platform
- Applications benefiting from global CDN caching
- Developers who value simplicity and ease of use
Hetzner Object Storage
Best for:
- Budget-conscious projects with large storage needs
- European-based workloads (GDPR compliance)
- Bulk storage with low egress requirements
- Developers looking for the lowest cost option
DigitalOcean Spaces
Best for:
- DigitalOcean customers
- Projects needing built-in CDN capabilities
- Developers who prefer a simple UI and predictable pricing
- Applications with moderate storage and bandwidth needs
AWS S3
Best for:
- Enterprise applications requiring advanced features
- Workloads needing global distribution
- Projects requiring multiple storage tiers
- Applications with complex access control requirements
- Existing AWS customers
Conclusion
Vercel Blob's general availability brings another strong contender to the object storage market. While its pricing for raw storage matches AWS S3, its data transfer costs are significantly lower thanks to Vercel's global caching network.
For pure cost efficiency, Hetzner Object Storage is hard to beat, especially for large storage volumes. DigitalOcean Spaces offers a good middle ground with its built-in CDN and simple pricing structure.
AWS S3 remains the most feature-rich option, but at a premium price, especially for data transfer. Its extensive feature set and global presence make it ideal for enterprise applications with complex requirements.
The good news is that with S3-compatible APIs across all these services, you're not locked into any single provider. You can start with one service and migrate to another as your needs change, often with minimal code changes.
Which object storage solution are you using for your projects? Have you tried Vercel Blob yet? Let me know in the comments!