S3 Storage,
Evolved.

Minimalist, high-speed S3-compatible object storage with robust disk persistence. Engineered in Rust for the modern cloud.

VaporStore Visual Representation

Performance-Optimized by Design.

Advanced features for modern cloud-native applications.

S3 Native

Native support for AWS CLI, SDKs, and standard tools. Zero learning curve for S3 workflows.

🦀 Rust Core

Built from the ground up for safety and speed. Minimal memory footprint with massive throughput.

💾 Hybrid Persistence

In-memory speed with industrial-grade durability. Async Write-Ahead Logs (WAL) with batching for high throughput.

🔍 Prefix Index

O(log n) list operations using BTreeMap-based indexing. 100x faster than full bucket scans.

🧠 LRU Eviction

Automatic memory management with configurable limits. Least-recently-used objects evicted when limit reached.

📊 Prometheus Metrics

Full observability with latency histograms (p50, p95, p99), request counters, and in-flight tracking.

API Reference.

Fully compliant S3-style endpoints and system diagnostics.

Service Operations

GET / List all buckets

Bucket Operations

GET /{bucket} List objects (v1 & v2)
PUT /{bucket} Create new bucket
HEAD /{bucket} Check bucket existence
DELETE /{bucket} Delete empty bucket

Object Operations

GET /{bucket}/{key} Retrieve object data
PUT /{bucket}/{key} Upload object / Copy source
POST /{bucket}/{key} Multipart Upload init / complete
HEAD /{bucket}/{key} Get metadata / stats
DELETE /{bucket}/{key} Delete object / Abort upload

System Diagnostics

GET /health System health & version stats
GET /metrics Prometheus metrics (latency histograms, counters, gauges)

Multi-SDK Support.

Native integration for your favorite languages.

// aws-sdk-s3 let config = aws_config::from_env() .endpoint_url("http://localhost:9353") .load().await; let client = aws_sdk_s3::Client::new(&config); client.put_object() .bucket("my-bucket") .key("hello.txt") .body(ByteStream::from_static(b"Hello from Rust!")) .send().await?;
// AWSSDK.S3 var config = new AmazonS3Config { ServiceURL = "http://localhost:9353", ForcePathStyle = true }; var client = new AmazonS3Client("any", "any", config); await client.PutObjectAsync(new PutObjectRequest { BucketName = "my-bucket", Key = "hello.txt", ContentBody = "Hello from C#!" });
// aws-sdk-go-v2 cfg, _ := config.LoadDefaultConfig(ctx, config.WithEndpointResolverWithOptions( aws.EndpointResolverWithOptionsFunc(func(s, r string, o ...interface{}) (aws.Endpoint, error) { return aws.Endpoint{URL: "http://localhost:9353"}, nil }))) client := s3.NewFromConfig(cfg, func(o *s3.Options) { o.UsePathStyle = true }) client.PutObject(ctx, &s3.PutObjectInput{ Bucket: aws.String("my-bucket"), Key: aws.String("hello.txt"), Body: strings.NewReader("Hello from Go!"), })

Quick Start.

Deploy in milliseconds with Docker.

Pull and Run:

docker pull muratgenc/vaporstore:v0.3.0
docker run -p 9353:9353 muratgenc/vaporstore:v0.3.0

Advanced Configuration:

docker run -p 9353:9353 \
  -e VAPORSTORE_PERSISTENCE=true \
  -e VAPORSTORE_MAX_MEMORY=536870912 \
  -v vaporstore_data:/app/data \
  muratgenc/vaporstore:v0.3.0

Test Connection:

export AWS_ACCESS_KEY_ID=any
export AWS_SECRET_ACCESS_KEY=any
aws --endpoint-url http://localhost:9353 s3 mb s3://test-bucket

Environment Variables:
VAPORSTORE_MAX_MEMORY: Memory limit in bytes (0 = unlimited)
VAPORSTORE_PERSISTENCE: Enable disk persistence (true/false)
VAPORSTORE_MAX_OBJECT_SIZE: Max object size (default: 5MB)