Status: Accepted

Context

Videos, presentations, and rendered variants can be large. They should not pass entirely through Next.js or be stored in PostgreSQL.

Decision

Store files in an S3-compatible service, use MinIO during development, and use signed URLs for uploads and reads.

Rationale

  • direct browser uploads
  • private buckets and temporary access
  • scaling independent from the web server
  • local compatibility through MinIO
  • separation of relational metadata and binary objects.

Consequences

PostgreSQL and object storage must be backed up consistently. Internal and browser-reachable S3 addresses may differ. CORS, signed-URL lifetime, and orphan cleanup become operational concerns.