# MirrorMatch Architecture (MVP) ## Goals - **Invite-only** groups. - Create a **Set** with **2–10 photos** and **2–4 names (Options)**. - Users can upload photos and set: - the **correct Option** (secret until reveal) - **points** (1–10) - Only **other users** (not the uploader of that photo) can guess for points. - **No reveal** until: - an admin/uploader triggers reveal, and/or - auto-reveal when everyone in the Group has finished guessing (configurable). ## Components - **Next.js app**: renders UI + server actions for all privileged operations. - **Postgres**: source of truth (users/groups/sets/guesses). - **MinIO (S3)**: stores image objects; app stores only `storageKey`. - **Auth.js (NextAuth)**: email magic links + optional OAuth. ## Security / privacy model - All pages require login. - A user can only read/write data for Groups they belong to. - Image access is via **short-lived presigned URLs** generated server-side for authorized users. - Invite tokens are **hashed** in the database. ## Deployment shape (Proxmox) - Run the app as a Docker container behind your reverse proxy. - Run Postgres + MinIO as Docker containers (or managed separately if you already have them). - Configure SMTP env vars to your email server for: - magic link auth - invite emails