← All Lab projects

Mise

An app on our kitchen tablet that tracks what food we have, suggests what to cook with it, and builds the shopping list from what's missing.

Status
In use on our kitchen tablet
Language
Dutch interface
Year
2026
Mise walkthrough on a tablet: today's suggestions, the pantry, a recipe, the meal plan and the shopping list being rebuilt. Interface in Dutch.

The problem

We waste food we forgot we had, and buy things we already own. Recipes live on paper cards, in browser tabs and in our heads. The shopping list is rebuilt from scratch every week.

I wanted the kitchen to have one source of truth: what’s in the house, what we’re cooking, and what’s missing. It also had to be easy enough that both of us would use it on the fridge tablet, and not quietly abandon it after a week.

What it does

  • Pantry that tracks amounts

    Stock in grams and millilitres with expiry dates and low-stock alerts. "2 onions" and "300 g onion" are recognised as the same thing.

  • Recipes in three ways

    Photograph a paper recipe card (the text is read in the browser), paste a link to almost any recipe site, or type it in. Every import lands in an editable review form first.

  • Hands-free cook mode

    One step at a time, a mise-en-place checklist, and timers taken from the step text. Finishing a recipe takes the ingredients out of the pantry.

  • A shopping list that writes itself

    The meal plan minus what's already at home, rounded up to quantities a shop sells and grouped by supermarket aisle. Anything that runs out is added automatically.

  • Receipts and barcodes

    Import a supermarket's digital receipt or scan a product barcode to restock the pantry, using the open Open Food Facts database.

Try it

Runs entirely in your browser with made-up data. Nothing is sent anywhere.

Recipe card to shopping list

Paste the text of a recipe card. This sample is in Dutch and includes one OCR-style typo. Mise's real parser splits it into ingredients and steps, pulls out timers, and builds a shopping list against a small demo pantry.

Parsed recipe

Kip met citroen en krieltjesServings: 235 min

Ingredients

  • 300 g Kipfilet
  • 500 g Aardappel
  • 1 Citroen
  • 2 clove Knoflook
  • 1 Rode ui
  • 150 g Prinsessenbonen
  • 2 tbsp Olijfoliestaple
  • Zwarte peperstaple

Spelling repaired: “sperzicbonen” → “sperziebonen”

Steps

  1. Verwarm de oven voor op 200 graden. Halveer de krieltjes en bak ze 25 minuten in de oven.⏱ 25 min timer
  2. Snijd de ui in halve ringen en hak de knoflook fijn.
  3. Bak de kipfilet 6-8 minuten in de olijfolie met de ui en knoflook.⏱ 8 min timer
  4. Kook de sperziebonen 5 minuten. Serveer alles met citroen.⏱ 5 min timer

Demo pantry

  • Aardappelen: 750 g
  • Knoflook: 6 clove
  • Rode ui: 1
  • Kipfilet: 250 g
people

Shopping list

needhavebuy
Aardappel1 kg750 g250 g
Citroen202
Prinsessenbonen300 g0 g300 g
Rode ui211
Kipfilet600 g250 g350 g

Screens

All screenshots use made-up demo data.

Today screen suggesting dinners ranked by how much of each recipe is already in the pantry, and items to use up first.
What can we cook?
Recipe detail with servings, which ingredients are in the house and which are missing, and a button to start cooking.
Recipe against the pantry
Shopping list built from the meal plan minus the pantry, grouped by aisle, each item showing which recipe needs it.
Shopping list that writes itself
Pantry with quantities, storage location and days until expiry.
Pantry
Meal plan for the coming days with cook buttons and missing ingredients.
Meal plan
Recipe library sorted by best match with what is in the pantry.
Recipe library

Architecture

Architecture diagram: a tablet runs the web app, which does OCR, PDF reading and barcode scanning on the device. It talks to an Express API with SQLite. Shared parsing and matching logic connects pantry, recipes, meal plan and shopping list. The server fetches recipe pages for their structured data and looks up barcodes in Open Food Facts, caching the results.Architecture diagram: a tablet runs the web app, which does OCR, PDF reading and barcode scanning on the device. It talks to an Express API with SQLite. Shared parsing and matching logic connects pantry, recipes, meal plan and shopping list. The server fetches recipe pages for their structured data and looks up barcodes in Open Food Facts, caching the results.

In words

Heavy work happens on the tablet itself. Photos of recipe cards are read with in-browser OCR, receipts are read from their PDF text, and barcodes are decoded by the camera code.

One shared library parses ingredient lines, converts units and matches everything against the food dictionary. The same code runs in the browser and on the server.

The server keeps the pantry, recipes and meal plan in SQLite. For links it reads the structured recipe data that most sites publish. Barcode lookups are cached, so a product scanned once also works offline.

How I built it

I set the constraints up front. It had to work for two people on a tablet mounted on the fridge, understand Dutch and French product names, and run with no paid APIs.

I designed the product and the data model. The core is a single food dictionary, so the pantry, recipes and receipts all describe the same ingredient the same way. The code was written with Claude Code. I reviewed it, and it is covered by automated tests.

Real use drove the backlog. The first version of card scanning misread too much, so I asked for better image clean-up and automatic spelling repair against the food dictionary. Every correction is shown for review, so nothing changes silently.

Tech stack

Frontend
  • React 19
  • TypeScript
  • Vite
  • PWA
On-device processing
  • Tesseract.js (OCR)
  • pdf.js
  • zxing-wasm (barcodes)
Backend
  • Node.js
  • Express 5
  • SQLite
  • Zod
Data
  • schema.org recipe data
  • Open Food Facts
Quality & hosting
  • Vitest
  • Docker
  • Tailscale