Docs · Guides

Object storage & files.

Every project gets a private object-storage bucket for the files your app needs but doesn’t ship in its build — user uploads, generated exports, data dumps. Upload, download, and manage them from the dashboard; the bucket is a Canadian-owned, S3-compatible store.

The project Files tab is a straightforward file manager over a private bucket. It’s the right home for artifacts a build shouldn’t contain: things that change at runtime, are too large to commit, or are produced by the app itself.

Managing files

Open the Files tab on a project to upload a file, download it again, or delete it. The list shows each object’s key, size, and last modified time. Individual uploads are capped by plan, and total bucket usage counts against your plan’s storage quota — Plans & limits has the numbers. When usage reaches the cap, uploads pause until you free space or upgrade, rather than failing unpredictably.

Private by default

The bucket is private — objects aren’t served on a public URL just because they exist. Files are stored in a Canadian-owned, S3-compatible object store (MinIO), so data residency matches the rest of your app. Keep anything sensitive here rather than in your repository or build output.

What belongs here vs. in your build

  • Object storage: user-uploaded images, generated PDFs and CSVs, backups, anything created or changed after deploy.
  • Your build: static assets that are part of the app itself (logos, bundled JS/CSS) — ship those in the deploy, not the bucket.
  • Structured records: use a Postgres database for rows you query, not files in a bucket.