Forking Around

Dish Database

Because "what's for dinner?" shouldn't require a existential crisis every single night.

Dish Database — Because "what's for dinner?" shouldn't require a existential crisis every single night.
The Story Behind the Madness

How Dish Database Escaped The Idea Graveyard

A full-stack dish manager born from the eternal struggle of staring into the fridge. 50 recipes from a static JSON dataset, a real-time Convex backend for weekly plans, cooking history, and ratings. Browse and filter dishes, generate randomized weekly meal schedules with auto-scaled ingredients, track every cooking session with ratings and warnings, and sync your grocery list straight to Grocy. Past-you helping future-you eat better.

Genesis Spark

Staring into the fridge asking 'what's for dinner?' while recipes rot across 4 different apps, 2 bookmarks folders, and a napkin. That was the breaking point. I needed something centralized where I could add dishes, rate them, track my progress, and — most importantly — hook into Grocy so generating a weekly meal plan and pushing groceries is literally two clicks.

Core Problem & Insight

Cooking isn't the hard part — organizing the chaos around it is. Dishes scattered across websites and note apps. No way to track what worked, what didn't, or what needs more garlic. And every week, rebuilding a grocery list from memory like some kind of culinary archaeologist.

Known Chaos

  • Keeping a static JSON file as the single source of truth for recipes while persisting plans, history, and feedback in a real-time database—without them drifting apart like two people reading different menus.
  • Locking down the app to a single owner without spinning up a full multi-tenant auth system—nobody else needs to see my questionable meal ratings.
  • Scaling ingredient quantities by people count and aggregating them across an entire weekly plan into one shopping list that doesn't list "olive oil" seven times.

Solutions

  • Recipes live in the repo as static JSON—Convex only stores the dynamic stuff (weekly plans, cooking sessions, feedback, ingredient mappings, settings). Zero sync headaches, dishes stay immutable.
  • Convex Auth with magic-link login plus a server-side owner gate: one configured user, one check, done. Every plan/history/integration mutation is locked behind it.
  • Client-side plan generation picks season-aware random meals and desserts, then a shared shopping-list builder aggregates ingredients, scales by people count, and deduplicates by normalized name before shipping to Grocy.

Arsenal

Next.js

Next.js

A React framework for building server-side rendered and static web applications.

React

React

A JavaScript library for building user interfaces using a component-based architecture.

TypeScript

TypeScript

A typed superset of JavaScript that compiles to plain JavaScript.

Convex

Convex

A full-stack TypeScript development platform with a real-time reactive database.

Convex Auth

Convex Auth

An authentication solution built for Convex applications.

Tailwind

Tailwind

A utility-first CSS framework for rapidly building custom user interfaces.

Vercel

Vercel

A cloud platform for static sites and Serverless Functions that fits perfectly with your workflow.

Screenshots That Don't Lie

Visual proof that this thing actually works

Dish Database screenshot 1
Click to enlarge
Dish Database screenshot 2
Click to enlarge
Dish Database screenshot 3
Click to enlarge
Dish Database screenshot 4
Click to enlarge
Dish Database screenshot 5
Click to enlarge
Dish Database screenshot 6
Click to enlarge
Dish Database screenshot 7
Click to enlarge
Dish Database screenshot 8
Click to enlarge
Dish Database screenshot 9
Click to enlarge
Dish Database screenshot 10
Click to enlarge
Dish Database screenshot 11
Click to enlarge
Dish Database screenshot 12
Click to enlarge

Thanks for Peeking Behind the Curtain!

This one's still brewing in the lab. Head back and explore more chaotic creations!