Skip to contentNewLaunching soon on Product Hunt (opens in a new tab)
StorageAll sections

Storage

Storage keeps the files your app works with: profile photos, receipts, PDFs, videos. The database stores the record, Storage stores the file it points to, and files are private unless you make them public.

In the console: Build › StorageUpdated October 12, 2026

Walkthrough coming soonA 20-second tour of Storage will play here.

Why you need it

A database is built for rows of text and numbers, not for a 4 MB photo or a 200-page PDF. Putting files in tables makes every query slower and every backup larger. Storage gives files their own home, organised in buckets, and your database keeps only each file’s path. Private files are read through links that expire, so a file meant for one person does not end up public.

For example

  • A user uploads a profile photo. The app stores it in an avatars bucket and saves its path on the user’s profile row.
  • A shop shows product photos to every visitor from a public bucket.
  • An invoicing app keeps PDFs private and gives each customer a download link that expires.
  • A marketplace converts uploaded photos to WebP at a fixed width so pages load faster.

How it works

  1. Your agent creates a bucket

    A bucket is a folder with its own rules. It is private unless you make it public, and it can limit which file types it accepts.

  2. Your app uploads the file

    From the browser or a server, through the SDK or /api/v1/{projectId}/storage/upload. Images can be resized and converted to WebP, JPEG or PNG on the way in.

  3. Backenly checks it

    Executable files are refused, and so is a file whose declared type does not match its extension.

  4. Your app reads it back

    A public file has a stable URL. A private file is read through a signed link that expires.

Try it

Once your coding agent is connected, ask it:

Ask your agent
Create a private avatars bucket that only accepts images, and store each user’s photo path on their profile.
Ask your agent
Create a public bucket for the product photos in the shop’s catalogue.
From your app
const { path, url } = await backend.storage.upload(file, `avatars/${userId}.jpg`, {
  bucket: 'avatars',
  format: 'webp',
  width: 512,
})

Good to know

  • Uploads come from your app. Your agent manages buckets and links, but does not upload files itself.
  • Deleting a file or a bucket from your agent waits for a person to approve it in the console.
  • How much you can store depends on your plan. See Pricing.