1 NGO Docs

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

  1. Browser calls POST /api/media/upload on the Next.js app.
  2. The BFF forwards the file to POST /internal/media/upload on Railway.
  3. 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.