pnpm + Turborepo with three Fastify APIs and two Next.js 15 frontends, sharing packages for auth, DB, and config.
📸
Photo Pipeline
Photographers upload via presigned R2 URLs. BullMQ workers generate thumbnails, watermarks, and run face recognition automatically.
🧠
Face Clustering
A stateless Google Cloud Run service matches selfie embeddings to project photos. Binary cluster membership drives auto-tagging — no per-project collection lifecycle to manage.
💳
Purchases
End users buy photo packages via Stripe. Watermarked previews are shown until purchase; originals are delivered via presigned download URLs.
🔐
Biometric Consent
No selfie processing without active consent. Revocation cascades atomically — selfie, R2 object, and all auto-tags are cleaned up.
☁️
Cloud-native
Cloudflare R2 for storage, Google Cloud Run for face clustering, Resend for email, Redis + BullMQ for the job queue.