Web app · Independent product

Gregory
A shared family grocery list: one household, one list, items ticked off in the shop and grouped by category so trips are quicker.

Overview
Gregory is a grocery assistant for households. Family members join the same household with an invite code, add what is needed and tick items off while shopping, so nobody has to remember the list on their own.
Platforms: Web · Installable to the home screen
Problem
Household shopping lists end up split across messages, notes and memory, and items get bought twice or forgotten.
Who it's for
Families and shared households.
Key features
- Shared household lists, joined with a single invite code, with creator, manager and member roles
- Lists with an optional target date; finished lists tidy themselves away after 48 hours
- Items with quantity, notes, a category and an optional photo to pick the right product
- Items grouped by category, and the app remembers which category your household uses for each item
- Lists refresh automatically while the app is open, so everyone sees the latest changes
- Installable to the home screen; pages you have already opened stay available without a connection
- Interface available in English, Bulgarian, German, French and Romanian
- Free to use, with an optional donation
My role
Owner and builder of the product.
Technology
Next.js, React, TypeScript, Tailwind CSS, Cloudflare Workers, Cloudflare D1, Drizzle ORM, Cloudflare R2, Kinde
Challenges & trade-offs
- Private item photos: they sit in a private bucket and are served only to signed-in members of the household that owns the list, with limits on file size and type. They are removed a day after the list's target date.
- Keeping everyone's list fresh without websockets: the app refreshes while the tab is visible and when you come back to it, which is simple, cheap and enough for a shopping list.
- Honest offline support: the app installs to the home screen and shows pages it has already loaded without a connection, while changes need a connection by design.
- Consent-aware cookies: the language preference is only stored with functional consent, and no analytics are used.
