← All selected work

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.

My role

Product & full-stack implementation

Built with

React · Cloudflare Workers · D1 · R2

Context

Web product; public demo available

Public demonstration gallery with fictional member identities.
Public demonstration gallery with fictional member identities.

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.

Roster & email verification Club session Worker API D1 records + R2 photos

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.