← dani vilanova / projects / sous ai
local · not deployed

SOUS/AI

A recipe manager built around the fact that you cook the same recipe more than once and change it every time. Versions, variants and diffs, like code.

recipes
130
versions
224
variants
26
cooks logged
16
§01

why

motivation

Cooking from batch-cooking books, I kept hitting recipes with ingredients missing from the list. Cooking several meals at once, working out the order of the steps was its own job. And I had no library: the recipes lived in a dozen places.

So: everything in one place, and AI to manage it. Feed the books into the system and get back technical versions with temperatures and times adapted to my kitchen.

§02

versions, not edits

the idea

Most recipe apps let you edit a recipe, which throws away what it used to say. Here a recipe is just an identity, and underneath it there is a tree.

Every version is an immutable snapshot pointing at its parent, and a parent can sit on a different branch, which is how a variant forks off a specific version instead of replacing it. «My focaccia» and «my focaccia in a cooler oven» coexist.

Diffs are never stored. They are computed by comparing two snapshots, matching ingredients by normalised name and steps by a stable id, and they even re-derive the baker's percentages so you can see the hydration change alongside the flour.

§03

stack

verified
frontend
Next.js 16 · React 19 · Tailwind 4
database
Postgres 17 with pgvector · Drizzle · 36 tables
ai
Gemini through the Vercel AI SDK, model configurable per user
import
Photo of a page, an ebook or a URL, into a typed recipe
assistant
26 tools, and a gate that asks before anything writes
search
Real pgvector cosine similarity, not an embeddings table sitting unused
§04

what it looks like

running locally
sous / library
The library. 130 recipes, filterable by category, state and tag. Variants sit next to the recipe they forked from rather than replacing it.
The library. 130 recipes, filterable by category, state and tag. Variants sit next to the recipe they forked from rather than replacing it.
sous / versions and diff
The tree, and what changed. Fifteen versions across five branches of one toast recipe. Mark any two as A and B and the diff appears beside them: here a step rewritten with real times and oven temperatures.
The tree, and what changed. Fifteen versions across five branches of one toast recipe. Mark any two as A and B and the diff appears beside them: here a step rewritten with real times and oven temperatures.
sous / weekly plan
The plan. Twelve batch-cooking menus by season. Each one covers lunch and dinner Monday to Friday from two cooking sessions.
The plan. Twelve batch-cooking menus by season. Each one covers lunch and dinner Monday to Friday from two cooking sessions.
sous / shopping
The list, built from the plan. Sorted in the order you actually walk the supermarket. Repeated ingredients are added up rather than listed twice, so the onion from three dishes is one line.
The list, built from the plan. Sorted in the order you actually walk the supermarket. Repeated ingredients are added up rather than listed twice, so the onion from three dishes is one line.
§06

links

what is public
§05

where it is now

local

It runs on my machine against a local database with 130 recipes, 224 versions and 26 variants in it. Never deployed, and the pantry screen has no data in it yet.

The most ambitious thing here, and the one nobody can click.