Skip to main content
Managed S3-compatible object storage, powered by Tigris in production. Works with any S3 SDK or tool.
specific.hcl
service "api" {
  build = build.api
  command = "./api"

  endpoint {
    public = true
  }

  env = {
    S3_ENDPOINT   = storage.uploads.endpoint
    S3_ACCESS_KEY = storage.uploads.access_key
    S3_SECRET_KEY = storage.uploads.secret_key
    S3_BUCKET     = storage.uploads.bucket
  }
}

storage "uploads" {}
You can declare multiple buckets; each storage block is its own bucket with its own credentials.

Connection attributes

AttributeDescription
endpointS3-compatible endpoint URL (for example, http://127.0.0.1:5000 in dev).
access_keyAccess key for authentication.
secret_keySecret key for authentication.
bucketBucket name.

Example: AWS SDK (JavaScript)

import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";

const s3 = new S3Client({
  endpoint: process.env.S3_ENDPOINT,
  region: "us-east-1", // Required but ignored locally
  credentials: {
    accessKeyId: process.env.S3_ACCESS_KEY,
    secretAccessKey: process.env.S3_SECRET_KEY,
  },
  forcePathStyle: true, // Required for local S3-compatible servers
});

await s3.send(
  new PutObjectCommand({
    Bucket: process.env.S3_BUCKET,
    Key: "myfile.txt",
    Body: "Hello, world!",
  })
);

Local development

During specific dev, a local S3-compatible server runs automatically, and the same storage.* references resolve to it. Browse bucket contents from the local dashboard.

Production

Browse bucket contents and manage stored files from the dashboard. If a service outside of Specific needs to read from or write to a bucket, generate direct S3-compatible credentials (read/write or read-only) from the storage resource’s Access tab in the dashboard. In preview environments, object storage is forked from the parent environment.