Case study / Club PhotoHub
A private gallery starts with the boundary.
A photo-sharing platform where member verification and club isolation are part of the application architecture.
01 / The problem
The workflow behind the request.
Clubs need a shared place for event photos, but public feeds and unstructured folders do not express who belongs to the club or who is allowed to manage its content.
02 / What I built
Connect the complete path.
I built a React client and a Cloudflare Worker API, with D1 for application records and R2 for photo files. Club administrators manage the roster; members verify against their club record and email before joining. Server-side sessions scope member and gallery access to the club.
03 / Engineering decision
A tradeoff that shaped the system.
Keep the large photo files in object storage and the membership and gallery relationships in a database. That separation keeps media delivery independent of the records that determine access, but requires the API to enforce the club boundary on both.
The product has an explicit demonstration mode. Production does not silently fall back to local demo storage when its API is unavailable. The implementation also includes content reports and member-blocking controls for moderation.
04 / Result & evidence
What the implementation enables.
The resulting product supports separate club workspaces, roster-based onboarding, a member gallery, and administration. Its public demo makes the experience inspectable without opening a real club’s private records.
Evidence and scope
The current repository documents server-side session and club scoping, and contains moderation and roster flows. The public gallery demo was opened for this case study. Native mobile packaging is separate from App Store approval and device acceptance.
05 / What I learned
The lesson I take into the next build.
Privacy is a property of the complete path from sign-in to file access. A private-looking interface is useful only when the backend preserves the same membership boundary.