cherish Wedding
A photo and video sharing app for my sister's wedding in July 2025: guests scanned a QR code, uploaded from their phones, and the gallery filled up live. It was my first project built mostly by AI agents, and it showed me where they break. On the day, it worked.

01 · The brief
My sister was getting married in July 2025, and I wanted every guest's photos in one place, the same evening. Guests scan a QR code, register in a few seconds without a password, and upload photos and videos. Uploads wait in a moderation queue, and approved ones appear in a live gallery. [PLACEHOLDER: guest count, confirmed by my sister]
02 · Stack
Next.js with the App Router, using parallel and intercepting routes for the lightbox. Supabase for auth, Postgres and storage, and Supabase Realtime so new photos appear without a reload. Zustand and React Query for state, shadcn/ui for the interface, Playwright and Jest for tests. The lightbox swipes, videos autoplay as you scroll, and the whole gallery downloads as a ZIP.

03 · Every tool at once
In summer 2025 I used everything on the market side by side: Cursor, Claude Code, Gemini CLI and Copilot. MCP was brand new, and I connected whatever it could reach: Playwright and Puppeteer for the browser, Supabase read-only for the database, Shortcut for tickets, Perplexity for research. My instructions were prompts and a single CLAUDE.md.
04 · Workaround spirals
The models of the time had small context windows and lost the thread quickly. When a query joined data across two Supabase schemas, an agent didn't stop: it stacked one workaround on the next, and debug SQL files piled up in the repo. I wrote down my first rule for agents: after two workarounds, stop and find the cause.
Key message After two workarounds, stop.
05 · On the day
On the wedding day the app did its job: guests uploaded, the moderation kept up, and the gallery filled up live. The rule from this project is still in my protocol today, as the rule that makes an agent ask after two failed attempts.
