Globally Distributed
S3-Compatible Object Storage

Tigris is a globally distributed S3-compatible object storage service that provides low latency anywhere in the world, enabling developers to store and access any amount of data for a wide range of use cases.

globally distributed S3-compatible object storage

Trusted by

Fly.io logoPlayground logoFal logoAmplified logoBeam logoQuickwit logoArcjet logo

Run multi-cloud AI workloads globally without worrying about Storage Placement or Performance.

Single Global Endpoint

Store Data Near Users

Data stored close to the users automatically ensuring low latency everywhere.

S3 Compatible API

S3 Compatible API

Global and fast object storage with familiar AWS S3 tools, libraries, and extensions.

Fast Small Object Retrieval

Fast Small Object Retrieval

Access small objects at close to Redis speed, ensuring swift, efficient retrieval.

Store Data Near Users

Zero Egress Fees

Free data egress ensures seamless and unrestricted access to your data whenever you need it.

import { S3Client } from "@aws-sdk/client-s3";
import { Upload } from "@aws-sdk/lib-storage";
import fs from "fs";

const client = new S3Client({
  region: "auto",
  endpoint: "https://fly.storage.tigris.dev",
});

const fileStream = fs.createReadStream("Docker.dmg");
(async () => {
  const upload = new Upload({
    params: {
      Bucket: "foo-bucket",
      Key: "Docker-100.dmg",
      Body: fileStream,
    },
    client: client,
  });

  await upload.done();
})();
require "aws-sdk"

bucket_name = "foo-bucket"

s3 = Aws::S3::Client.new(
    region: "auto",
    endpoint: "https://fly.storage.tigris.dev",
)

# List the first ten objects in the bucket
resp = s3.list_objects(bucket: 'foo-bucket', max_keys: 10)
resp.contents.each do |object|
    puts "#{object.key} => #{object.etag}"
end

# Put an object into the bucket
file_name = "bar-file-#{Time.now.to_i}"
begin
    s3.put_object(
        bucket: bucket_name,
        key: file_name,
        body: File.read("bar.txt")
    )
    puts "Uploaded #{file_name} to #{bucket_name}."
rescue Exception => e
    puts "Failed to upload #{file_name} with error: #{e.message}"
    exit "Please fix error with file upload before continuing."
end
import boto3

# Create S3 service client
svc = boto3.client('s3', endpoint_url='https://fly.storage.tigris.dev')

# List buckets
response = svc.list_buckets()

for bucket in response['Buckets']:
    print(f'  {bucket["Name"]}')

# List objects
response = svc.list_objects_v2(Bucket='foo-bucket')

for obj in response['Contents']:
    print(f'  {obj["Key"]}')

# Upload file
response = svc.upload_file('bar.txt', 'foo-bucket', 'bar.txt')

# Download file
response = svc.download_file('foo-bucket', 'bar.txt', 'bar-downloaded.txt')
package main

import (
	"context"
	"log"
	"os"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
	sdkConfig, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		log.Printf("Couldn't load default configuration. Here's why: %v\n", err)
		return
	}

	// Create S3 service client
	svc := s3.NewFromConfig(sdkConfig, func(o *s3.Options) {
		o.BaseEndpoint = aws.String("https://fly.storage.tigris.dev")
	})

	file, err := os.Open("bar.txt")
	if err != nil {
		log.Printf("Couldn't open file to upload. Here's why: %v\n", err)
		return
	} else {
		defer file.Close()
		_, err = svc.PutObject(context.TODO(), &s3.PutObjectInput{
			Bucket: aws.String("foo-bucket"),
			Key:    aws.String("bar.txt"),
			Body:   file,
		})
		if err != nil {
			log.Printf("Couldn't upload file. Here's why: %v\n", err)
		}
	}
}

Global Reach, Familiar S3 API

Leverage our S3-compatible API for a seamless transition and enhanced object storage experience.

  • Ensures your data is available everywhere you need it, without geographical limitations.

  • Seamlessly integrates with existing applications via standard AWS S3 SDKs and libraries.

  • Provides free data egress ensuring seamless access to your data when and where you need it.

Quickly and easily migrate data from other cloud providers

Transparently migrate the data from an existing S3-compatible storage to Tigris without any downtime. Start serving frequently accessed objects from Tigris without waiting for full migration.

Migration Documentation

It's Easy to Get Going

user icon

Signup for an account

To use Tigris, you need a Fly.io account. If you don’t already have one, you can get yourself one here.

Log in to your Tigris account

Create a bucket

Every object in Tigris is stored in a bucket. Before you can store data in Tigris, you have to create a bucket. Buckets are global, and we automatically store the data close to your users. If your users move to a different region, the data moves with them.

Create a bucket
click icon

Start building

Now that you have created a bucket, you are ready to store objects in it. An object can be any kind of file: a text file, a photo, a video and so on. Choose from a wide range of S3 tools, libraries, and extensions.

SDK Docs
Start building

Usage in Numbers.

1PB+
of storage
1B+
objects
250M+
requests per day
1K+
buckets

Knowledge Hub

How does Tigris ensure data accessibility around the world?

In Tigris, buckets are inherently global entities. This means that the objects within your bucket are stored in the region where the initial requests are made. To optimize performance and reduce latency, these objects are intelligently distributed to other regions based on the access patterns observed over time.

Tell me more about the S3-compatible API. How does it work?

Tigris is compatible with the AWS S3 API. This means that you can use the standard AWS S3 SDKs, tool and libraries with Tigris. See the S3 API Compatibility section in our docs for more details. We also have language specific guides on how to use the AWS S3 SDKs with Tigris.

How do I signup and get access to Tigris?

Simply sign up through the web console or CLI. See the Getting Started section in our docs for more details.

What is Tigris pricing like?

Tigris pricing is designed so that you only pay for what you use. The pricing is based on the amount of data stored, and the number of requests made. We don't charge for regional data transfer, region-to-region data transfer, or data transfer out to the internet (egress). You can read more about our pricing and free allowance in the Pricing guide.

Ready to embark on your journey with Tigris?

Get started