Split metadata storage and binary storage
Why: Photo binaries and domain metadata have very different scaling and access patterns.
Impact: MongoDB Atlas stores domain metadata while Cloudflare R2 handles media objects, keeping the API focused on orchestration and authorization.
Three-step upload workflow (init-upload -> direct upload -> complete-upload)
Why: The backend should not sit in the hot path for large file transfer.
Impact: Scalable uploads, reduced server bandwidth pressure, and cleaner status transitions for upload lifecycle tracking.
GeoJSON + geospatial indexes for store workflows
Why: Nearest-store suggestions are a core field UX enhancement, not an afterthought.
Impact: Fast nearest-store lookups and a clearer path to richer location-aware features later.
Provider/state + service-layer client architecture
Why: Mobile flows span auth, location, projects, photos, and uploads and need separation of concerns.
Impact: Cleaner feature boundaries in Flutter and easier maintenance/testing of operational flows.
Environment-first, cloud-ready backend setup
Why: The platform needs to be deployable early with predictable operational behavior.
Impact: Render-ready config, health/status probes, structured logging, and environment-driven secrets/rate limits.
Offline-tolerant UX touches before full offline architecture
Why: Field work needs resilience even before a full offline sync engine exists.
Impact: Local capture history and retry-capable uploads improve usability without overbuilding the POC/product stage.