Supported Providers
Amazon S3
Native S3 storage with full feature support
Google Cloud Storage
GCS buckets with gs:// URI scheme
Azure Blob Storage
Azure containers with wasb:// or abfs:// schemes
Cloudflare R2
S3-compatible storage with zero egress fees
Backblaze B2
Cost-effective S3-compatible storage
Tigris
Globally distributed S3-compatible storage
How It Works
When you configure a storage destination, Pixeltable automatically:- Uploads computed media — AI-generated images, extracted video frames, and other computed media files are stored in your bucket
- Copies input media — Optionally persists referenced media files for durability
- Manages file lifecycle — Cleans up files when table data is deleted
- Handles caching — Downloads files on-demand with intelligent local caching
Configuration
There are two ways to configure cloud storage destinations:Global Default Destinations
Set default destinations for all media columns in yourconfig.toml (see Configuration for details):
Per-Column Destination (Computed Columns Only)
For computed columns, you can override the default with a specific destination:The
destination parameter only applies to stored computed columns. For input columns, use the global input_media_dest configuration.Precedence Rules
Destinations are resolved in this order:- Explicit column destination — highest priority (computed columns only)
- Global default —
input_media_destfor input columns,output_media_destfor computed columns - Local storage — fallback if no destination is configured
Provider Configuration
Amazon S3
- URI Format
- Authentication
- Example
Google Cloud Storage
- URI Format
- Authentication
- Requirements
- Example
Azure Blob Storage
- URI Formats
- Authentication
- Requirements
- Example
Azure supports multiple URI schemes:
Cloudflare R2
- URI Format
- Authentication
- Example
Backblaze B2
- URI Format
- Authentication
- Example
Tigris
- URI Format
- Authentication
- Example
Complete Example
Here’s a full example using S3 for both input and computed media. First, configure your global destinations in~/.pixeltable/config.toml:
Best Practices
Use prefixes to organize data
Use prefixes to organize data
Structure your bucket with prefixes that reflect your application:
Separate input and output destinations
Separate input and output destinations
Use different prefixes or buckets for input vs computed media:
- Easier to set different retention policies
- Clearer cost attribution
- Simpler backup strategies
Configure lifecycle policies
Configure lifecycle policies
Set up bucket lifecycle policies to automatically:
- Transition old data to cheaper storage tiers
- Delete temporary/staging data after a period
- Enable versioning for critical data
Use IAM roles in production
Use IAM roles in production
When running on cloud infrastructure, use IAM roles instead of access keys:
- More secure (no key rotation needed)
- Automatic credential refresh
- Better audit trails
Troubleshooting
Access Denied errors
Access Denied errors
Verify your credentials have the necessary permissions:
s3:GetObject,s3:PutObject,s3:DeleteObjects3:ListBucketfor the bucket
storage.objects.create, storage.objects.get, storage.objects.deleteBucket not found
Bucket not found
- Ensure the bucket exists and the name is spelled correctly
- Check the region matches your credential configuration
- For S3-compatible providers, verify the endpoint URL is correct
Slow uploads
Slow uploads
- Pixeltable uses connection pooling and parallel uploads automatically
- Consider using a bucket in the same region as your compute
- Check your network bandwidth and latency
Configuration Reference
See the complete list of storage configuration options including profiles for S3, R2, B2, Tigris, and Azure.
Need help setting up cloud storage? Join our Discord community for support.