Platform
Media storage policy
Organisation and public-page media use Cloudflare R2 — never Supabase Storage.
Never use Supabase Storage for organisation website files. Supabase Storage is reserved for profile avatars only.
Logos, story covers, event images, campaign assets, and other tenant-published media are uploaded through the dashboard to Cloudflare R2 via the Railway privileged API.
Upload path
- Browser calls POST /api/media/upload on the Next.js app.
- The BFF forwards the file to POST /internal/media/upload on Railway.
- Railway stores the object in R2 and returns a public URL.
Server configuration
Configure R2_ACCOUNT_ID, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_BUCKET_NAME, and R2_PUBLIC_BASE_URL in server/.env.local (see server/.env.example). Full policy: docs/STORAGE.md in the repository.
Need to configure this now? Open Dashboard → Integrations, or read the Paystack guide.