Media
The media library manages your project's files — images, documents, anything — with one defining property: the bytes live in your own S3-compatible bucket, never on the platform. The project database stores only metadata (filename, size, type, folder, who uploaded).
Setup: the storage integration
Uploading needs a bucket. Under Settings → Integrations → Storage, configure any S3-compatible provider (AWS S3, MinIO, Cloudflare R2, DigitalOcean Spaces…): endpoint, bucket, access key, secret key, and optionally a public base URL if your bucket serves files directly from a CDN or public host. The secret is encrypted at rest and write-only; the endpoint is egress-validated whenever it's used.
Because access control, retention and geography are your bucket's settings, they stay entirely under your control — the dashboard links to files, it never proxies them.
Uploading and organising
- Upload accepts files into the current folder (multipart: a
fileplus an optionaldirectory). - Folders are prefixes, exactly like object storage: a folder exists as long as something is filed under it, and nesting works (
images/covers). Intermediate levels are synthesised in the tree so everything stays reachable. - Moving a file between folders is metadata-only — the stored object in your bucket is untouched, so moves are instant and never copy bytes.
- Deleting removes the object from your bucket and the metadata row.
Projects migrated from v1 keep their folders too: v1 stored the folder inside the filename (blog/photo.jpg) with zero-byte .directory placeholders, and the library recognises both shapes — old folders appear normally, placeholder files stay hidden, and nothing is rewritten in your database.
URLs
The grid shows previews and each file offers Open and Copy URL:
- With a public base URL configured, links are plain public URLs — ideal when the bucket fronts a CDN.
- Without one, links are time-limited signed URLs minted from your credentials on demand.
If storage is unreachable or unconfigured, listings still work — you see the metadata, just no previews.
Using media in content
media fields on schemas store references to library files (single or list). Your site renders whatever URL scheme your bucket serves — the records API returns the references, and the media API resolves them to URLs.
Permissions
media.read to browse, media.upload to add, media.delete to remove — grantable per role and per API key like every other permission (details).