Next.js 16 · React 19 · TypeScript · Gemini API · Firebase Auth · TanStack Query · Drizzle ORM · PostgreSQL · Tailwind

FridgeChef — recipe ideas from what's actually in your fridge

A Next.js app that turns a list of ingredients you have on hand into grounded recipe suggestions, self-hosted end to end.

View project ↗

Context

I cook from whatever's left in the fridge more often than from a plan, and most recipe apps assume the opposite — a shopping list, then a recipe, then a trip to the store. FridgeChef starts from the ingredients you actually have and works backward to something you can cook tonight.

Problem

The obvious way to build this is to hand a list of ingredients to an LLM and ask for recipes. The obvious way also produces recipes calling for a pantry you don't have — an LLM will happily assume you own saffron and shallots because recipes on the internet usually do. The hard part isn't calling Gemini, it's constraining it: getting suggestions that are grounded in the actual, specific list of what's on hand rather than a statistically likely kitchen.

What I built

A Next.js 16 App Router application (React 19, TypeScript) where the core work is in the prompt and data layer around Gemini — structuring the ingredient list, constraining generation so substitutions and staples are explicit rather than assumed, and validating that what comes back is actually cookable with what was submitted. TanStack Query manages the client-side request lifecycle; Firebase Auth handles accounts; Drizzle ORM over PostgreSQL stores users' fridge contents and recipe history.

Just as much of the effort went into where it runs. FridgeChef is deployed on infrastructure I built myself on Hetzner — Docker images built and pushed to GHCR, deployed through a CI/CD pipeline I wrote — rather than a managed platform. That means owning the parts a PaaS usually hides: image builds, container orchestration, secrets, and the deploy pipeline itself.

Outcome

FridgeChef is live and in active development. It's also the proving ground for the self-hosted platform underneath it — the same infrastructure now runs more than one of my projects.