Supported providers
Pixeltable Cloud
Managed storage, no bucket setup required
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
Which destination do you need?
Do not put
PIXELTABLE_API_KEY in config.toml as api_key. Use the env name. Hosted pods get their own worker key from the platform; you do not set it.
Configuration
There are two ways to configure cloud storage destinations. These apply to local Pixeltable and to bring-your-own buckets. Hosted Cloud tables skip this section.Global default destinations
Set default destinations for all media columns with environment variables (see Configuration):~/.pixeltable/config.toml (not the API key):
Per-column destination (computed columns only)
For computed columns, you can override the default with a specific destination:pxt schema update app.py my_app. In a notebook or a test, the same column is
t.add_computed_column(thumbnail=t.image.resize((128, 128)), 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:
PIXELTABLE_INPUT_MEDIA_DEST/PIXELTABLE_OUTPUT_MEDIA_DEST(or the matchingconfig.tomldest keys) - Hosted Cloud process:
pxtfs://org:db/homewhen the database is running in Cloud - Local process: local disk
Provider configuration
Pixeltable Cloud (home bucket)
A Pixeltable Cloud database comes with a managed Media Store atpxtfs://org:db/home. Hosted tables and services write there automatically. No destination, no provider account, no credentials file. Cloud is in Limited Beta: email [email protected] to get an account.
Use dest + PIXELTABLE_API_KEY only when a local Pixeltable process should write into that same bucket:
.env file has to be sourced first. Provider keys (AWS_ACCESS_KEY_ID, OPENAI_API_KEY, …) go under Secrets or pxt secret set.
- URI Format
- Local auth
org-slug and db-slug with your Pixeltable Cloud organization and database names.Amazon S3
- URI Format
- Authentication
Google Cloud Storage
- URI Format
- Authentication
- Requirements
Azure Blob Storage
- URI Formats
- Authentication
- Requirements
Azure supports multiple URI schemes:
Cloudflare R2
- URI Format
- Authentication
Backblaze B2
- URI Format
- Authentication
Tigris
- URI Format
- Authentication
Complete example
Here’s a full example using S3 for both input and computed media. First, configure your global destinations in~/.pixeltable/config.toml:
pxt schema update app.py production creates the table. Insert and Pixeltable handles the
uploads:
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.