Back to Blog

Vercel Blob vs Hetzner vs DigitalOcean vs AWS S3: Object Storage Showdown

May 23, 2025
William Callahan

Software engineer and entrepreneur based in San Francisco.

Vercel Blob vs Hetzner vs DigitalOcean vs AWS S3: Object Storage Showdown

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:

FeatureVercel BlobHetzner Object StorageDigitalOcean SpacesAWS S3
Underlying TechnologyAWS S3 backendCeph clustersProprietary (S3-compatible)Native AWS infrastructure
S3 API CompatibilityPartial (proxied to S3)Yes (S3-compatible)Yes (S3-compatible)Native
Durability11 nines (via S3)Not explicitly statedNot explicitly stated11 nines
Global CDNYes (Vercel Edge Network)No built-in CDNYes (built-in, 25+ PoPs)Optional (CloudFront)
Data Center LocationsAWS regions, global cacheGermany, Finland5 regions (US, EU, Asia)Dozens globally
Storage ClassesSingle (standard)Single (standard)Single (standard)Multiple (Standard, IA, Glacier, etc.)
Advanced FeaturesDeep Vercel integration, global caching, simple APIS3 API, Ceph, WORM, public URLsBuilt-in CDN, simple UILifecycle, Object Lock, Replication, Batch Ops, rich IAM

Pricing Comparison

Now let's look at how these services compare in terms of pricing:

ProviderStorage Price (per GB/month)Data Transfer Out (per GB)Minimum Monthly PriceFree 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.991TB storage & 1TB transfer included in base price
DigitalOcean Spaces$0.02$0.01$5250GB 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:

ProviderPrice for 250GBPrice for 1TBPrice 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:

Toggle dropdownJavaScript/TypeScript Integration

Using AWS SDK v3 with any S3-compatible service:

typescript
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:

typescript
import { put } from '@vercel/blob';

export async function uploadToVercelBlob(file) {
  const blob = await put(file.name, file, {
    access: 'public',
  });

  return blob.url;
}
Toggle dropdownPython Integration

Using boto3 with any S3-compatible service:

python
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)
Toggle dropdownGo Integration

Using the AWS SDK for Go with any S3-compatible service:

go
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!