Private event photo platform
A private photo-sharing experience for events, combining native mobile capture, invitations, personal photo allowances, and shared album reveals.
Overview
I am building a private event photography platform inspired by disposable cameras. Hosts create an album, define its visual style and reveal settings, and invite participants through a link, QR code, or short code. Each participant receives a personal photo allowance. Native mobile capture and a web guest experience let a group contribute photographs and discover the event together.
Technologies
SwiftUI, Next.js, TypeScript, Fastify, PostgreSQL, Prisma, Redis, BullMQ, Cloudflare R2, and Cloudflare Workers.
Architecture
A pnpm and Turborepo monorepo contains the SwiftUI iOS app, Next.js web experience, operations panel, Fastify API, and background workers. API routes delegate business rules to services backed by Prisma repositories. Image binaries live in S3-compatible object storage.
System design
Authorized clients upload through temporary signed URLs. A subsequent registration request queues processing through BullMQ and Redis. Workers register photographs, generate JPEG thumbnails and WebP previews, and prepare downloadable archives. Transactional registration combines duplicate detection, participant allowance consumption, and record creation. The iOS client maintains a persistent upload queue for intermittent connectivity.
A Cloudflare Worker validates signed media requests before looking up shared edge-cache objects, keeping private access checks ahead of delivery optimization.
Database design
PostgreSQL stores users, albums, memberships, cameras, photographs, pending uploads, download requests, and payment records. Photographs hold storage references and metadata.
Composite indexes support album galleries and ownership queries. Unique album/client-photo identifiers make retried uploads idempotent. Membership records track accepted photograph counts. Pending-upload records preserve ownership before registration and support cleanup. Store payment state is separated from an append-only event ledger.
Security
Access checks combine account state, album membership, role, and reveal policy. Upload registration verifies ownership, album-scoped storage keys, expected file metadata, and remaining allowance. Authentication includes session revocation checks; state-changing web requests use CSRF protection, and endpoint classes have rate limits. Reporting, blocking, moderation, and account/media deletion workflows are implemented.
Development status
In development. The repository contains connected mobile, web, API, and worker flows, including offline capture and background uploads on iOS. Production provider configuration, physical-device validation, operational rehearsals, and store submission remain release work.