Skip to main content
Apps that handle files — avatars, receipts, CSV exports, media — get real object storage (Amazon S3 underneath). Uploads and downloads work the way production apps do it: your app mints a secure, expiring link, and the user’s browser transfers the file directly to storage. Large files never squeeze through your app’s own server.

What this means for your app

  • Users can upload files of any practical size; downloads are served through expiring signed links, so files aren’t publicly listable.
  • Files persist independently of the app — they survive restarts, sleeps, and new deploys.
  • The agent can list, inspect, and clean up stored files while building (“delete the test uploads”).

Isolation

Every file your project stores lives under your project’s own storage scope. The scoping is applied at the platform boundary — your app physically cannot read or write another project’s files, and deleting a project’s files affects that project alone.

Good to know

  • Signed links expire (15 minutes by default, configurable up to 7 days) — this is a feature, not a bug: a leaked link goes stale.
  • Storage is for files. API keys and credentials belong in Secrets, which is encrypted and rotatable — the agent follows this rule and so should any code you add after exporting.
  • Your app never holds cloud credentials; it requests links through the platform’s runtime broker. That’s also why the same code works identically in preview and production.