--- title: "Proofloft: client proofing galleries for a wedding and portrait photographer" author: "@chris" author_url: https://elements.dev/users/chris published: 2026-09-30T21:07:17.337Z url: https://elements.dev/demos/9uly2hcx/proofloft-client-proofing-galleries-for-a-wedding-and kind: post format: article --- # Proofloft: client proofing galleries for a wedding and portrait photographer by [@chris](https://elements.dev/users/chris) ยท 2026-09-30 ## Description Private photo galleries where clients heart favorites and comment live, and the photographer downloads the chosen file names. Proofloft needed private galleries a client opens from a link, photo uploads, hearts and comments that both sides see as they happen, emails at each handoff and a file of the chosen names for the photographer. Each of those is a part of Elements, so the agent spent its 26 minutes on the galleries themselves. **What Elements gave the app** - **Live hearts and comments.** Favorites and comments are LiveTables. A client hearts a photo and the photographer's open gallery shows it at once, and a reply lands under the client's comment the same way. Once a gallery is final, the client's picks are locked in. A channel tells the photographer the moment a client submits. - **Client access from a link.** A client opens their gallery from the private link in their email and enters its password once; a cookie for that gallery keeps them in. - **Uploads into the database.** The photographer uploads photos straight from a form, the bytes are stored in the database, and each photo is served at a url made from its id and a hash of its bytes. - **Emails at each handoff.** Sharing a gallery emails the client the link, and submitting selections emails the photographer the picks. - **Server calls as function calls.** Creating a gallery, uploading, inviting the client and marking selections final call server functions straight from the page with `@rpc`, and the photographer downloads the chosen file names as a text file. - **Data from SQL files.** Migrations define the studio and seed one photographer, three galleries with 82 photos, and one client's hearts and comments. **What the project server gave the agent** The project server runs alongside the agent and answers as soon as a file is saved: it type-checks the templates, TypeScript and SQL, applies migrations and reruns the tests, so every question came back right away and the agent kept building. **What shipped** The app type-checks with zero errors and all 26 tests pass. Every page works on desktop and phone.