Skip to main content
Hosted Cloud tables write media to their managed 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:
  1. Uploads computed media: AI-generated images, extracted video frames, and other computed media files are stored in your bucket
  2. Copies input media: Optionally persists referenced media files for durability
  3. Manages file lifecycle: Cleans up files when table data is deleted
  4. 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 in pixeltable.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:
Environment variables, for the current process:
The [pixeltable] section of the Pixeltable config file, for every database on the installation:
Configure these before creating tables. All media columns will automatically use the configured destinations.

Per-column destination (computed columns only)

For computed columns, you can override the default with a specific destination:
Then 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:
  1. Explicit column destination: highest priority (computed columns only)
  2. Database entry: db_input_media_dest / db_output_media_dest in [[pixeltable.database]]
  3. Environment variable: PIXELTABLE_INPUT_MEDIA_DEST / PIXELTABLE_OUTPUT_MEDIA_DEST
  4. Global config: input_media_dest / output_media_dest under [pixeltable] in config.toml
  5. Fallback destination: pxtfs://org:db/home when 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 at pxtfs://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:
For a key instead of 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.
Replace org-slug and db-slug with your Pixeltable Cloud organization and database names.
On Cloud, open Storage in the database sidebar and browse home. Nothing to configure for hosted tables.

Amazon S3

Google Cloud Storage

Azure Blob Storage

Azure supports multiple URI schemes:

Cloudflare R2

Backblaze B2

Tigris

Complete example

Here’s a full example using S3 for both input and computed media. First, configure the database’s default destinations in pixeltable.toml:
and, optionally, the AWS profile in ~/.pixeltable/config.toml (default credentials are used if not set):
Then declare the columns in your application file:
pxt schema update app.py production creates the table. Insert and Pixeltable handles the uploads:

Best practices

Structure your bucket with prefixes that reflect your application:
Use different prefixes or buckets for input vs computed media:
  • Easier to set different retention policies
  • Clearer cost attribution
  • Simpler backup strategies
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
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

Verify your credentials have the necessary permissions:
  • s3:GetObject, s3:PutObject, s3:DeleteObject
  • s3:ListBucket for the bucket
For GCS: storage.objects.create, storage.objects.get, storage.objects.delete
  • 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
  • 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.
Last modified on September 30, 2026