,
provider_name: &'static str,
) -> Self
```
Anyone have an idea of why the dispatch failure may be happening on Tigris? (216 words)
- [What does Tigris consider a small object? - Tigris](/content/community/m/1463623668147163248/index.html): In order to evaluate if Tigris would be suited for a project I am working on, I need to know how big a small object can be. Ideally objects up to 8 KiB would be inlined for my use case. Thanks! (180 words)
- [Error copying object in Tigris - Tigris](/content/community/m/1463622221074272405/index.html): I have run into a problem doing a copy in Tigris. I’m using Elixir with the latest versions of `ex_aws` and `ex_aws_s3`.
```elixir
from_bucket = "my-bucket"
to_bucket = from_bucket
from_key = "landing/file.txt"
to_key = "archive/file.txt"
ExAws.S3.put_object_copy(
to_bucket,
to_key,
from_bucket,
from_key
)
|> ExAws.request()
```
Running this in S3 works fine. In Tigris I get 10 failed attempts and then this error:
```elixir
{:error,
{:http_error, 500,
"\nInternalErrorWe encountered an internal errors, please try again./my-bucket/archive/file.txt...archive/file.txtmy-bucket"}}
```
Other operations have been working with this bucket, so it doesn’t seem to be a credentials issue.
```elixir
Application.get_all_env :ex_aws
[
s3: [scheme: "https://", host: "fly.storage.tigris.dev", region: "auto"],
region: [{:system, "AWS_REGION"}, :instance_role],
debug_requests: true,
secret_access_key: "...",
json_codec: Jason,
access_key_id: "..."
]
``` (214 words)
- [Golang Tigris Secrets - Tigris](/content/community/m/1463624003582296167/index.html): Hi, I am trying to set up Tigris, and I follow along the tutorial displayed on the Tigris page.
I set up the storage, I set up secrets, and I try to do a simple listing of the buckets from Tigris. For some reason that I do not know, Tigris does not read the secrets properly. I have tried printing the secrets myself to see if they are there and they are; I used `fly ssh console -C "printenv"`. I then tried to print the secret directly from Go with:
```go
log.Println(os.Getenv("AWS_ACCESS_KEY_ID"))
```
and it works.
```go
sdkConfig, err := config.LoadDefaultConfig(context.TODO())
```
→ This fails to get my secrets. Can anyone help me understand why this fails.
```go
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")
o.Region = "auto"
})
result, err := svc.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{Bucket: aws.String("bucketName")})
if err != nil {
log.Printf("Unable to list buckets. Here's why: %v\n", err)
}
log.Println("Contents:")
for _, b := range result.Contents {
log.Printf("key=%s size=%d\n", aws.ToString(b.Key), b.Size)
}
``` (285 words)
- [Struggle to deploy a new Rails application (Litestream + Tigris) - Tigris](/content/community/m/1463626059059564700/index.html): `fly launch` is failing for me
This has worked before, I’m wondering if something off.
Here is the application I’m trying to deploy.
Repository: **somaliska_svenska_kompis_klubben** – a project for contributing to its development. (494 words)
- [Celery worker - Tigris](/content/community/m/1463622807781900372/index.html): I have a Django app running on one machine and a Celery worker on another.
The Django app uploads files to a folder, and I need to access these files from the Celery task.
How can I do this? Can files on one machine be accessed from another? (195 words)
- [Bucket policy support - Tigris](/content/community/m/1463622577531387975/index.html): Hello! Currently, the documentation states that we can use IAM policies for buckets ([Authentication & Authorization | Tigris Object Storage Documentation](https://www.tigrisdata.com/docs/concepts/authnz/#authorization)).
But when I try to do that it gives me the following error:

How can I attach policies to buckets? Or create policies using the AWS CLI? (275 words)
- [fly.storage.tigris.dev blocked/flagged by Bitdefender - Tigris](/content/community/m/1463625849503744072/index.html): I’ve seen previous posts about [tigris.dev](http://tigris.dev) being flagged due to a bad actor hosting malicious material there, but it seems this issue is still present.
Also, I only discovered the error today, even though it’s been around for months. I’m using Tigris storage buckets in my app, and Bitdefender on Windows 10 is flagging it (only as of today):

How can this be fixed? I’ve tried adding exceptions to Bitdefender, but nothing works except disabling all protections. This is really unacceptable… What are the possible work‑arounds? (434 words)
- [Changelog | Tigris Object Storage Documentation](/content/docs/changelog/index.html) (3,197 words)
- [Posts tagged "Customers" | Tigris Object Storage](/content/blog/tags/customers/index.html): Posts tagged "Customers" (292 words)
- [How to sync new upload files URL to my database with Tigris? - Tigris](/content/community/m/1463624277478740165/index.html): Hey 👋 I have set up file upload on my app, it works well but I’m not an expert with that. At work with AWS, every time a user uploads to S3 it triggers a Lambda function to update our DB with the new upload file.
How can I achieve this with Tigris?
Should I do it this way?
- The user gets a signed URL
- Then the user uploads the file to the signed URL
- Then the front end calls an endpoint to get the last uploaded file and retrieve the information to be saved in the DB (`GetObjectCommand`)
My app uses Bun, Hono and Turso btw.
I like Fly and Tigris, really easy to use 😍 (336 words)
- [fly storage list doesn't include buckets created in the web dashboard - Tigris](/content/community/m/1463622347125690418/index.html): I initially created my bucket using `fly storage create`. After that, I created buckets using the dashboard. I noticed today that those extra buckets don’t appear in `fly storage list` output, and I believe they need to in order for me to delete them. (110 words)
- [aws s3 ls returns unexpected results in Tigris - Tigris](/content/community/m/1463623815438401813/index.html): I ran into some unexpected behavior that might be a bug with Tigris.
I’ve been uploading files to a bucket in Tigris using Elixir and then using the AWS CLI to validate that the files were uploaded successfully. As you know, when you run `aws s3 ls s3://bucket/path/` you have to include the trailing slash to have the AWS CLI expand that “directory” and show its contents.
**Typical behavior**
```text
# without trailing slash
aws s3 ls s3://bucket/path
PRE path/
# with trailing slash
aws s3 ls s3://bucket/path/
file1.json
file2.json
...
file10.json
```
This is typically how it works for me with Tigris as well, but I have a case where running `aws s3 ls s3://bucket/path` without the trailing slash instead shows the first item in that path. Then if I run it again with the trailing slash, I see that first file and all of the other files as well.
**Unexpected behavior**
```text
# without trailing slash
aws s3 ls s3://bucket/path
file1.json
# with trailing slash
aws s3 ls s3://bucket/path/
file1.json
file2.json
...
file10.json
```
The bucket and path can be provided privately. (279 words)
- [Supabase Storage → Tigris Issue, "No Such Host" - Tigris](/content/community/m/1463624926262198495/index.html): I'm looking to move from the S3 compatible Supabase Storage to Tigris Data, but am seeing this error from Tigris' “Enable Data Migration” feature in the web UI:
```
Get "https://[supabase_bucket_name].[supabase_project_reference_id].co/storage/v1/s3?delimiter=&list-type=2&max-keys=1&prefix=": dial tcp: lookup [supabase_bucket_name].[supabase_project_reference_id].supabase.co on [fdaa::3]:53: no such host
```
Screenshot of set‑up in the UI:

I have no issues accessing the Supabase Storage bucket using the S3 credentials via Cyber/Mountain Duck and also using the higher‑level credentials via Supabase’s Python library.
What have I missed? (215 words)
- [Object Notifications | Tigris Object Storage Documentation](/content/docs/buckets/object-notifications/index.html): Tigris object notifications allow you to receive notifications via a webhook. (606 words)
- [Tigris Regions and x-tigris-regions header - Tigris](/content/community/m/1463623940235595809/index.html): Hey!
I have both a request and a question about Tigris regions.
The regions page for Tigris mentions Tigris is deployed in Singapore. I have a server in Singapore which [debug.fly.dev](http://debug.fly.dev) shows hitting SIN:
```
=== Headers ===
Host: debug.fly.dev
Fly-Request-Id: 01J16MRRX4PZYF27K629PY04A9-sin
…
Fly-Region: sin
```
However, in the Grafana Metrics Panel for Tigris I don’t see any requests hitting the `sin` location. It would be really nice if there was more information exposed in Tigris’s response headers (edge location hit, storage location retrieved from) for debugging. Based on the latency (~250 ms) even after a few requests to a 10 KB object, I assume I’m going somewhere else. I do ~1‑2 ms when ICMP pinging the Tigris endpoint directly.
Secondly, I forced my object to be in all regions via the `x-tigris-regions` header, and I see some curious information being returned sometimes:
```
< x-tigris-regions: fra,syd,sjc,hkg,jnb,lhr,mad,iad,ord,gru,nrt
```
*Sometimes without `sin`?*
```
< x-tigris-regions: fra,gru,jnb,nrt,mad,hkg,iad_mr,ord,lhr,syd,sjc_mr
```
*Sometimes with `_mr`?*
```
< x-tigris-regions: fra,sjc_mr,sin,gru,syd,iad,ord,jnb,lhr,nrt,mad
```
*Sometimes `sin` comes back?*
What’s with that, and what does `_mr` mean?
Thanks for your help! (324 words)
- [Does Tigris charge for 403/Unauthorized bucket access request? - Tigris](/content/community/m/1463623416287461528/index.html): I know Tigris offers that they can cut down the bill in case of an attack, but I’d still like to know if requests that result in a 403, for example, are billed to the user. Here’s an example: [scenario](https://medium.com/@maciej.pocwierz/how-an-empty-s3-bucket-can-make-your-aws-bill-explode-934a383cb8b1).
Also, to clarify on the egress pricing, what are the minority cases you mean when you say:
> we don’t charge for regional data transfer, region‑to‑region data transfer, or data transfer out to the internet (egress) in the majority of use cases
I’d like to know if I have services within [fly.io](http://fly.io) and Azure, whether a request from Azure Functions will incur an egress fee. It just seems unclear with that statement, and I don’t want a surprise bill since I’m comparing using Tigris with Cloudflare R2 (which, from calculations, appears cheaper than Tigris and Linode/Akamai). (194 words)
- [Configuring Tigris via the API - Tigris](/content/community/m/1463624066630942822/index.html): I am attempting to set up and configure a bucket in Tigris using the API. I have a bucket created and am trying to curl it with this:
```bash
curl -f https://fly.storage.tigris.dev/mybucket.example.com \
--aws-sigv4 \
--user $AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY \
-X PATCH \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "x-amz-acl: public-read" \
--data-raw '{"cache_control":"", "website":{"domain_name": "mybucket.example.com"}, "object_regions": "","additional_http_headers":""}' \
-i
```
However I get the following error from curl:
```text
curl: (22) The requested URL returned error: 403
curl: (3) URL rejected: Port number was not a decimal number between 0 and 65535
```
I’ve replaced the credentials several times to ensure they are correct and they definitely have admin access to the bucket.
I’m also wondering if I can configure the shadow bucket options via the API, and if so, how? (151 words)
- [Presigned PUT Fails With 403 - Tigris](/content/community/m/1463627191186231483/index.html): Hi,
I am creating pre‑signed PUT URLs in my app and getting **403 Forbidden** errors.
When creating URLs via the Tigris dashboard they look like:
```
https://files.allaboutholes.vip/import-jobs.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...&X-Amz-Date=20251107T020219Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=...
```
When creating URLs via the application code below I get this shape:
```javascript
const endpoint = 'https://fly.storage.tigris.dev';
const bucketName = 'holehub-dev';
const forcePathStyle = false;
const deleteAfter = new Date(Date.now() + 1000 * 60 * 60);
const s3Client = new S3Client({
region: 'auto',
endpoint,
credentials: { accessKeyId, secretAccessKey },
forcePathStyle,
});
const signedUrl = await getSignedUrl(
s3Client,
new PutObjectCommand({
Bucket: bucketName,
Key: '/jobs/imports/uploads/01K9E0WRQT8P0DM5GX65NZWXB2.csv',
Expires: deleteAfter,
ContentLength: fileSize,
}),
{ expiresIn: 3600 },
);
```
Resulting URL:
```
https://holehub-dev.fly.storage.tigris.dev/jobs/imports/uploads/01K9E0WRQT8P0DM5GX65NZWXB2.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=...&X-Amz-Date=20251107T020358Z&X-Amz-Expires=3600&X-Amz-Signature=...&X-Amz-SignedHeaders=host&x-id=PutObject
```
The dashboard‑generated URL works, but the S3 client‑generated one returns:
```
HTTP/1.1 403 Forbidden
Content-Length: 433
Content-Type: application/xml
...
SignatureDoesNotMatch
The request signature we calculated does not match the signature you provided. Check your key and signing method.
/jobs/imports/uploads/01K9E0WRQT8P0DM5GX65NZWXB2.csv
1762481194277975954
```
What could be wrong? I’m familiar with presigned URLs but new to Tigris. (186 words)
- [Posts tagged "agents" | Tigris Object Storage](/content/blog/tags/agents/page/2/index.html): Posts tagged "agents" (45 words)
- [Having troubles with tigris bucket for a few different url_prefixes - Tigris](/content/community/m/1463625555189432490/index.html): I’m having issues serving various static assets (based on the *url_prefix*) from a single Tigris bucket.
When I define only one `tigris/storage` rule in the `toml` file, the assets are served from the Tigris bucket.
```toml
primary_region = "lhr"
[build]
[http_service]
internal_port = 3000
force_https = true
auto_stop_machines = "stop"
auto_start_machines = true
min_machines_running = 0
processes = ["app"]
[[statics]]
guest_path = "/client-assets/assets"
url_prefix = "/assets"
tigris_bucket = "my-bucket"
[[vm]]
memory = "1gb"
cpu_kind = "shared"
cpus = 1
```
But when I add an additional Tigris rule, only the second rule takes effect. For example, with this `toml`:
```toml
primary_region = "lhr"
[build]
[http_service]
internal_port = 3000
force_https = true
auto_stop_machines = "stop"
auto_start_machines = true
min_machines_running = 0
processes = ["app"]
[[statics]]
guest_path = "/client-assets/assets"
url_prefix = "/assets"
tigris_bucket = "my-bucket"
[[statics]]
guest_path = "/client-assets/brand"
url_prefix = "/brand"
tigris_bucket = "my-bucket"
[[vm]]
memory = "1gb"
cpu_kind = "shared"
cpus = 1
```
Files from the **brand** folder are served from the Tigris bucket, while those from **assets** are not.
Am I doing something wrong here? (279 words)
- [Docker & Tigrisfs - Tigris](/content/community/m/1463626981563433205/index.html): Hello,
I set up tigrisfs locally, and now I’m trying to set it up in a Docker container on Render. However, I’m running into issues. I managed to get as far as here with a Dockerfile and `start.sh`:
```dockerfile
FROM python:3.11-slim-bookworm
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
RUN playwright install-deps
RUN playwright install
RUN apt-get update && \
apt-get install -y automake autotools-dev g++ git libcurl4-gnutls-dev libfuse-dev && \
apt-get install -y wget tar curl jq rclone s3fs mailcap fuse3 gvfs-fuse && \
wget https://github.com/tigrisdata/tigrisfs/releases/download/v1.2.1/tigrisfs_1.2.1_linux_amd64.tar.gz -O /app/tigrisfs.tar.gz && \
tar -xzf /app/tigrisfs.tar.gz && \
apt-get clean
COPY . .
RUN mkdir -p /app/vol
#RUN /app/tigrisfs test /app/vol
RUN ls -lA /app # C
RUN chmod +x /app/start.sh
RUN chmod +x /app/tigrisfs
#ENTRYPOINT ["/app/tigrisfs"]
ENTRYPOINT ["/app/start.sh"]
#CMD ["timeout", "15m", "python3", "app.py"]
CMD ["test", "/app/vol"]
```
```bash
#!/bin/bash
# 1. Check if the mount directory exists and is a directory
if [ ! -d "$2" ]; then
echo "Mount directory $2 does not exist."
exit 1
fi
# 2. Start TigrisFS mount in the BACKGROUND (&)
# This uses the arguments passed to the script: $1 (bucket) and $2 (mount point)
echo "Starting TigrisFS mount for $1 at $2..."
/app/tigrisfs --debug --debug_fuse --debug_s3 "$1" "$2" &
# 4. Wait for the mount to stabilize (Optional but safer for FUSE)
sleep 5
ls
df -h
# 5. Start your main Python application in the FOREGROUND
# This command will block, keeping the container running.
echo "Mount established. Starting Python script..."
python /app/app.py
# 7. Exit with the Python script's exit code
exit $?
```
However, the bucket is still not mounting (as seen by the output of `df -h`), and `app.py` cannot read the text file. Does anyone know what I’m missing to make this work? (417 words)
- [Feature Request: flyctl storage attach/detatch - Tigris](/content/community/m/1463622430798123204/index.html): The option to run something like **attach** and **detach**, similar to Postgres, would be a nice QoL improvement for using the Tigris buckets or moving a bucket from one project to another from the command line. (82 words)
- [Getting Started Using Tigris + .NET AWS SDK - Tigris](/content/community/m/1463622975856050401/index.html): I’m running into issues with some basic requests using the .NET AWS S3 client and tigris.
The examples only have `ListBuckets` and `ListObjectsV2` usage and `ListBuckets` does return my newly created bucket name, so it appears that the client is configured properly (it’s able to get a correct response from the API). However, when I try to `PutObject` the request hangs and eventually fails with an `IOException` “The response ended prematurely”. Not really sure how to begin debugging this one. The request is straightforward with the bucket name, key (`test`), and content body (`test`). (136 words)
- [Can you have two Tigris buckets in an app? - Tigris](/content/community/m/1463626311301071051/index.html): If I already have one bucket, `my-app-bucket-1`, in an app, then:
```bash
fly --app my-app storage create --name my-app-bucket-2
```
returns
```
Error: A Tigris project named my-app-bucket-1 already exists for app my-app
```
If I can’t have two buckets in the same Fly app, then would there be any problems/conflict with connecting both [TigrisFS](https://www.tigrisdata.com/docs/training/tigrisfs/) (for non-database files) and [Litestream](https://litestream.io/) (for a SQLite database that’s at a different local path than the one mounted to TigrisFS) to the same bucket? Would they automatically use differently named objects within the bucket and stay out of each other’s way? (309 words)
- [Using a custom domain for Tigris storage - Tigris](/content/community/m/1463622682984845596/index.html): I’m evaluating using Tigris in a project.
Is it possible to use a custom domain for a Tigris bucket for publicly served buckets?
For example, if I have the link:
```
https://fly.storage.tigris.dev/my-bucket/my-image.png
```
Can I use a custom domain to make this URL:
```
https://images.mydomain.com/my-image.png
```
Can I use a simple `CNAME` record on my domain to make this happen, or does Tigris do something to make this not possible? (142 words)
- [tigris presigned urls give access denied (using ExAws) - Tigris](/content/community/m/1463626541228626086/index.html): When I try to upload a presigned URL using ExAws, I get a URL like:
```text
https://(url)?...
```
The image uploads correctly to the bucket, but when I later try to display it on my page I receive an **AccessDenied** error.
The problem is that the generated URL places the bucket name **after** the domain instead of as a sub‑domain.
I can fix this by adding the parameter `virtual_host: true` to the `presigned_url` call, which makes the bucket name appear in the sub‑domain, allowing the file to be accessed via the URL. However, using this option causes an error during the upload process:
```text
create:1 Access to XMLHttpRequest at '(url)' from origin 'https://(url)' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
app-368ae2410464362c35571e4889b79eb8.js?vsn=d:721 PUT https://[PRESIGNED_URL] net::ERR_FAILED
(anonymous) @ app-368ae2410464362c35571e4889b79eb8.js?vsn=d:721
S3 @ app-368ae2410464362c35571e4889b79eb8.js?vsn=d:721
initAdapterUpload @ app-368ae2410464362c35571e4889b79eb8.js?vsn=d:714
...
```
Any ideas on how to make this work? (295 words)
- [Using both AWS and Tigris in one application - Tigris](/content/community/m/1463624884260438088/index.html): Much like [this question](https://community.fly.io/t/how-to-handle-two-different-aws-access-key-id-with-aws-and-tigris-object-store/21216/1)… I’m hoping to use AWS *and* Tigris. How am I supposed to configure the AWS credentials I use to interact with S3 proper, alongside the AWS credentials used to interact with Tigris? (151 words)
- [Recursively Download from a Shadow Bucket - Tigris](/content/community/m/1463624150391197890/index.html): I have a shadow bucket setup that we are using to mirror objects from S3. I need to download all objects under a specific prefix but I get a 404 unless I download a specific object. Is it possible to do this with a shadow bucket? (234 words)
- [Tigris support for lifecycle rules? - Tigris](/content/community/m/1463624339047059568/index.html): 👋
I see on the [Tigris docs](https://www.tigrisdata.com/docs/api/s3/) it supports `PutBucketLifecycleConfiguration`.
However, when I try to put an expiration lifecycle rule on my bucket I get an error:
```xml
NotImplementedA header you provided implies functionality that is not implemented/1724964649093304104***
```
Can you please clarify if lifecycle rules are supported and, if so, which rules are supported? 🙏 (107 words)
- [Twi Posts - Tigris](/content/community/u/201841370023985153/index.html): See posts from Twi in the Tigris Discord (45 words)
- [Using fly statics with Tigris serving static assets really slow - Tigris](/content/community/m/1463626625311707230/index.html): We’re using the `[[statics]]` section to [serve up static assets from tigris](https://fly.io/docs/reference/configuration/#serving-statics-from-tigris-object-storage). However, requests to those static assets take anywhere from 1 seconds to 21 seconds, and it doesn’t seem to get quicker (hoping it would be cached on read).
The pertinent config looks like this:
```toml
[[statics]]
guest_path = "/"
url_prefix = "/app"
tigris_bucket = "{bucket-name}"
index_document = "index.html"
```
Are we missing some cache config on the Tigris or Fly side to make this faster? Or is there a better way to accomplish what we’re doing? (358 words)
- [Migration finalization - Tigris](/content/community/m/1490946248273039513/index.html): Is there a way to get a report of which objects have not been migrated? Better yet, is there a method to migrate objects without downloading them to the client? (265 words)
- [unsuccessful command flyctl ext tigris create - Tigris](/content/community/m/1463626478322454692/index.html): Hello
I've just set up a [fly.io](http://fly.io) account and added my backend repo. My backend uses S3, however fly.io tries to automatically use Tigris. I don't even want to use Tigris, but there is nowhere in the UI to turn it off, and whenever my deployment gets to provisioning Tigris, it fails with the error: unsuccessful command `flyctl ext tigris create`.
How can I resolve this?
I have also tried accepting the Tigris ToC just to at least get my app running with Tigris, but I'm stuck in a broken flow where fly tries to use Tigris because I use S3 and I can't configure it and stop it because it isn’t properly deployed for the first time yet.
Any help is appreciated, thanks. (314 words)
- [automatically adding trailing slashes when serving static files from Tigris S3 - Tigris](/content/community/m/1463624716924227655/index.html): I've used statics to serve static web pages out of Tigris. It works for URLs that end in a slash, but ones that don’t fail, and the logs never see them reaching my Nginx server. Am I wrong about how this works? I expected that incoming requests were first handled by Fly directly, based on my `statics` setting of `tigris_bucket`, `index_document`, etc., and that if there was nothing matching in the bucket, the request would come to my Nginx server. Is that wrong?
My plan is to have Nginx redirect when it receives URLs without trailing slashes, but Nginx has to get control in order to do that. (336 words)
- [Upload zip file to Tigris - Tigris](/content/community/m/1463623584554684476/index.html): Hi
Is it possible to upload a zip file from the client/browser (using a presigned URL), which will then be unzipped and each file stored as separate objects in Tigris? The intent is to achieve faster uploads from the client. (104 words)
- [Question about custom domain and t3.storage.dev - Tigris](/content/community/m/1463626373351346352/index.html): I see you guys are now suggesting to use [t3.storage.dev](http://t3.storage.dev) as the endpoint for anything that doesn’t run inside the Fly network. I have users all around the world accessing my buckets using a custom domain. These custom domains were set with the suggested CNAME which seems to point to [fly.storage.tigris.dev](http://fly.storage.tigris.dev), which according to the new UI is the endpoint optimized for Fly Apps.
So… how can I use the default endpoint for high performance across all cloud providers and regions when using a custom domain? Or is that not possible? Should I switch to using the new [t3.storage.dev](http://t3.storage.dev) endpoint instead of my custom domain if I want to take advantage of this high performance? (248 words)
- [How to opt into virtual hosts for existing buckets - Tigris](/content/community/m/1463625577264320552/index.html): I noticed that [Tigris](https://www.tigrisdata.com/blog/virtual-hosted-urls/) defaults to virtual hosts for new buckets, but nothing is mentioned about the migration for existing buckets. I tried to interact with one of our existing buckets using a virtual host, but the request fails, so I’d appreciate any pointers to adopt the new convention.
Thanks in advance. (214 words)
- [Tigris setting bucket path in client - Tigris](/content/community/m/1463627338452566140/index.html): Hi – I'm reading through the [Tigris examples](https://www.tigrisdata.com/docs/sdks/tigris/examples/#multipart-upload) and I'm a bit confused by how they implemented their multipart upload strategy. It seems that the path is sent from the client to the server in their example. Is this not something that should be set server‑side for security (e.g. `tenants/tenantId/files/content`)? Maybe I'm missing something, but I ran into errors when I tried to set the path from the server. Thanks! (259 words)
- [Cannot install sprites CLI. Tigris bucket unreachable from spain during LaLiga matches - Tigris](/content/community/m/1463627547672580169/index.html): Unable to install sprites CLI.
```bash
curl -fsSL https://sprites.dev/install.sh | bash
✗ Fetching latest version
Error: Network error: could not connect to https://sprites-binaries.t3.storage.dev
```
Then checked the docs; [this section](https://docs.sprites.dev/cli/installation/#manual-installation) gave hope but it has a broken link to GitHub Releases. I looked for sprite repos under the project's GitHub and couldn’t see one for the CLI.
So I’m out of ideas. (201 words)
- [Cannot delete an old Fly.io account - Tigris](/content/community/m/1463624380797030433/index.html): I am trying to delete my old [Fly.io](http://Fly.io) account but it won’t let me due to a linked Tigris bucket that needs to be destroyed. However, every time I attempt to destroy the bucket I get an error even though it appears to exist:
*Error: input:3: deleteAddOn The specified bucket does not exist* (85 words)
- [CompleteMultipartUpload - can it return error on 200 OK like S3 can? - Tigris](/content/community/m/1496914635646042214/index.html): So it turns out that S3 can theoritically return a 200 OK for a CompleteMultipartUpload call, but still return an error in the body, which is insane, but here we are: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html
Does Tigris have this same behavior? I guess in general, should I always be parsing the XML responses from S3 calls to look for errors, or can I rely on a 200 OK meaning we have successfully completed the request? (201 words)
- [Can't use the same statics guest_path for separate url_prefixes? - Tigris](/content/community/m/1463626813828894810/index.html): I originally deployed my app with the configuration set to serve static files from Tigris at one URL prefix, which has been working fine:
```toml
[[statics]]
# Also serve them at the legacy path for the mobile apps
url_prefix = "/aci/uploads"
guest_path = "/uploads"
tigris_bucket = "appname-media"
```
However, I subsequently added a second path for compatibility reasons and it just 404s at the **/uploads** path. Meanwhile **/aci/uploads** is still functioning fine.
```toml
[[statics]]
# Serve media files directly from Fly's web proxy
url_prefix = "/uploads"
guest_path = "/uploads"
tigris_bucket = "appname-media"
[[statics]]
# Also serve them at the legacy path for the mobile apps
url_prefix = "/aci/uploads"
guest_path = "/uploads"
tigris_bucket = "appname-media"
```
It looks like the 404 is coming from my application server rather than Fly’s edge. So it seems Fly’s edge proxy is ignoring that path and not intercepting the requests for it.
Any help is very welcome. (154 words)
- [How does Tigris caching work with content-range requests - Tigris](/content/community/m/1463624653615399044/index.html): I’m curious how content‑range requests work with Tigris caching in other regions.
Let’s say I upload a file in North America and then request only a fraction of the file in Europe. Will the cache only cache the fraction requested in the EU, or will it proactively cache the entire file? If the latter is true, will my content‑range request be delayed while the entire file is copied to the EU, or will I get a response as soon as the partial response is ready?
Thanks! (173 words)
- [Question about bandwidth pricing, Machines and Tigris - Tigris](/content/community/m/1463625513129218084/index.html): Say I have a web service running on a Fly App that receives files from users and stores them on a Tigris bucket.
How’s the bandwidth pricing calculated and billed for this operation?
According to the [pricing page](https://fly.io/docs/about/pricing/), inbound data is free. So a user uploading a 1‑GB file to the web service won’t be billed.
The docs also say that data transfer to Tigris Object Storage is also free, so the 1‑GB transfer from the Fly machine to the Tigris bucket is also free.
Is this correct?
Are there any billed data transfers I’m missing here?
Thanks (136 words)
- [API for configuring S3 bucket notifications programmatically? - Tigris](/content/community/m/1463627254608302194/index.html): Hi, I have a Tigris question about creating bucket notifications programmatically.
We’re building a multi-tenant application on [Fly.io](http://Fly.io) using Tigris for object storage. We provision one bucket per tenant (currently ~100 tenants, scaling to 1000+), and we’d like to use S3 event notifications to trigger real‑time sync operations.
I’ve read the blog post about object notifications ([https://www.tigrisdata.com/blog/how-we-built-object-notifications/](https://www.tigrisdata.com/blog/how-we-built-object-notifications/)) and the docs ([https://www.tigrisdata.com/docs/buckets/object-notifications/](https://www.tigrisdata.com/docs/buckets/object-notifications/)). I’m trying to understand:
- Is there an API to configure bucket notifications programmatically?
- We need to configure notifications when creating each tenant bucket via code.
- Standard S3 APIs like `PUT /?notification` or boto3’s `put_bucket_notification_configuration`?
The only way I have seen to configure notifications so far is the admin console, but that isn’t practical for buckets that get created dynamically.
Thanks. (197 words)
- [OBJECT_CREATED_PUT on object deletion - Tigris](/content/community/m/1463625807640662168/index.html): When I delete an object from my Tigris bucket, the webhook payload specifies the event as `OBJECT_CREATED_PUT`. Shouldn’t it be `OBJECT_DELETED`? (101 words)
- [Tigris webhooks not firing? - Tigris](/content/community/m/1463626834720723038/index.html): Are Tigris webhooks currently down for anyone else? According to the logs, webhooks stopped being received sometime between 2025‑08‑15 18:55:34.652235 +00 UTC and 2025‑08‑18 20:00:07.191308 +00 UTC (so between August 15th and August 18th). (74 words)
- [Tigris Webhooks and Flycast - Tigris](/content/community/m/1463625764845912066/index.html): Are Tigris webhooks able to hit Flycast URLs, or will it result in a DNS resolution failure?
I’m currently spec‑ing out an image processing pipeline, where images get uploaded to Tigris via presigned URLs, get processed by a Fly app only available via Flycast, and then get moved to a final destination bucket. I don’t think I can fully avoid polling, but I’d like to minimize it if I can. (156 words)
- [Metallized Posts - Tigris](/content/community/u/399431430188302338/index.html): See posts from Metallized in the Tigris Discord (119 words)
- [Cannot access objects from public tigris bucket - Tigris](/content/community/m/1463626268611186860/index.html): Hello,
I created a bucket on Tigris and made it public. When I (or my app) navigate to any object of the bucket (images) I get **Access denied (403)**.
Any ideas about what could be going on? (105 words)
- [Having multiple buckets (one public, one private) in Tigris for one Fly app - Tigris](/content/community/m/1463627170365575244/index.html): Hello
My initial idea was to use one private Tigris bucket with a public prefix—something achievable in S3 with a bucket policy configuration. Looking at the Tigris documentation, that doesn’t appear possible. It seems I would need to either use an [object ACL](https://www.tigrisdata.com/docs/objects/acl/) and set the ACL for each object, or use a public bucket. For my case, the latter makes more sense.
The problem is that I cannot find a way to have two buckets in one application:
```bash
❯ fly storage create --public --name public-named-bucket
Error: A Tigris project named previous-bucket-name already exists for app existing-app-name
```
I can create a bucket in the Tigris dashboard, but it appears in my organization, and I don’t see a way to add it to the application. I could create a new key in Tigris and configure it programmatically in the app, but it feels odd that the bucket will appear in the org without being linked to the app. Is there any way to achieve this? (214 words)
- [Tigris Billing for inbound data from Fly→Tigris - Tigris](/content/community/m/1463625681425535230/index.html): Hi there! I am migrating a Cloudflare R2 bucket with about 4 TB over to Tigris archived storage. From what I understood, I would not be billed for data transfer from Fly into Tigris.
Currently, I am using Fly machines with rclone to migrate the data, and it appears I am being billed in Fly for the outbound data transfer. Am I missing something? (252 words)
- [I cannot open the tigris bucket from fly.io - Tigris](/content/community/m/1482784707820257475/index.html): Retrieving authentication status...
Looks like you don't have access to the Org or the Org doesn't exist.
Redirecting in 2s...
Do I need somehow to connect Tigris and Fly.io and tell that I am the same user who owns both accounts?
For now, I am just curious to be able to list the objects in the bucket.
Thank you for any hint. (207 words)
- [Object ACLs | Tigris Object Storage Documentation](/content/docs/objects/acl/index.html): Object ACLs (Access Control Lists) are used to control access to individual (266 words)
- [Tigris storage + Cloudflare image resizing suddenly stopped working - Tigris](/content/community/m/1485614655383801906/index.html): Our app uses a Tigris bucket (via Fly.io) to store images, and Cloudflare's image transformations to optimize them. Today, all these images have stopped loading with the error "ERROR 9504: Could not fetch the image - download timed out". Was there a change from Tigris that might block Cloudflare from accessing the bucket? It was working previously and we've made no changes to bucket configuration or any other part of the app...
Example image: https://lively-leaf-6126.fly.storage.tigris.dev/6e7dbe24-49a6-4ca8-9924-35ed6311209e.png
Failing resize URL: https://runelab.ai/cdn-cgi/image/width=1200,height=675,fit=crop,format=auto,gravity=5.0x5.0/https://lively-leaf-6126.fly.storage.tigris.dev/6e7dbe24-49a6-4ca8-9924-35ed6311209e.png (333 words)
- [Question about Tigris bucket access and IAM policies - Tigris](/content/community/m/1463626897467510867/index.html): Hi Tigris community,
I have a question regarding IAM policies.
I currently have an access key that allows me to edit a specific bucket, and I can interact with all resources in that bucket.
Now, if I attach a policy that allows interaction only with a specific path within the bucket, does this policy stack with the existing permissions (and is therefore mostly redundant), or does the policy take precedence?
If the policy takes precedence, then is access to everything allowed by default?
I’m trying to understand the exact behavior so I can safely design workflows with minimal permissions.
Thanks! (209 words)
- [Configure custom domain to Tigris programmatically - Tigris](/content/community/m/1463627086349734071/index.html): Hi, I’m building a CMS and want to generate hundreds of buckets, assigning a custom subdomain to each. I tried setting up the public bucket with cache controls for each file and created the CNAME record in Cloudflare, but it didn’t work. I had to add the new subdomain manually via the Tigris console.
Another idea was to use the Fly CLI and assign a domain via the CLI, but that command only allows creating one bucket per app:
```bash
fly storage create --public
Error: A Tigris project named damp-tree-1234 already exist
```
So this isn’t a suitable solution.
Is there an API from Tigris to set this up programmatically, or perhaps via the S3 SDK?
Thanks. (175 words)
- [console.storage.dev’s server IP address could not be found. - Tigris](/content/community/m/1493248515936354440/index.html): Absolutely no clue what could be causing this, never had an issue like this before. (38 words)
- [Stream wrapper fails on file_get_contents() due to non-seekable stream (Tigris) - Tigris](/content/community/m/1472895888627073139/index.html): Hey guys i was trying to use Tigris for a drupal site using the s3fs module and i get the following issue:
https://www.drupal.org/project/s3fs/issues/3573338
As you can see when i patch the module to allow me to pass by the `response_checksum_validation` option to `aws-sdk-php` my error goes away.
Is this some kind of compatibility issue with the Tigris service? (167 words)
- [SOC2 / Security Assessment - Tigris](/content/community/m/1500095518108549181/index.html): Hi there, I'm taking our company through a SOC2 audit and I was wondering if Tigris has a trust center or a way to get any documents/reports related to compliance and security? I wasn't able to find any details in the docs other than a blog post about SOC2.
Specifically, we're using a platform called Vanta and I have to do assessments for each vendor. They require uploading documents and/or linking to a trust center. If there's anything you can provide, that would be super helpful! Thank you. (196 words)
- [Tigris Consistency Questions - Tigris](/content/community/m/1463625639033831591/index.html): Hi, I am evaluating using Tigris as a distributed storage layer for my application. I plan on storing data in multiple regions globally and will be frequently ‘updating’ objects (new put over already existing objects). I have a few questions about the specifics of Tigris’ multi‑region consistency model.
1. What is the atomicity of a put operation to multiple regions? For example, I try to update an object in the `iad` and `fra` regions. For whatever reason, the put to `fra` fails. *Could* the `iad` put still be executed? Will the put request report a failure?
2. If the `iad` put still goes through, what happens if I then make a get request in the `fra` region with the `x-tigris-cas: true` header set? Would the request get routed to the `iad` region with the stored data that’s been more recently updated? Would Tigris *eventually* update the existing/outdated stored object in the `fra` region?
3. What is the default behavior for a get request with the `x-tigris-cas: true` header when there are multiple copies of data stored? Will it get routed to the closest region with the object stored?
Thanks! (188 words)
- [Cannot create new Tigris bucket - Tigris](/content/community/m/1463625996010913934/index.html): I am unable to create a new storage bucket through either the UI ([Sign in to Your Account · Fly](https://fly.io/dashboard/my-org/tigris)) or CLI.
UI error: `There was an error creating your bucket. Please try again.`
CLI error: `Error: input:3: createAddOn domain name is required`
In the CLI, I tried both selecting the name and leaving it empty, but the problem remains the same. (132 words)
- [Are notifications at least once? - Tigris](/content/community/m/1497647324581728256/index.html): In the docs, it states: "If a 200 status is not received, Tigris will retry for a maximum of 3 times before giving up and marking the notifications as sent." I read that as it will retry three times and then give up without noting an error and instead it will be seen as sent even though it has not been. Am I reading this incorrectly and misunderstanding it? I am considering turning to this pattern for docs that need to move through a pipeline but not having an error state won't work for our use case. (439 words)
- [Deniz A. Posts - Tigris](/content/community/u/249837723416788992/index.html): See posts from Deniz A. in the Tigris Discord (88 words)
- [Katie Schilling Posts - Tigris](/content/community/u/1329861877651603457/index.html): See posts from Katie Schilling in the Tigris Discord (72 words)
- [lethargicgeek Posts - Tigris](/content/community/u/546626488921751552/index.html): See posts from lethargicgeek in the Tigris Discord (92 words)
- [Destroying storage does not remove access keys in the Tigris console - Tigris](/content/community/m/1463627316600246324/index.html): If I destroy the storage using `flyctl storage destroy $APP_NAME --yes --app $APP_NAME` (which was previously created with `flyctl storage create --yes --app $APP_NAME --name $APP_NAME`), the access key remains active in the Tigris console. Is there a way to revoke these tokens, either automatically or manually (e.g., via flags)?
We have an automated preview deployment, so we are accumulating many inactive tokens in the console.
Thanks. (78 words)
- [Can I use forks and snapshots with buckets created on Fly? - Tigris](/content/community/m/1475898191399358474/index.html): I have buckets created with fly storage create can I use forks and snapshots within flyctl? (134 words)
- [Tigris CLI - Provisioning Access keys - Tigris](/content/community/m/1475613410292138267/index.html): I'm making an Agent and want to create a quick access key for it with permission to read and write to a bucket. How can I do this from the CLI? (88 words)
- [Vitalie Posts - Tigris](/content/community/u/605322567321911338/index.html): See posts from Vitalie in the Tigris Discord (87 words)
- [Checksum support on multipart upload S3 compatibility? - Tigris](/content/community/m/1496279895297490995/index.html): Hi Tigris team - does Tigris support the x-amz-checksum methods to validate the uploaded content? I just tried this with CreateMultipartUpload / UploadPart / CompleteMultipartUpload and it seems like the headers are accepted and pushed through, but the data is not rejected with 400 BadDigest if the checksum is mismatched. A regular PutObject with a mismatched Content-MD5 header _does_ return 400 BadDigest, but not with a mismatched crc32.
Is there any way to do checksums on multipart uploads? (327 words)
- [vmg Posts - Tigris](/content/community/u/138497924542758912/index.html): See posts from vmg in the Tigris Discord (157 words)
- [BOM region availability - Tigris](/content/community/m/1493252685720453140/index.html): I'm CTO of a Fintech startup, we already use Fly io and are pretty happy with it, and are really interested in using Tigris storage. But, due to India's DPDP Act and the RBI Payment Data Localization requirements, our company is obligated to store data exclusively in India.
We already use BOM - Mumbai region in fly.io for our workload, so I was expecting that the BOM region would also be available in Tigris, but as far as I can see in the documentation, it is not present.
Can you share when it will be available? And if it is planned to be launched soon, is there any way to enable it for us in some form of beta testing? (433 words)
- [Strong consistency within a global bucket? - Tigris](/content/community/m/1507711750873813114/index.html): Is `X-Tigris-Consistent: true` supported for a "global" bucket?
Alternatively can `X-Tigris-Regions: fra` be specified for both `PUT`s and `GET`s in a global bucket?
I'm looking for a way to guarantee strong consistency for write-then-read across _clients_ in different regions (at the cost of increased latency) for a small subset of keys within a single global bucket. Is this possible? (190 words)
- [Coddo Posts - Tigris](/content/community/u/579646098704957460/index.html): See posts from Coddo in the Tigris Discord (41 words)
- [DNS Issues with t-mobile's default DNS server - Tigris](/content/community/m/1488772742395203644/index.html): I'm not able to access console.storage.dev or t3.storage.dev through t-mobile's network. Is this a known issue? It was working fine last week so something changed. Switching to google's 8.8.8.8 or cloudflare's 1.1.1.1 works fine. Disabling that override and using my cellphone's default DNS (t-mobile) all of my assets are now broken image links. Is Tigris working to resolve this or do I need to work towards a workaround? Thanks! (305 words)
- [da_man_rocks Posts - Tigris](/content/community/u/733958515797917699/index.html): See posts from da_man_rocks in the Tigris Discord (44 words)
- [Tim M Posts - Tigris](/content/community/u/600209551371010060/index.html): See posts from Tim M in the Tigris Discord (100 words)
- [spicy_heck_boi Posts - Tigris](/content/community/u/544621819873984522/index.html): See posts from spicy_heck_boi in the Tigris Discord (185 words)
- [Problem with Cache Control - Tigris](/content/community/m/1521604898641412158/index.html): I don't know if I'm doing something wrong, but when I set a cache-control field on tigris it just ignores it:
```
aws s3 cp \
--content-type "application/json; charset=utf-8" \
--cache-control 'public, max-age=300' \
--metadata-directive REPLACE \
"$MY_FILE" \
"s3://$BUCKET_NAME/$MY_FILE" \
; \
sleep 60
; \
aws s3api head-object \
--bucket "$BUCKET_NAME" \
--key "$MY_FILE" \
--output json |
jq -r '.CacheControl'
# public, max-age=259200, stale-while-revalidate=3600, stale-if-error=600
```
The returned value is the bucket-wide default I have set (Bucket Settings -> Storage Settings -> Cache Control).
The description of the field (_This lets you set the **default** Cache-Control header for objects in the bucket_) gives me the impression that it shouldn't smash my own settings.
Maybe it's some sort of timeout or data race since I first uploaded the file without a cache-control header before deleting/modifying it (UPDATE: happens on new files as well).
Giving it 60s seemed more than enough for everything to settle (Global, public bucket, Standard storage tier, Strict consistency, object ACLs enabled).
If these settings are incompatible in some way it would be a real shame since I really don't wanna manually set each cache-control, but I need some files to be short-lived (329 words)
- [Dr. Rory Heidenreich Posts - Tigris](/content/community/u/1463621808036122728/index.html): See posts from Dr. Rory Heidenreich in the Tigris Discord (10,127 words)
- [Vlad Posts - Tigris](/content/community/u/322839446552576005/index.html): See posts from Vlad in the Tigris Discord (122 words)
- [Jie Wang Posts - Tigris](/content/community/u/1457776617290989861/index.html): See posts from Jie Wang in the Tigris Discord (120 words)
- [algads Posts - Tigris](/content/community/u/645334636318294026/index.html): See posts from algads in the Tigris Discord (98 words)
- [Ileri⚡ Posts - Tigris](/content/community/u/982260445412995074/index.html): See posts from Ileri⚡ in the Tigris Discord (72 words)
- [ Posts - Tigris](/content/community/u/178197043670548481/index.html): See posts from in the Tigris Discord (201 words)
- [Naman Posts - Tigris](/content/community/u/958863114911240312/index.html): See posts from Naman in the Tigris Discord (97 words)
- [How to sign BAA - Tigris](/content/community/m/1498462664949502094/index.html): Hi, I want to sign BAA with you - I sent an email to help@.. but no reply. (102 words)
- [Bucket ownership transfer between orgs - Tigris](/content/community/m/1499334276867559545/index.html): Hey folks, is there a supported way to transfer a bucket from one org to another?
Context: Railway uses Tigris for multi-tenant object storage, with one Tigris org per Railway workspace. When a customer moves a project between workspaces, the bucket stays in the original org and becomes inaccessible from the destination. We’d like to migrate the bucket (and its objects) to the new org as part of that flow.
Is there anything on the partner API for this today? If not, what’s the recommended pattern? (94 words)
- [guymograbi Posts - Tigris](/content/community/u/860947828343046165/index.html): See posts from guymograbi in the Tigris Discord (18 words)
- [Simon Posts - Tigris](/content/community/u/1496507895787819048/index.html): See posts from Simon in the Tigris Discord (65 words)
- [tomciopp Posts - Tigris](/content/community/u/239563540229390336/index.html): See posts from tomciopp in the Tigris Discord (53 words)
- [Jume Posts - Tigris](/content/community/u/272469619414138881/index.html): See posts from Jume in the Tigris Discord (107 words)
- [How to add additional headers if reverse proxy isn't supported on public bucket? - Tigris](/content/community/m/1518089140741083236/index.html): Hi! I have a public bucket and I want to add custom headers on its content like content-security-policy and permissions-policy. But enabling the proxy mode on Cloudflare CDN breaks the certificate renewal 😦 How to go about it? (123 words)
- [Hi, can anyone here help with a partner id for my startup. - Tigris](/content/community/m/1509602156544655500/index.html): We want to resell a storage bucket feature on https://brimble.io to our users (56 words)
- [Does pre-signed POST uploads support metadata fields? - Tigris](/content/community/m/1526660353193414787/index.html): I’m doing browser uploads using a POST policy. The upload itself succeeds perfectly, but I've noticed that my custom metadata (x-amz-meta-* fields) isn't being saved to the object, even though it's correctly included in both the policy conditions and the form data.
I was looking at following docs, which made me think POST uploads would support metadata as in the example "x-amz-meta-uuid" is used : https://www.tigrisdata.com/docs/objects/upload-via-html-form/
Can anyone confirm if custom metadata is supported for POST uploads, or is this a known limitation on the backend? (I know PUT works, just specifically wondering about POST). (139 words)
- [Deleted three buckets and now can't recreate them - Tigris](/content/community/m/1527522846526406876/index.html): Discussion in Deleted three buckets and now can't recreate them - Tigris (139 words)
- [#help - Tigris Discord](/content/community/c/1463203968246222930/index.html): Browse threads from #help in the Tigris community Discord server on the web. (12,096 words)
- [Access objects via signed cookies | Tigris Object Storage Documentation](/content/docs/objects/access-objects-via-cookies/index.html): Tigris offers compatibility with CloudFront's signed cookies, empowering you to (677 words)
- [Performance Metrics | Tigris Object Storage Documentation](/content/docs/overview/benchmarks/metrics/index.html): This page describes the benchmarking methodology used to evaluate Tigris against (326 words)
- [Python | Tigris Object Storage Documentation](/content/docs/quickstarts/python/index.html): There are three ways to use Tigris with Python: (601 words)
- [Multitenant Storage | Tigris Object Storage Documentation](/content/docs/use-cases/multitenant-storage/index.html): Give your users storage without becoming a storage company (584 words)
- [Tigris Storage SDK | Tigris Object Storage Documentation](/content/docs/sdks/tigris/index.html): Tigris Storage SDK provides a simple interface and minimal configuration that (434 words)
- [Pricing | Tigris](/content/pricing/index.html): Tigris object storage pricing. No egress fees, simple usage-based pricing starting with a generous free tier. (849 words)
- [Forks | Tigris Object Storage Documentation](/content/docs/forks/index.html): A fork creates a new bucket from a snapshot or the current state of a (579 words)
- [Agent Kit | Tigris Object Storage Documentation](/content/docs/ai/agent-kit/index.html): Agent Kit is a TypeScript library that packages storage workflows for AI agents (567 words)
- [TigrisFS | Tigris Object Storage Documentation](/content/docs/training/tigrisfs/index.html): For AI workloads, most runtimes assume data is accessible via a filesystem. By (709 words)
- [Features | Tigris Object Storage Documentation](/content/docs/overview/features/index.html): Tigris is globally distributed object storage built for performance, simplicity, (770 words)
- [Tigris Acceleration Gateway (TAG)](/content/accelerate/index.html): Eliminate GPU idle time with TAG, a local caching proxy that delivers near-local throughput for AI training workloads. (435 words)
- [Get Started | Tigris Object Storage Documentation](/content/docs/index.html): Tigris is a globally distributed, multi-cloud object storage service with built-in support for the S3 API. (276 words)
- [Conditional Operations (preconditions) | Tigris Object Storage Documentation](/content/docs/objects/conditionals/index.html): Tigris supports conditional operations through standard HTTP precondition (642 words)
- [Tigris vs Cloudflare R2 | Tigris Object Storage Documentation](/content/docs/overview/compare/cloudflare-r2/index.html): Both Tigris and Cloudflare R2 are S3-compatible object storage services with (560 words)
- [Comparison: Cloudflare R2 | Tigris Object Storage Documentation](/content/docs/overview/benchmarks/cloudflare-r2/index.html): return ( SignatureDoesNotMatchThe request signature we calculated does not match the signature you provided. Check your key and signing method./hidden-resonance-7222/cover-auc.jpg1765142028485770133cover-auc.jpghidden-resonance-7222
```
It is generated by:
```bash
URL=$(aws s3 presign s3://hidden-resonance-7222/cover-auc.jpg --expires-in 3600 --endpoint-url https://t3.storage.dev)
```
Running `aws configure` yields:
```text
AWS Access Key ID [****************_lvN]:
AWS Secret Access Key [****************0yEe]:
Default region name [auto]:
Default output format [json]:
```
and the access key matches the one shown in the Tigris web interface.
I saw [this](https://community.fly.io/t/signaturedoesnotmatch-when-using-pre-signed-url-with-aws-sdk/23549) but it does not seem relevant.
**P.S.** The working URL generated from the web interface looks like:
```text
https://hidden-resonance-7222.t3.storage.dev/cover-auc.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=tid_..._lvN%2F20251207%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20251207T213238Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=...
```
The failed URL generated by AWS CLI looks like:
```text
https://t3.storage.dev/hidden-resonance-7222/cover-auc.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=tid_..._lvN%2F20251207%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20251207T213420Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=...
``` (301 words)
- [Object ACL - Tigris](/content/community/m/1518665198083506317/index.html): Is there a way to set this value to true when creating a bucket? I don't want to have to do this manually.
Object ACL
Use Object ACLs to manage permissions at the object level, such as having private objects in a public bucket or public objects in a private bucket. (227 words)
- [Overview | Tigris Object Storage Documentation](/content/docs/overview/index.html): Tigris is a globally distributed S3-compatible object storage service that (513 words)
- [Deleting multiple Objects in Tigris - Tigris](/content/community/m/1463623772870545530/index.html): Yes, a presigned URL can only authorize **one** S3 operation.
The `DeleteObjects` API (which deletes several keys in one call) is **not** supported by the presigning helpers, so a URL generated for it cannot be used successfully.
### Why the request fails
When the SDK creates the signature it signs only the headers that are allowed for the operation.
`DeleteObjects` requires a request body that contains the list of keys, but a presigned URL can only sign query‑string parameters – it can’t sign the body. Consequently the request you send contains extra headers/body data that weren’t part of the signature, and S3 returns:
```
There were headers present in the request which were not signed
```
### What you can do
* **Delete a single object** – use `GetObjectCommand` or `DeleteObjectCommand` with `getSignedUrl`.
* **Delete multiple objects** – either:
1. **Call the API directly** from a trusted backend (no presigned URL needed), or
2. **Use a POST request with a policy document** that lists the objects to delete. This is more involved and still requires a backend to generate the policy and signature.
#### Example: delete a single object with a presigned URL
```js
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
import { DeleteObjectCommand, S3Client } from "@aws-sdk/client-s3";
const s3 = new S3Client({ region: "us-east-1" });
const url = await getSignedUrl(
s3,
new DeleteObjectCommand({
Bucket: process.env.BUCKET_NAME,
Key: "path/to/object.txt",
}),
{ expiresIn: 3600 } // seconds
);
// The client can now issue a DELETE request to `url`.
```
### Bottom line
Presigned URLs cannot be used for `DeleteObjects` (multiple‑object delete). Use a server‑side call or a signed POST policy if you need batch deletion. (266 words)
- [Tigris - HTTP range requests! - Tigris](/content/community/m/1463622766413746352/index.html): Does Tigris object storage support HTTP Range requests? (59 words)
- [DuckDB | Tigris Object Storage Documentation](/content/docs/quickstarts/duckdb/index.html): DuckDB is an in-process embedded analytical database (421 words)
- [Billing | Tigris Object Storage Documentation](/content/docs/account-management/billing/index.html): Tigris follows a usage-based pricing (506 words)
- [Tigris Blog | Tigris Object Storage](/content/blog/index.html): A blog dedicated to all things storage! (473 words)
- [Posts tagged "Build with Tigris" | Tigris Object Storage](/content/blog/tags/build-with-tigris/index.html): Posts tagged "Build with Tigris" (371 words)
- [Posts tagged "agents" | Tigris Object Storage](/content/blog/tags/agents/index.html): Posts tagged "agents" (441 words)
- [Posts tagged "duckdb" | Tigris Object Storage](/content/blog/tags/duckdb/index.html): Posts tagged "duckdb" (131 words)
- [Posts tagged "lancedb" | Tigris Object Storage](/content/blog/tags/lancedb/index.html): Posts tagged "lancedb" (56 words)
- [The Most Expensive ClickHouse Query Is the Restore | Tigris Object Storage](/content/blog/clickhouse-zero-egress/index.html): Self-hosted ClickHouse runs on cheap compute, but its backups and cold tier usually live on AWS S3, and AWS charges $0.09/GB to read your own data back. Point BACKUP TO S3 and TTL tiering at Tigris instead. You keep the same stock ClickHouse features, you pay zero egress fees, and disaster recovery drills cost nothing to run.
(676 words, Jul 16, 2026)
- [Presigned URLs are technically a security vuln | Tigris Object Storage](/content/blog/presigned-urls-security-vuln/index.html): Presigned URLs are replay attacks you commit on purpose. How SigV4 signs the
clock, what a presigned URL grants on Tigris storage, and what it costs you.
(1,449 words, Jul 14, 2026)
- [Migrate your data with the Tigris CLI | Tigris Object Storage](/content/blog/t3-migrate-command/index.html): Move an entire bucket to Tigris in one command. The Tigris CLI scans every
object and migrates it safely from any S3-compatible provider. Here's how to
set it up.
(501 words, Jul 9, 2026)
- [Where Does the Agent Live? | Tigris Object Storage](/content/blog/where-does-the-agent-live/index.html): Your agent runs in a disposable sandbox, but it can't live there. A breakdown of everything in the agent's world, and why it should be one forkable bucket. (3,154 words, Jul 7, 2026)
- [Every Tenant Has a Past: Evaluating LangGraph Agents | Tigris Object Storage](/content/blog/eval-agents-real-state/index.html): Fork a customer's entire LangGraph agent state, replay their conversations through a prompt change, and judge it head-to-head before you ship to prod. (1,789 words, Jun 30, 2026)
- [I taught a bucket to speak git | Tigris Object Storage](/content/blog/objgit/index.html): objgit is a single-binary git server that stores repositories directly in
Tigris — no disk, no git binary, no database. To my shock and horror, it
worked.
(3,510 words, Jun 23, 2026)
- [Tar saved Unix backups in 1979. Now it saves your dataloader. | Tigris Object Storage](/content/blog/bundle-api/index.html): Tigris bundles let you pull thousands of objects in one HTTP request as a streaming tar archive — no more one GET per object. Here's how it works and why.
(1,853 words, Jun 11, 2026)
- [Introducing Soft Delete for Tigris Buckets and Objects | Tigris Object Storage](/content/blog/soft-delete/index.html): Tigris now supports soft delete for buckets and objects. Enable it once, and every delete becomes recoverable for up to 90 days before it's permanently removed.
(1,119 words, Jun 9, 2026)
- [Giving your Go apps Tigris superpowers | Tigris Object Storage](/content/blog/storage-sdk-go/index.html): The Go Storage SDK adds first-class methods for bucket forking, snapshots, and object renaming — plus a simpler high-level client for everyday storage code.
(844 words, Jun 9, 2026)
- [Introducing storagesdk.dev | Tigris Object Storage](/content/blog/storagesdk/index.html): StorageSDK is a provider-agnostic storage API for Node.js: one interface
across S3, R2, Azure, GCS, Tigris, and more, with snapshots and forks built in.
(617 words, Jun 2, 2026)
- [Give your agents disposable environments in Go | Tigris Object Storage](/content/blog/agent-sandbox-go/index.html): Kefka is a userspace shell sandbox in Go that gives every AI agent its own copy-on-write Tigris bucket fork plus Python, jq, and ripgrep via WebAssembly.
(1,865 words, May 28, 2026)
- [You wanted more lifecycle rules. They're here. | Tigris Object Storage](/content/blog/lifecycle-rules-prefix-filters/index.html): Tigris lifecycle rules now support multiple rules per bucket with prefix filters, so you can mix transitions and expirations across different prefixes. (1,159 words, May 26, 2026)
- [How small can we make an interface to Tigris? | Tigris Object Storage](/content/blog/agent-shell-homepage/index.html): We embedded agent-shell on the Tigris homepage so you can ls, cat, and cd through your buckets like a normal filesystem. Here's how it works.
(1,668 words, May 21, 2026)
- [Own Your AI Context with Basic Memory | Tigris Object Storage](/content/blog/case-study-basic-memory/index.html): How Basic Memory uses per-tenant Tigris buckets, rclone bisync, and bucket snapshots to give every user a portable Markdown knowledge base.
(1,962 words, May 19, 2026)
- [Durable global streams in Tigris with S2 | Tigris Object Storage](/content/blog/durable-global-streams-s2/index.html): S2 Lite turns S3-compatible object storage into a durable streaming platform. Run it on Tigris for high-cardinality workloads — per-agent reasoning traces, event firehoses — with zero egress fees and global replication. (2,166 words, May 5, 2026)
- [Build a Self-Updating Knowledge Base for Under $10 | Tigris Object Storage](/content/blog/self-updating-knowledge-base/index.html): A self-updating knowledge base on Tigris, maintained overnight by an Anthropic SDK agent loop running through @tigrisdata/agent-shell. Atomic flush on success, discard on throw. The bucket either lands a clean run or stays byte-for-byte unchanged. ~$7 a month, presigned digest URL in Slack each morning.
(1,865 words, May 5, 2026)
- [We gave just-bash persistent storage | Tigris Object Storage](/content/blog/agent-shell-release/index.html): Meet @tigrisdata/agent-shell: a virtual bash environment that gives AI agents persistent storage on Tigris buckets, with forks and snapshots for safety.
(858 words, Apr 30, 2026)
- [The Immutable Agent | Tigris Object Storage](/content/blog/immutable-agent/index.html): Storage-protected Mastra agents: a reference implementation. Isolated session forks, validate before promoting, contain compromise at the storage layer.
(2,225 words, Apr 30, 2026)
- [Introducing Agent Kit: Storage Workflows for AI Agents | Tigris Object Storage](/content/blog/agent-kit/index.html): A new TypeScript SDK giving AI agents the storage primitives they need: forks, workspaces, checkpoints, and event-driven coordination on Tigris.
(2,027 words, Apr 28, 2026)
- [Your bucket is already a message queue | Tigris Object Storage](/content/blog/multi-agent-coordination/index.html): Use Tigris object notifications to coordinate AI agents without deploying a message queue. A writer/watcher pattern turns your bucket into an event bus.
(1,658 words, Apr 23, 2026)
- [Fifty agents for the price of one bucket | Tigris Object Storage](/content/blog/fifty-agents-one-bucket/index.html): Bucket forking on Tigris gives every agent its own sandbox with no data duplication. One Lance file, two query engines, globally distributed reads.
(1,360 words, Apr 14, 2026)
- [Tigris Agent Plugins: Your AI Coding Agent Now Speaks Storage | Tigris Object Storage](/content/blog/agent-plugins/index.html): Tigris now ships as a plugin for Claude Code, Cursor, and other AI coding agents. Five skills, a storage subagent, and security rules give your agent full Tigris fluency out of the box.
(1,514 words, Apr 7, 2026)
- [Introducing t3.tigrisfiles.io for public content | Tigris Object Storage](/content/blog/public-bucket-domains/index.html): New Tigris accounts serve public content from a dedicated domain — t3.tigrisfiles.io — separating public content delivery from API infrastructure.
(360 words, Apr 2, 2026)
- [Introducing CougarLLM: A Truly Global Inference Server | Tigris Object Storage](/content/blog/cougarllm/index.html): Today we're announcing CougarLLM, a globally distributed inference server that brings zero-egress inference to any open-weight model.
(960 words, Apr 1, 2026)
- [Introducing Multi-Region and Dual-Region Buckets | Tigris Object Storage](/content/blog/multi-region-dual-region-buckets/index.html): Tigris now lets you choose exactly how your data is replicated across regions. Pick from four bucket location types (global, multi-region, dual-region, and single-region), each with built-in consistency and availability guarantees.
(1,633 words, Mar 24, 2026)
- [Event-Driven Multimodal Ingestion with Tigris and Mixpeek | Tigris Object Storage](/content/blog/mixpeek-tigris-object-notifications/index.html): Learn how Mixpeek uses Tigris Object Notifications and globally distributed object storage to build an event-driven ingestion pipeline for multimodal media.
(1,756 words, Mar 19, 2026)
- [Benchmarking ML Training Throughput on Tigris Object Storage | Tigris Object Storage](/content/blog/training-object-storage/index.html): Training ML models directly from object storage is possible with the right access patterns and client tooling.
We benchmarked Tigris against AWS S3 and introduced the Tigris Acceleration Gateway (TAG), a local caching
service that significantly reduces epoch duration and worker requirements for multi-epoch training workloads.
(2,465 words, Mar 17, 2026)
- [How I learned to love reactive data models with Pixeltable | Tigris Object Storage](/content/blog/pixeltable-reactive-data/index.html): Pixeltable turns your database into a reactive data layer -- embeddings compute automatically on insert. Pair it with Tigris for globally distributed ML apps. (1,687 words, Mar 10, 2026)
- [Give Your Users Storage Without Becoming a Storage Company | Tigris Object Storage](/content/blog/partner-integration-api/index.html): The Tigris Partner Integration API lets platforms offer S3-compatible object storage to their users without managing accounts, regions, or per-tenant limits.
(1,563 words, Mar 5, 2026)
- [How Parseable Built an Observability Data Lake for AI | Tigris Object Storage](/content/blog/case-study-parseable/index.html): Parseable unifies agent, LLM, and infrastructure observability in a data lake on globally distributed Tigris object storage, with 80-90% Parquet compression.
(1,334 words, Mar 3, 2026)
- [From npm to a Single Binary: Adopting Bun for the Tigris CLI | Tigris Object Storage](/content/blog/using-bun-and-benchmark/index.html): We shipped our CLI with Node.js and npm, then compiled it into a standalone binary with Bun in a matter of hours. Here is what we learned and how it performed. (1,318 words, Feb 26, 2026)
- [How Agentuity Built a New Cloud for AI Agents | Tigris Object Storage](/content/blog/case-study-agentuity/index.html): Agentuity built custom cloud infrastructure for agentic workloads. Tigris powers five storage layers, from agent filesystems to sandbox snapshots.
(1,507 words, Feb 24, 2026)
- [Agent skills automate drudgery so you don't have to do it | Tigris Object Storage](/content/blog/skill-library/index.html): Discover Tigris' Agent Skills Library - reusable skills that help AI agents
automate image optimization, conventional commits, and Tigris SDK operations.
(1,762 words, Feb 17, 2026)
- [A terminal user's next interface to object storage | Tigris Object Storage](/content/blog/tigris-cli/index.html): Tigris CLI: Manage object storage from your terminal with this UNIX-philosophy tool.
Install with npm and start uploading files in seconds. Try it free today.
(1,653 words, Feb 10, 2026)
- [Deriving the Tigris Go SDK | Tigris Object Storage](/content/blog/storage-go-announcement/index.html): Tigris now has an official Go SDK! Learn how storage-go provides both an AWS S3 drop-in replacement and an ergonomic high-level interface for Go developers. (728 words, Feb 3, 2026)
- [We have a Discord now. You can view the Q&A from Google. | Tigris Object Storage](/content/blog/discord-backfill/index.html): Learn how we backfilled our Discord community with existing Q&A from another forum
using Tigris, ETL pipelines, and AI agents, making it searchable via Answer Overflow
and MCP.
(2,628 words, Jan 27, 2026)
- [Using Tigris as a key-value store | Tigris Object Storage](/content/blog/tigris-kv-store/index.html): Learn how to use Tigris object storage as a powerful key-value store for both structured and unstructured data, eliminating the need for separate databases.
(1,270 words, Jan 20, 2026)
- [How S3 API compatibility lets you use any cloud | Tigris Object Storage](/content/blog/s3-any-cloud/index.html): The S3 API won because it was an interface that stayed boring. Now it's the backbone of cloud portability, enabling workloads to run on any cloud.
(1,336 words, Jan 13, 2026)
- [2025: A Breakthrough Year for Tigris Data | Tigris Object Storage](/content/blog/2025-wrapped/index.html): Growth exploded, not just in users, but in the product itself. Tigris has matured into the storage backbone for leading AI companies.
(936 words, Jan 7, 2026)
- [Test RAG Chunking Strategies With Tigris Forked Buckets | Tigris Object Storage](/content/blog/tigris-rag-lab/index.html): Discover the optimal RAG chunking strategy without manual testing. This Python app uses Tigris bucket forking to run parallel experiments, automatically comparing multiple chunking strategies and ranking them using objective span-based metrics.
(1,291 words, Jan 6, 2026)
- [We're open sourcing our MCP OIDC Provider | Tigris Object Storage](/content/blog/mcp-oidc-provider/index.html): When building a remote MCP server, you will most likely need an OIDC layer between clients (Claude, Cursor etc) and your upstream IdP (Auth0, Clerk etc). We have created a ready to use solution for you that's vendor neutral: use any IdP you want.
(1,849 words, Dec 16, 2025)
- [1-Click Docker Registry with Northflank + Tigris | Tigris Object Storage](/content/blog/northflank-registry/index.html): Deploy a self-hostable, private Docker Registry effortlessly using a Northflank 1-Click stack combined with Tigris for secure, scalable storage and authentication. Take back control of your container image destiny, avoid public registry limits and egress fees, and set up object lifecycle rules to optimize storage costs.
(857 words, Dec 9, 2025)
- [Bucket snapshots are git tags for your bucket | Tigris Object Storage](/content/blog/snapshots/index.html): Whole bucket snapshots, like git tags for your bucket. Snapshots enable point-in-time recovery, reproducibility, and version control for object storage - finally bringing snapshot semantics to the entire object storage namespace.
(738 words, Dec 3, 2025)
- [The man-in-the-middle pattern for MCP server OAuth | Tigris Object Storage](/content/blog/mcp-oauth/index.html): Learn how Tigris implemented the Model Context Protocol (MCP) server's challenging OAuth authentication using an OpenID Connect (OIDC) "man-in-the-middle" pattern backed by Tigris as a key-value store to manage dynamic clients.
(2,522 words, Dec 2, 2025)
- [Tigris' MCP Server Goes Global | Tigris Object Storage](/content/blog/hosted-mcp/index.html): Tigris' hosted MCP server is now globally available, simplifying integration into AI workflows like ChatGPT, Claude, and agentic coding. Benefit from no installation, OAuth security, and support for multiple Tigris organizations.
(656 words, Nov 25, 2025)
- [Scaling Kafka with AutoMQ on Tigris | Tigris Object Storage](/content/blog/scaling-kafka-with-automq-and-tigris/index.html): Learn how AutoMQ paired with Tigris object storage redefines Kafka scaling by eliminating replication overhead, enabling instant partition reassignment, and delivering a fully elastic, cloud-native streaming engine.
(855 words, Nov 11, 2025)
- [Immutable by Design: The Deep Tech Behind Tigris Bucket Forking | Tigris Object Storage](/content/blog/bucket-forking-deep-dive/index.html): Tigris bucket forking lets you make copies of terabytes of data in microseconds thanks to making objects immutable and ordering time backwards. This gives you object-level snapshotting, forking, and strong deletion protection, revolutionizing object storage with Git-like forking for massive datasets. Learn more about how we made it happen!
(2,224 words, Nov 6, 2025)
- [Fearless dataset experimentation with bucket forking | Tigris Object Storage](/content/blog/dataset-experimentation/index.html): Fork buckets like code. Get instant, isolated copies of large datasets for AI training, experimentation, and multi-agent workflows. Achieve reproducibility, safe experimentation, and point-in-time recovery with Tigris snapshots and forks.
(1,436 words, Oct 30, 2025)
- [Append-Only Object Storage: The Foundation Behind Cheap Bucket Forking | Tigris Object Storage](/content/blog/append-only-storage/index.html): How immutable, append-only architecture enables O(1) snapshots and forks in Tigris object storage, inspired by ZFS and log-structured systems.
(1,224 words, Oct 27, 2025)
- [Fork Buckets Like You Fork Code | Tigris Object Storage](/content/blog/fork-buckets-like-code/index.html): Fork your data like you fork your code. With Tigris, create isolated copies of your data for development, testing, or experimentation without waiting for full copies.
(967 words, Oct 17, 2025)
- [Getting started with PyTorch and Tigris | Tigris Object Storage](/content/blog/pytorch-quickstart/index.html): Want to get started training your language models using PyTorch and Tigris? Here's how to get started!
(1,084 words, Oct 16, 2025)
- [What Tigris Data Is Excited About at PyTorch Conference 2025 | Tigris Object Storage](/content/blog/what-tigris-looks-forward-to-pytorch-conference/index.html): Five talks we're most excited about at PyTorch Conference 2025, showcasing innovation in AI infrastructure, storage, and performance optimization.
(674 words, Oct 14, 2025)
- [Tigris Raises $25M to Build the Storage Layer for the AI Era | Tigris Object Storage](/content/blog/series-a/index.html): Led by Spark Capital, with participation from Andreessen Horowitz and others
(783 words, Oct 8, 2025)
- [How we make Ty | Tigris Object Storage](/content/blog/how-make-ty/index.html): Learn how we create AI-generated illustrations featuring Ty the tiger for our
blog posts, including the creative process and the open-source Tygen app built
with Go, HTMX, and OpenAI API.
(1,046 words, Oct 2, 2025)
- [Flux Kontext vs Nano Banana | Tigris Object Storage](/content/blog/flux-kontext-vs-nano-banana/index.html): We compared Flux Kontext, Nano Banana and Image GPT models. Find out which one is the best for your use case.
(1,031 words, Sep 26, 2025)
- [Announcing the Tigris Storage SDK | Tigris Object Storage](/content/blog/storage-sdk/index.html): Introducing the Tigris Storage SDK for JavaScript and TypeScript - a simplified alternative to AWS S3 SDK with environment-based configuration, error-as-values pattern, and streamlined object storage operations.
(1,137 words, Sep 25, 2025)
- [We do our billing with Prometheus | Tigris Object Storage](/content/blog/billing-prometheus/index.html): How Tigris uses Prometheus metrics for usage-based billing instead of traditional event-driven systems, reducing complexity while ensuring transparency and customer-friendly error handling.
(1,948 words, Sep 23, 2025)
- [Unlimited Message Retention with Bufstream and Tigris | Tigris Object Storage](/content/blog/bufstream/index.html): Get unlimited message retention and truly global operation with Bufstream and Tigris.
(798 words, Sep 17, 2025)
- [Distributed Training with LanceDB and Tigris | Tigris Object Storage](/content/blog/lancedb-training/index.html): Discover how to efficiently train large-scale ML models using LanceDB and Tigris. This guide details streaming massive datasets directly from object storage to PyTorch, simplifying distributed training and eliminating infrastructure complexities for scalable AI.
(1,454 words, Sep 9, 2025)
- [How LogSeam Searches 500 Million Logs per second | Tigris Object Storage](/content/blog/case-study-logseam/index.html): LogSeam transforms log management with Tigris, achieving massive cost savings and performance improvements in their security data lake architecture.
(1,043 words, Sep 4, 2025)
- [Build a text-to-video app with Veo3 and Tigris | Tigris Object Storage](/content/blog/video-generation-veo3-tigris/index.html): Learn how to build a text-to-video generation app using Google's Veo3 model and Tigris object storage to create high-quality video content from text prompts.
(1,541 words, Aug 26, 2025)
- [gpt-oss is not for developers. It’s for agents. | Tigris Object Storage](/content/blog/gpt-oss/index.html): Discover why OpenAI's gpt-oss model family is ideal for building reliable and safe AI agents, not just for developers.
(3,465 words, Aug 19, 2025)
- [Generative Software Development: From Coding to Conversing | Tigris Object Storage](/content/blog/generative-software/index.html): How AI is transforming software development from autocomplete to autonomous agents, and what this means for the future of coding.
(901 words, Aug 12, 2025)
- [I Tested Qwen Image's Text Rendering Claims. Here's What I Found. | Tigris Object Storage](/content/blog/qwen-image/index.html): Alibaba's new open-weights Qwen Image model shows promise in text rendering but struggles with making the text appear natural. Sometimes it just looks like it was photoshopped in because that's how they assembled the training data.
(2,045 words, Aug 7, 2025)
- [Using Hugging Face datasets with Tigris | Tigris Object Storage](/content/blog/huggingface-datasets/index.html): Let your datasets roam freely between the multicloud with Tigris! Today you'll learn how to import your datasets into Tigris in a snap.
(848 words, Jul 29, 2025)
- [We made unhateable IAM. Here’s how to use it. | Tigris Object Storage](/content/blog/iam-policy-builder/index.html): Tigris introduces an IAM Policy Builder that simplifies permissions and provides a VSCode-like editor experience. This tool aims to make IAM policy development easier and more secure by focusing on least privilege from the start.
(851 words, Jul 17, 2025)
- [Getting started with WarpStream on Tigris | Tigris Object Storage](/content/blog/warpstream/index.html): Get started integrating WarpStream with Tigris so you can have a durable multi-cloud message broker that's fast anywhere on the planet!
(1,127 words, Jul 10, 2025)
- [Small Objects, Big Gains: Benchmarking Tigris Against AWS S3 and Cloudflare R2 | Tigris Object Storage](/content/blog/benchmark-small-objects/index.html): We have spent a lot of time optimizing Tigris for small objects. This post shares the results of our benchmarks of comparing the performance of Tigris, AWS S3, and Cloudflare R2 when storing and retrieving small objects.
(1,008 words, Jul 8, 2025)
- [Standardizing Python Environments with Development Containers | Tigris Object Storage](/content/blog/dev-containers-python/index.html): Conqueror the complexity of Python environments effortlessly. Discover how Development Containers offer a consistent, reliable setup for any Python project, eliminating dependency frustrations and boosting developer productivity.
(1,118 words, Jul 3, 2025)
- [mount -t tigrisfs | Tigris Object Storage](/content/blog/tigrisfs/index.html): Learn how Tigris Data's tigrisfs provides a native filesystem interface for unlimited, globally accessible cloud storage. Bridge the gap between cloud and local, enabling seamless integration with existing tools and tackling big data challenges for AI, analytics, and more.
(2,090 words, Jul 1, 2025)
- [Data Time Travel with DuckLake and Tigris | Tigris Object Storage](/content/blog/ducklake-time-travel/index.html): Learn how to implement data time travel with Ducklake and Tigris to easily recover from database mishaps. This guide demonstrates how Ducklake creates snapshots for every `INSERT` or `DELETE` operation, allowing you to explore your analytics database as it was before disaster struck.
(1,641 words, Jun 25, 2025)
- [Get your data ducks in a row with DuckLake | Tigris Object Storage](/content/blog/ducklake/index.html): Combine SQL and object storage data seamlessly with DuckLake, a data lakehouse solution that works with Tigris. Query big and small data without egress fees and simplify your data analytics workflows.
(2,708 words, Jun 10, 2025)
- [Eliminating Data Migration Risk with Shadow Buckets on Tigris | Tigris Object Storage](/content/blog/shadow-bucket/index.html): Eliminate data migration risks with Tigris's Shadow Bucket Migration. Learn how to move data seamlessly with incremental, two-way door strategies and avoid downtime. Discover the benefits of read/write fallback and multi-region synchronization for object storage.
(1,174 words, Jun 3, 2025)
- [Fending off scrapers with Tigris and DuckDB | Tigris Object Storage](/content/blog/anubis/index.html): Anubis is a Web AI Firewall Utility that helps administrators keep their sites up in the wake of abusive scrapers. In order to make Anubis filter things better, you need data. Here's how Xe got that data to improve Anubis' filtering powers.
(2,543 words, May 29, 2025)
- [Behind the Fake CAPTCHA: How We Fought Back Against Platform Abuse | Tigris Object Storage](/content/blog/fake-captchas/index.html): We detected fake CAPTCHAs on our platform. Here's what we did to remove them and stay a step ahead of attackers.
(1,658 words, May 20, 2025)
- [You wanted lifecycle rules. Here's how we made it happen. | Tigris Object Storage](/content/blog/lifecycle-rules/index.html): Tigris has support for object lifecycle rules, allowing you to automatically move files between storage tiers. Here's the gorey details on how we did it.
(1,825 words, May 6, 2025)
- [Bottomless vector database storage with Tigris and LanceDB | Tigris Object Storage](/content/blog/lancedb-101/index.html): Tigris lets you store whatever you want including vector embeddings with LanceDB! Find out how to get started today.
(1,637 words, Apr 24, 2025)
- [Decoupling Bucket Names and Domain Names | Tigris Object Storage](/content/blog/bucket-domain-names/index.html): Tigris lets you set any domain you want to point to your buckets instead of making the domain name match the bucket name.
(607 words, Apr 22, 2025)
- [Share your buckets, share the love | Tigris Object Storage](/content/blog/bucket-sharing/index.html): Sharing buckets is a breeze when you don't have to go into advanced IAM purgatory to get it done.
(569 words, Apr 17, 2025)
- [We solved one of the biggest problems in object storage | Tigris Object Storage](/content/blog/rename-object/index.html): Tigris lets you rename objects instead of just copying them. Just add X-Tigris-Rename!
(1,006 words, Apr 15, 2025)
- [Going beyond vibe coding | Tigris Object Storage](/content/blog/vibes-off/index.html): AI tools can make coding easier, but they can also introduce subtle errors that can turn out really bad if you're not careful.
(1,869 words, Apr 10, 2025)
- [The Storage API That Ate The World (And What We're Doing About It) | Tigris Object Storage](/content/blog/s3-compat/index.html): Tigris delivers S3-compatible, globally distributed object storage, enabling seamless multi-cloud workflows without tool changes. Built on S3’s API standard, it simplifies scaling, avoids vendor lock-in, and supports dynamic global data placement.
(1,696 words, Apr 8, 2025)
- [Announcing the Tigris MCP server | Tigris Object Storage](/content/blog/mcp-server/index.html): Want to do vibe coding with Tigris? We released a MCP server so you can make it happen. 😎
(1,001 words, Apr 3, 2025)
- [Announcing Tigris' SOC2 Type II Certification | Tigris Object Storage](/content/blog/soc2-typeii/index.html): Tigris has achieved SOC 2 Type II certification, signifying our high standard for security and operations.
(249 words, Mar 25, 2025)
- [Supplemental resources for Affording your AI chatbot friends | Tigris Object Storage](/content/blog/ai-chatbot-friends/index.html): Caught the talk at SCaLE but want to learn more? Here's a list of resources that were mentioned during the talk.
(503 words, Mar 8, 2025)
- [Depot saves us from another Google deprecation | Tigris Object Storage](/content/blog/depot-registry/index.html): Google Container Registry's deprecation has left developers seeking alternatives. Depot's container registry built on Tigris offers a fast and reliable solution for storing and distributing Docker images globally, with faster image pulls and no rate limits.
(1,295 words, Mar 4, 2025)
- [Setting up a Docker Hub pull-through cache with Tigris | Tigris Object Storage](/content/blog/pullthru-cache/index.html): A pull-through cache is a local cache of Docker images that can be used to speed up deployments and defend against the upcoming rate limit decreases for the Docker Hub. Learn how to make one on top of Tigris!
(705 words, Feb 25, 2025)
- [Moving to Virtual Hosted URLs | Tigris Object Storage](/content/blog/virtual-hosted-urls/index.html): We're transitioning to virtual hosted style URLs for all new buckets created after February 19, 2025.
(446 words, Feb 19, 2025)
- [AI’s Impending Left-pad Scenario | Tigris Object Storage](/content/blog/ai-left-pad/index.html): Your AI workflows rely on models that other people post on the Internet. How can you be sure that they'll stay up? Today Xe covers the history of the infamous left-pad incident of 2016 and how it could happen again with AI.
(1,712 words, Feb 11, 2025)
- [DeepSeek R1 is good enough | Tigris Object Storage](/content/blog/thoughts-deepseek-r1/index.html): DeepSeek R1 is a frontier-grade reasoning model that you can run on your own hardware. In this article, Xe digs through the papers and slices past the hype to explain what DeepSeek R1 really gives users and how the model is revolutionary for what it is.
(535 words, Jan 29, 2025)
- [Tigris now supports recent releases of the S3 SDK | Tigris Object Storage](/content/blog/tigris-fixes-s3-libs/index.html): You can update your S3 libraries again. All is good.
(79 words, Jan 28, 2025)
- [How do large language models get so large? | Tigris Object Storage](/content/blog/chonky-models/index.html): AI models, comprised mainly of floating-point numbers, function by processing inputs through various components like tokenizers and embedding models. They range in size from gigabytes to terabytes, with larger parameter counts enhancing performance and nuance representation. How do they get so large though?
(1,454 words, Jan 23, 2025)
- [If you've upgraded boto3 or the JavaScript S3 client in the last week, uploading files won't work. Here's how to fix it. | Tigris Object Storage](/content/blog/downgrade-py-js/index.html): If you've recently upgraded boto3 or the JavaScript S3 client, file uploads may fail due to a required Content-Length header. Downgrade boto3 to version 1.35.x and the JavaScript client to v3.728.0 to resolve this issue until Tigris releases an update for compatibility with new versions.
(606 words, Jan 21, 2025)
- [Using Tigris as a Filesystem | Tigris Object Storage](/content/blog/tigris-filesystem/index.html): Object storage can be used as a filesystem in Kubernetes with the right setup. Here's how I set it up on my homelab cluster and the tradeoffs I made in the process.
(1,768 words, Dec 19, 2024)
- [How Beam runs GPUs anywhere | Tigris Object Storage](/content/blog/case-study-beam/index.html): Learn how Beam offers serverless GPUs optimized for developer productivity, across many clouds. By moving object storage to a separate managed service, Beam no longer needed to worry about it as another variable when designing for consistency across clouds.
(1,108 words, Dec 12, 2024)
- [Training with Big Data on Any Cloud | Tigris Object Storage](/content/blog/training-any-cloud/index.html): Training AI models on Big Data can be challenging due to the need for flexible storage and compute. Tigris, a cloud-agnostic storage layer, enables decoupling of storage from compute, making it easier to manage data and model weights across clouds. Tools like SkyPilot that abstract cloud providers and operating system configuration simplifies the compute layer, allowing for seamless data transfer between clouds using Tigris.
(3,916 words, Dec 3, 2024)
- [Nomadic Infrastructure Design for AI Workloads | Tigris Object Storage](/content/blog/nomadic-compute/index.html): This AI stuff is cool, but GPU inference is not needed all of the time. Most of the time your instances stay idle, which means you're just burning investor money without any real benefit. Today we'll learn how to make your compute spread between hosts nomadically, hunting deals and using Tigris to make it all possible.
(3,570 words, Nov 12, 2024)
- [Tigris supports Storage Tiers | Tigris Object Storage](/content/blog/tigris-supports-storage-tiers/index.html): Tigris now supports storage tiers! Optimize your storage cost based on access patterns with three tiers: Standard, Infrequent Access, and Archive.
(850 words, Nov 5, 2024)
- [How we built object notifications in Tigris | Tigris Object Storage](/content/blog/how-we-built-object-notifications/index.html): Tigris now supports object notifications! Object notifications are how you receive events every time something changes in a bucket. This post is a deep dive into the implementation of object notifications in Tigris.
(829 words, Oct 25, 2024)
- [Becoming your own Docker Registry with Tigris | Tigris Object Storage](/content/blog/docker-registry-at-home/index.html): Tigris lets you store your objects around the world so that you beat the speed of light getting your data to your users faster. Sometimes those include Docker images so that you can spin up more GPU time without having to download or manage your models separately. Join on in and learn how you can become your own Docker registry!
(849 words, Oct 16, 2024)
- [We're making our availability metrics public | Tigris Object Storage](/content/blog/availability-metrics-public/index.html): We're Tigris, a globally distributed object storage platform built for high-performance workloads. We're making our reliability metrics public! Check out our live dashboard and see how we're providing 99.99% global availability. We're pretty sure we're the first to share this type of live production data publicly.
(692 words, Oct 2, 2024)
- [How fal.ai offers the fastest generative ai in the world | Tigris Object Storage](/content/blog/case-study-falai/index.html): Learn how fal.ai offers the fastest generative ai in the world by using Tigris for object storage. Finding a storage solution built for an extremely performant global deployment was essential to keeping fal.ai accessible to a broad range of developers. Tigris not only was just crazy fast, it saved fal.ai 85% on their object storage costs as compared to other clouds.
(757 words, Sep 18, 2024)
- [Snip, Snap, Serve: Effortless Global Image Delivery with Tigris | Tigris Object Storage](/content/blog/effortless-global-image-delivery/index.html): Exploring Tigris' shadow bucket feature for fun and thumbnails. In the blog post the feature will be used in an less conventional fashion. An additional elixir service will generate thumbnails, where source files as well as generated thumbnails are stored on Tigris, while making use of the included CDN features of Tigris.
(1,379 words, Sep 7, 2024)
- [What’s the Big Deal with Conditional Writes Support in S3? | Tigris Object Storage](/content/blog/s3-conditional-writes/index.html): There has been a lot of enthusiasm about the recent announcement by AWS about support for Conditional Writes in S3. We will dive into why this is a big deal and what it means for developers. We will also explore CAS operations and how they relate to S3 Conditional Writes feature. Finally, we will discuss whether developers can now avoid client-side consensus mechanisms completely when using S3.
(783 words, Aug 23, 2024)
- [Metadata Querying for Object Storage feat. Elixir | Tigris Object Storage](/content/blog/metadata-quering-with-elixir/index.html): Now we get to the significantly more disruptive stuff. The things that while Tigris is an S3-compatible API it also provides features that enable entirely new use-cases and push the boundaries of what you can do with object storage. Let's see if we can't set your internal constraint-solver aflame with possibilities.
(993 words, Jul 19, 2024)
- [Sharing your Ollama models between Fly Machines using JuiceFS and Tigris | Tigris Object Storage](/content/blog/fly-tigris-juicefs/index.html): Tigris offers pretty great object storage, but the S3 API has its limits. Here I show how you can use JuiceFS to turn your bottomless Tigris storage into a FUSE mounted filesystem where we persist model data for more efficiently running production-scale Ollama on Fly.io
(1,087 words, Jul 16, 2024)
- [Eager & Lazy Caching feat. Elixir | Tigris Object Storage](/content/blog/eager-and-lazy-caching/index.html): At Tigris we offer a number of novel and practical improvements beyond what your typical Object Storage does. We fit these within the existing common APIs or as graceful extensions when necessary. In this post we look at how you can take control of the Tigris caching mechanism if you feel the need.
(678 words, Jun 20, 2024)
- [We're enabling billing for Tigris in July | Tigris Object Storage](/content/blog/enabling-billing-for-tigris-in-july/index.html): Since we launched our public beta three months ago, our usage has skyrocketed, and hundreds of early adopters have picked Tigris as their storage solution. We've implemented tons of requested features and invested heavily in Tigris' performance, security, and reliability. With that, we will start billing for Tigris usage in July because we're confident that Tigris is reliable enough for us to justify doing that.
(636 words, May 30, 2024)
- [AI Image Generator with Stability and Tigris | Tigris Object Storage](/content/blog/ai-image-generator-with-stability-and-tigris/index.html): Tigris is a globally distributed S3-compatible object storage solution available that is nativeliy integrated with Fly.io. In this article, we'll explore creating AI-generated images using the Stability API and storing them in a Tigris bucket for easy and fast retrieval.
(1,535 words, Apr 22, 2024)
- [Tigris vs. S3 & Cloudfront | Tigris Object Storage](/content/blog/tigris-vs-s3-cloudfront/index.html): Tigris is a globally distributed S3-compatible object storage solution available that can easily be hosted on Fly.io. In this article, we'll explore how Tigris fits into the existing slate of object storage options and why you might choose one over the other.
(437 words, Apr 18, 2024)
- [Announcing Tigris Seed Round led by Andreessen Horowitz | Tigris Object Storage](/content/blog/a16z-round-press-release/index.html): Tigris is a globally distributed object storage service that provides low latency anywhere in the world, enabling developers like you to store and access any amount of data using the S3 libraries you're already using in production. Today, we're announcing our seed round led by Andreessen Horowitz.
(940 words, Mar 14, 2024)
- [Tigris, the globally distributed S3-compatible object storage | Tigris Object Storage](/content/blog/object-storage-public-beta/index.html): Tigris is a globally distributed object storage service that provides low latency anywhere in the world, enabling developers like you to store and access any amount of data using the S3 libraries you're already using in production. Today, we're launching our public beta on top of Fly.io.
(734 words, Feb 14, 2024)
- [How we built our metadata layer on FoundationDB | Tigris Object Storage](/content/blog/data-layer-foundationdb/index.html): Tigris is a globally available, S3 compatible object storage service. Tigris uses FoundationDB's transactional key-value interface for its underlying metadata storage. In the first post of the series we will share the details of how we have built the metadata layer on top of FoundationDB. We will cover the topics data layout, and schema management.
(1,134 words, Jun 12, 2023)
- [Tigris's object store's authentication & authorization | Tigris Object Storage](/content/blog/tigris-authentication-authorization/index.html): Tigris is a globally available, S3 compatible object storage service. In the first post of the series we will share the details of how we have built the authentication and authorization support in Tigris.
(670 words, Jun 11, 2023)
- [A developer-driven approach to building secondary indexes presentation | Tigris Object Storage](/content/blog/foundationdb-meetup-indexes-talk/index.html): Building secondary indexes for is always about balance. A balance between a system that scales and is easy to manage and an API that is intuitive and delightful for a developer to use. Recently at Tigris Data, we have been adding secondary indexes to our metadata store that runs on top of FoundationDB and have been working hard to achieve a good balance between scale and developer delight. In a recent FoundationDB meetup, I presented on how Tigris looks to get the balance right with our secondary indexes.
(154 words, Apr 3, 2023)
- [Navigating Client-Side Encryption | Tigris Object Storage](/content/blog/client-side-encryption/index.html): Client-side encryption, a fortress of digital privacy, empowers users to safeguard their information with an impenetrable shield. By arming individuals with the cryptographic key to their data, this formidable approach ensures an unparalleled level of control, fortifying the sanctity of personal information against prying eyes and potential breaches. (757 words, Mar 13, 2023)
- [Backing up FoundationDB | Tigris Object Storage](/content/blog/backing-up-foundationdb/index.html): Tigris is a globally available, S3 compatible object storage service that uses FoundationDB for its metadata storage. This blog post describes how do we perform backups on FoundationDB, and what options exist for that purpose.
(960 words, Mar 6, 2023)
- [SRP Demystified: Strengthening Authentication in the Digital Age | Tigris Object Storage](/content/blog/srp/index.html): Evolution of how password based authentications evolved over time and how it led to Secure Remote Password.
(790 words, Feb 6, 2023)
- [Tigris transaction internals | Tigris Object Storage](/content/blog/transaction-internals-tigris/index.html): Tigris is a globally available, S3 compatible object storage service. Tigris uses FoundationDB's transactional key-value interface for its underlying metadata storage. In this blog post, we will describe transactions in Tigris, delving into the topics of serializable transactions, the mechanics of transactions within Tigris, and concurrency control.
(567 words, Jan 16, 2023)
- [Skipping the boring parts of building a storage platform using FoundationDB | Tigris Object Storage](/content/blog/building-a-database-using-foundationdb/index.html): Why Tigris leverages FoundationDB for its metadata storage layer
(1,655 words, Sep 21, 2022)
## About Pages
- [About Tigris Data | Tigris Object Storage Documentation](/content/docs/about/index.html): Tigris Data was founded in 2022 by (104 words)
- [About | Tigris](/content/about/index.html): Meet the Tigris team. We build globally distributed, S3-compatible object storage built for AI. (320 words)
## Resources
- [Full Page Index](/index.html): Browse all cached pages with rich metadata
- [About This Cache](/content/about.html): Methodology, technical details, and usage guidelines
- [XML Sitemap](/sitemap.xml): Machine-readable sitemap for crawler discovery
- [Robots.txt](/robots.txt): Crawler directives