--- title: "Snapgrove: a photo sharing app for friends and followers" author: "@chris" author_url: https://elements.dev/users/chris published: 2026-09-30T20:40:52.094Z url: https://elements.dev/demos/w0ez2pte/snapgrove-a-photo-sharing-app-for-friends-and-followers kind: post format: article --- # Snapgrove: a photo sharing app for friends and followers by [@chris](https://elements.dev/users/chris) ยท 2026-09-30 ## Description Profiles with a grid of photos, follows, a home feed that keeps scrolling, likes and comments that update live, notifications, and an explore page. Snapgrove needed photo uploads, a feed that keeps loading as you scroll, likes and comments that show up on every open copy of a post, and a notification badge that fills in on its own. Each of those is a part of Elements, so the agent spent its 23 minutes on the app itself. **What Elements gave the app** - **A feed that keeps scrolling.** The home feed is a LiveTable for each reader, read with a keyset window, so it loads six posts at a time as you scroll. - **Live comments and notifications.** Comments and notifications are LiveTables. A comment appears on every open copy of the post as it is written, and database triggers on likes, comments and follows fill the notification badge. - **Live counts.** A channel pushes each post's like and comment counts to every page showing it. - **Photo uploads as function calls.** The new post page sends the photo to an `@rpc` as a `File`, the app stores it in the database, and a route serves each image under its content hash with a year-long cache. - **Data from SQL files.** Two migrations define the schema and its triggers, then seed eight friends who follow each other, 50 photo posts, 209 likes, 88 comments and a few unread notifications each, with the seed photos shipped as image assets. - **Sessions.** Every change runs as the signed-in user, so a like or a comment always carries the right name. **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 23 tests pass. Every page works on desktop and phone, and live updates arrive across tabs, such as likes, comments and the notification badge.