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:
- All R2 — migrate GridFS completely
- All GridFS — add CDN proxy layer
- Hybrid R2 + GridFS by use case
- Single R2 bucket with key prefixes
- 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
libs/libs-api/r2-storage-core/src/lib/services/r2-storage.service.tslibs/libs-api/r2-storage-core/src/lib/r2-storage.constants.tsAPIs/backend-api/src/app/spaces/space-database.service.ts
🔗 Related
- Decision ID:
dev_1773165514466_pyo7w2h - Session: 198
- Workspace: gspace1
Auto-generated by MCP Smart Consolidation