Architecture: How should media files (images, documents) be stored across ...

Documentation for Sessions

🏗️ Architecture: How should media files (images, documents) be stored across ...

Date: 2026-03-10
Time: 17:58:34 UTC
Session: gspace1-198.2
Agent: storage
Confidence: 95%
Status: ✅ Documented


📋 Decision Context

Question:

How should media files (images, documents) be stored across the GoGrab platform — R2, GridFS, or single solution?

Task: S198.1: Multimodal vision + Cloudflare R2 storage


🎯 Decision Made

Chosen:

Hybrid approach: Cloudflare R2 for new media (chat images, tenant uploads, generation artifacts) alongside existing MongoDB GridFS for small transactional agent files. 6 R2 buckets organized by domain: gograb-chat-media, gograb-assets, gograb-spaces, gograb-space-production, gograb-gen, gograb-backups.

Options Considered:

  1. All R2 — migrate GridFS completely
  2. All GridFS — add CDN proxy layer
  3. Hybrid R2 + GridFS by use case
  4. Single R2 bucket with key prefixes
  5. Per-MongoDB-database R2 buckets (1:1 mapping)

💭 Reasoning

R2 wins on: CDN delivery (300+ edge cities vs direct MongoDB), zero egress cost, presigned URLs for direct browser upload, streaming (no RAM buffering), and S3-compatible API (vendor-portable). GridFS wins on: atomic transactions with MongoDB documents, rich metadata queries (handoffId, sessionNumber, tags), and zero migration cost for existing working code. Neither alone is sufficient — R2 can't replace GridFS's transactional consistency with handoff documents, and GridFS can't match R2's CDN/streaming for user-facing media. The hybrid approach uses each where it's strongest. 6 buckets (not 1) because: different TTLs (permanent vs 30d vs 90d), different access control (admin-only vs rate-limited end-users), different compliance requirements (GDPR-deletable vs internal), and easy cost attribution per domain.


📁 Files Involved


🔗 Related


Auto-generated by MCP Smart Consolidation