pxtfs://org:db/home store without configuration. For a local table that should write to S3, set PIXELTABLE_OUTPUT_MEDIA_DEST=s3://my-bucket/output/ before creating the table. Computed media files then go to that bucket when rows are inserted.
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?
Pixeltable reaches the home bucket with either credential: a
pxt login session or an API key (Signing in). The key can also be api_key in the [pixeltable] section of the Pixeltable config file; PIXELTABLE_API_KEY wins when both are set, and either one outranks a pxt login session. Hosted pods get their own worker key from the platform; you do not set it.
Configuration
Cloud storage destinations are set as a default for the database, or per column. Local Pixeltable and bring-your-own buckets need this. A hosted Cloud database defaults to its home bucket and only needs it to use a bucket of its own.Default destinations
You can set default destinations for media columns in three places, listed here from highest to lowest precedence (see Configuration for details). The database entry inpixeltable.toml, for one database (see the Cloud configuration reference on the CLI page). Leave name off for the local database, or set name = 'pxt://org:db' for a hosted one:
[pixeltable] section of the Pixeltable config file, for every database on the installation:
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, set a default input destination as shown above.Precedence rules
Destinations are resolved in this order:- Explicit column destination: highest priority (computed columns only)
- Database entry:
db_input_media_dest/db_output_media_destin[[pixeltable.database]] - Environment variable:
PIXELTABLE_INPUT_MEDIA_DEST/PIXELTABLE_OUTPUT_MEDIA_DEST - Global config:
input_media_dest/output_media_destunder[pixeltable]inconfig.toml - Fallback destination:
pxtfs://org:db/homewhen the database is hosted in Cloud; local disk (usually~/.pixeltable/media) when it is running locally
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 contact@pixeltable.com to get an account.
Use dest plus a credential only when a local Pixeltable process should write into that same bucket:
pxt login, create it under API Keys in the dashboard and export it, or set [pixeltable].api_key in ~/.pixeltable/config.toml. Pixeltable does not load a .env file on its own. 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 the database’s default destinations inpixeltable.toml:
~/.pixeltable/config.toml (default credentials are used if not set):
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.