Skip to Content
v0.8.0 · shippedNative iOS / Android / Flutter / Capacitor SDKs, A2A discovery, SOC 2 readiness, residency, BYO storage, BYOK. Read the changelog →
Vault-ref access keys — never plaintext · · open live demo ↗

Storage

Route: /storage

The Storage page configures where Mushi writes report attachments, session recordings, and evidence artifacts. By default, Mushi uses managed Supabase storage. You can switch to your own bucket for data-residency or cost reasons.


Providers

ProviderNotes
Supabase (default)Managed — no configuration required. Files stored in your Supabase project.
AWS S3Requires bucket, region, and an IAM key pair with s3:PutObject / s3:GetObject.
Cloudflare R2Requires bucket, region (use auto), and an R2 API token.
Google Cloud StorageRequires bucket and a service-account JSON key.

Configuring a custom bucket

Each project has its own storage config card. The card shows:

  • Health status chipunknown, healthy, degraded, or failing with last-check time
  • Last health error if the previous check failed
  • Debug log — a toggle that reveals a per-step test table (step name, ok/fail, ms, detail)

To configure:

  1. Choose a Provider from the dropdown.
  2. Fill in the required fields for your provider (see table below).
  3. Click Save (saves without activating) or Save & enable (saves and marks the config active).
  4. Click Health check to confirm Mushi can reach the bucket — the debug log opens automatically.
FieldRequired for
BucketS3, R2, GCS, MinIO
RegionS3 (us-east-1), R2 (auto)
EndpointMinIO, custom S3-compatible
Path prefixAll providers (optional subfolder)
Signed URL TTLAll providers (seconds, default 3600)
Access key Vault refS3, R2, MinIO — Vault secret name
Secret key Vault refS3, R2, MinIO — Vault secret name
GCS service-account Vault refGCS — Vault secret name
KMS Key IDOptional server-side encryption
Use signed URLsCheckbox
Require encryptionCheckbox

Bucket and region are required for S3 and R2. The API will return a 400 VALIDATION_ERROR if either is empty — this is enforced on the server to prevent saving a broken config.

Storage settings are per-project. Different projects can use different providers.


Required IAM permissions (S3)

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListBucket"], "Resource": ["arn:aws:s3:::YOUR_BUCKET", "arn:aws:s3:::YOUR_BUCKET/*"] } ] }

Required R2 permissions

Create an R2 API token with Object Read & Write scope scoped to the target bucket.


Required GCS permissions

Attach the roles/storage.objectAdmin role to your service account, scoped to the bucket.


Data residency

For data-residency requirements, use a bucket in the same region as your Supabase instance. See Security → Data residency for the full matrix.


Last updated on