Overview
Kaneo supports private uploads in task descriptions and task comments. Uploads use an S3-compatible object storage backend:- the Kaneo API creates presigned upload URLs
- the browser uploads files directly to the storage backend
- Kaneo finalizes uploads into private asset records
- Kaneo serves uploaded files back through its own API
- images render inline
- other files such as CSV, PDF, or ZIP are inserted as attachment cards/links
- uploaded files are private by default and are not meant to be served from public bucket URLs
Recommended local setup: MinIO
For local or self-hosted deployments, MinIO is the recommended storage backend. It gives you:- a stable S3-compatible API
- a web console for bucket management
- a simple Docker setup
- better compatibility for direct browser uploads
.env values:
Important: internal Docker URLs are not enough in production
When Kaneo generates a presigned upload URL, the browser uploads directly to your storage backend. That meansS3_ENDPOINT must be reachable by the browser, not just by Docker containers.
For example:
http://minio:9000works only inside Dockerhttps://files.example.comworks from the browser
S3_ENDPOINT set to http://minio:9000.
Use a public MinIO hostname instead, for example:
Recommended public setup
The simplest production setup is:cloud.kaneo.appfor Kaneofiles.cloud.kaneo.appfor MinIO
- Kaneo signs uploads against
S3_ENDPOINT - the browser uses that signed URL directly
- Docker-internal names like
minioare not resolvable from a user’s browser
/api/asset/:id.
Other S3-compatible backends
Kaneo is not tied to MinIO. Any deployment can point Kaneo at another S3-compatible backend by changing theS3_* environment variables.
Examples:
- AWS S3
- Cloudflare R2
- MinIO
fs
Using fs
fs is another S3-compatible option if you want a lightweight local object store. It is built by friends of Kaneo.
When using fs, configure Kaneo like this:
fs:
- buckets are created through the S3 API or CLI, not through a web dashboard
- Kaneo still expects the bucket to exist before uploads start
- direct browser uploads may need reverse-proxy CORS headers, because
fsdoes not currently implement S3 CORS APIs
Required Kaneo storage variables
Set these in your Kaneo deployment:| Name | Description |
|---|---|
S3_ENDPOINT | S3-compatible API endpoint used by Kaneo |
S3_BUCKET | Bucket used for uploaded files |
S3_ACCESS_KEY_ID | Access key used to create presigned upload URLs |
S3_SECRET_ACCESS_KEY | Secret key used to create presigned upload URLs |
S3_REGION | Region used for signing |
S3_FORCE_PATH_STYLE | Usually true for MinIO and fs |
| Name | Description |
|---|---|
S3_PUBLIC_BASE_URL | Optional public asset base URL. Kaneo does not require this for the current private asset flow. |
S3_MAX_IMAGE_UPLOAD_BYTES | Maximum allowed upload size in bytes for images and other uploaded files |
S3_PRESIGN_TTL_SECONDS | Presigned upload URL lifetime |
Testing uploads
Once storage is configured:- Open a task.
- Paste, drag, or select a file inside the description or a comment.
- Confirm images render inline and other files render as attachment cards/links.
- confirm the bucket exists
- confirm the credentials can write to the bucket
- confirm the storage endpoint is reachable from the browser
- confirm
S3_ENDPOINTis a public URL, not an internal Docker hostname - if using direct browser uploads, confirm CORS is configured correctly for your storage endpoint