Gleam Eats
A restaurant review site where each viewer weights taste, price and service, and every place gets a personal score with its arithmetic shown.
What it does
Reviewers score a restaurant from 0 to 10 on taste, price and service, plus optional categories. Each viewer sets their own weights for those categories and for cuisines, and every place shows a score computed from that viewer's weights, with the arithmetic shown on the page.
Places are seeded from Overture Maps around Santa Clara University and San Jose State. The committed seed holds 25,662 Bay Area, 33,786 Los Angeles and 13,348 San Diego places.
The code is written by AI agents through everythingdev; I approve the previews and pick between the design options they put to me.
Architecture
- App. 33 pages, 50 API routes and 34 database tables in a Next.js 16 App Router app on Postgres with PostGIS through Drizzle, with PGlite locally and 23 migrations.
- Scoring. Pure functions over per-place aggregates and the viewer's weights, across 25 versioned categories. 33 cuisine squares map onto Overture's category taxonomy, and a predicted taste score walks that tree with a prior.
- Places. A Python extract pulls places from Overture, a refresh script cleans them in fixed passes, a monthly workflow opens a pull request per area, and a seed workflow loads it on merge.
- Hosting. A Docker image on Render behind a health check. Photos and share cards in Cloudflare R2, email through Resend, sign-in with Google or a magic link through Better Auth.
- Tests. 152 unit test files with 1,858 cases and 14 Playwright specs with 176 cases, plus a local gate that compares rendered pages against a screenshot baseline.
Hardest problems
Cleaning 72,796 places
The refresh only proposes changes: a cheaper model flags problems, a stronger model proposes fixes, and hand corrections kept in one file are applied last so they survive every new Overture release. Making each model call an isolated CLI call cut tokens by 74%.
Share cards drawn once
Each share card is drawn once, stored in R2 under a keyed hash of every input that shapes it, and served as immutable. A card that shows a photo is deleted with that photo.
Photos that carry nothing extra
Uploads are re-encoded on the server, which strips GPS data; HEIC photos decode without native libraries; deletions go through a retried trash queue.
A screenshot gate that stays fast
The local gate re-renders only the routes a change can draw, rather than every page on every change.
