Overview
ARI includes a central file storage system used by modules to store uploads such as photos, documents, and other files. You choose where those files are physically stored by setting environment variables in your .env.local file (or your hosting platform's environment manager, e.g. Vercel).
The Settings > Storage tab shows which provider is currently active and lists the exact variable names to copy for each provider. It is informational only -- there is no form to fill in or save button; all configuration happens through environment variables.
New modules use the configured provider by default unless they specify otherwise.
Choosing a Provider
The ARI_STORAGE_PROVIDER variable selects the storage backend:
| Value | Provider |
|---|---|
filesystem | Local Filesystem (default when unset) |
s3 | AWS S3 |
r2 | Cloudflare R2 |
supabase-s3 | Supabase Storage (S3) |
Set it in .env.local together with the credential variables for your chosen provider, then restart ARI to apply the changes.
Local Filesystem
The default provider. Files are stored on the same server that runs ARI, inside the data/storage/ directory.
- No configuration required -- works out of the box when
ARI_STORAGE_PROVIDERis unset. - Storage path:
data/storage/{user_id}/{bucket}/ - Best for local development or self-hosted deployments with persistent disk.
- Not available on serverless platforms like Vercel (no persistent disk).
AWS S3
Store files in an Amazon S3 bucket.
ARI_STORAGE_PROVIDER=s3
ARI_S3_ACCESS_KEY_ID=
ARI_S3_SECRET_ACCESS_KEY=
ARI_S3_BUCKET=
ARI_S3_REGION=
ARI_S3_ENDPOINT=
| Variable | Required | Notes |
|---|---|---|
ARI_S3_ACCESS_KEY_ID | Yes | IAM access key with S3 read/write permissions |
ARI_S3_SECRET_ACCESS_KEY | Yes | Corresponding IAM secret key |
ARI_S3_BUCKET | Yes | Lowercase, alphanumeric, hyphens, and dots only |
ARI_S3_REGION | No | e.g., us-east-1 (the default if not set) |
ARI_S3_ENDPOINT | No | Override for S3-compatible services |
Cloudflare R2
Store files in a Cloudflare R2 bucket. R2 is S3-compatible with no egress fees.
ARI_STORAGE_PROVIDER=r2
ARI_R2_ACCOUNT_ID=
ARI_R2_ACCESS_KEY_ID=
ARI_R2_SECRET_ACCESS_KEY=
ARI_R2_BUCKET=
| Variable | Required | Notes |
|---|---|---|
ARI_R2_ACCOUNT_ID | Yes | Your Cloudflare account ID |
ARI_R2_ACCESS_KEY_ID | Yes | R2 API token access key |
ARI_R2_SECRET_ACCESS_KEY | Yes | R2 API token secret key |
ARI_R2_BUCKET | Yes | Lowercase, alphanumeric, hyphens, and dots only |
Supabase Storage (S3)
Store files in Supabase Storage using its S3-compatible API.
ARI_STORAGE_PROVIDER=supabase-s3
ARI_SUPABASE_S3_ENDPOINT=
ARI_SUPABASE_S3_ACCESS_KEY_ID=
ARI_SUPABASE_S3_SECRET_ACCESS_KEY=
ARI_SUPABASE_S3_BUCKET=
ARI_SUPABASE_S3_REGION=
| Variable | Required | Notes |
|---|---|---|
ARI_SUPABASE_S3_ENDPOINT | Yes | e.g., https://xxx.supabase.co/storage/v1/s3 |
ARI_SUPABASE_S3_ACCESS_KEY_ID | Yes | Supabase S3 access key |
ARI_SUPABASE_S3_SECRET_ACCESS_KEY | Yes | Supabase S3 secret key |
ARI_SUPABASE_S3_BUCKET | Yes | Name of an existing Supabase storage bucket |
ARI_SUPABASE_S3_REGION | No | Defaults to us-east-1 if not set |
Security
- Credentials live only in environment variables. They are never stored in the database and never exposed through the UI.
- All file access is authenticated. Files are served through ARI's API (
/api/storage/serve/...) and require a valid session. There are no public file URLs. - Maximum file size: 25 MB per upload (default).
Switching Providers
You can change your storage provider at any time by updating ARI_STORAGE_PROVIDER (and the matching credential variables) and restarting ARI. Note that switching providers does not migrate existing files -- files already uploaded remain in the original provider's storage. New uploads will go to the newly selected provider.