Object Storage
Configure S3-compatible object storage (AWS S3, Cloudflare R2, MinIO, Backblaze B2) for self-hosted Cadense
Cadense stores workspace files, knowledge-base documents, invoice attachments, and generated files in object storage. On a self-hosted deployment you can point it at AWS S3 or any S3-compatible endpoint — Cloudflare R2, MinIO, or Backblaze B2.
AWS S3
Set your region and credentials. S3_BUCKET_NAME is the general bucket — it holds workspace files, invoice attachments, and Mothership uploads.
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
S3_BUCKET_NAME=cadense-filesSome file contexts use their own bucket and do not fall back to S3_BUCKET_NAME. If you use knowledge base or run workflows that produce generated files, set those buckets too — see Per-context buckets below.
Per-context buckets
Cadense routes each file context to a dedicated bucket (or Azure container). Knowledge-base and generated (execution) files must be configured separately — an unset knowledge-base bucket resolves to empty and its uploads fail.
| Context | S3 variable | Azure variable | Fallback |
|---|---|---|---|
| Workspace files, invoices, Mothership | S3_BUCKET_NAME | AZURE_STORAGE_CONTAINER_NAME | — |
| Knowledge base | S3_KB_BUCKET_NAME | AZURE_STORAGE_KB_CONTAINER_NAME | none (required) |
| Generated / execution files | S3_EXECUTION_FILES_BUCKET_NAME | AZURE_STORAGE_EXECUTION_FILES_CONTAINER_NAME | sim-execution-files |
| Chat | S3_CHAT_BUCKET_NAME | AZURE_STORAGE_CHAT_CONTAINER_NAME | none |
| Copilot | S3_COPILOT_BUCKET_NAME | AZURE_STORAGE_COPILOT_CONTAINER_NAME | none |
All contexts share the same region and credentials; only the bucket/container differs.
S3_KB_BUCKET_NAME=cadense-knowledge-base
S3_EXECUTION_FILES_BUCKET_NAME=cadense-execution-filesS3-compatible endpoints (R2, MinIO, Backblaze B2)
For providers other than AWS, set S3_ENDPOINT to the provider's endpoint. Path-style addressing (S3_FORCE_PATH_STYLE=true) is required for endpoints without virtual-hosted bucket DNS (for example MinIO); virtual-hosted providers such as R2 leave it false.
S3_ENDPOINT only changes where requests are sent — bucket names, credentials, and region are still configured the same way. When S3_ENDPOINT is unset, Cadense uses standard AWS S3.
Cloudflare R2
S3_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com
S3_FORCE_PATH_STYLE=false
AWS_REGION=auto
AWS_ACCESS_KEY_ID=<r2-access-key-id>
AWS_SECRET_ACCESS_KEY=<r2-secret-access-key>
S3_BUCKET_NAME=cadense-filesMinIO (local / on-prem)
S3_ENDPOINT=http://localhost:9000
S3_FORCE_PATH_STYLE=true
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=<minio-access-key>
AWS_SECRET_ACCESS_KEY=<minio-secret-key>
S3_BUCKET_NAME=cadense-filesBackblaze B2
S3_ENDPOINT=https://s3.<region>.backblazeb2.com
S3_FORCE_PATH_STYLE=false
AWS_REGION=<region>
AWS_ACCESS_KEY_ID=<b2-key-id>
AWS_SECRET_ACCESS_KEY=<b2-application-key>
S3_BUCKET_NAME=cadense-filesDirect uploads
Some upload flows — such as knowledge-base document uploads — use presigned direct uploads: the client requests a presigned URL, sends the bytes straight to storage, then registers the file, so large files never proxy through the app. Other flows, such as the workspace Files page, post to an API route and the server writes the bytes to storage. When no cloud storage is configured, everything falls back to the local filesystem automatically — no configuration change is needed.
Azure Blob Storage
Azure Blob is also supported as an alternative to S3-compatible storage:
AZURE_ACCOUNT_NAME=...
AZURE_ACCOUNT_KEY=...
AZURE_STORAGE_CONTAINER_NAME=cadense-filesExisting files, file IDs, and storage keys remain stable across storage-provider configuration. Switching providers does not migrate existing objects — plan a copy if you change buckets or providers.