Open source · MIT

Sprig

A weekly meal plan that turns itself into a shopping list: merges ingredients, converts units and works in the shop with no signal.

v1.0.0 A weekly plan that becomes a shopping list
React 19TypeScriptVitePWAnode:sqliteApple HIG
Sprig

The list is the point, the plan is how you get it

Recipe apps show you someone else's food and want a subscription. Notes and messenger lists do not know that «500 g of chicken» on Tuesday and «400 g of chicken» on Thursday are one pack of 900 g.

Sprig keeps what is yours. Drag dishes onto the days, set how many are eating, and the shopping list builds itself: identical items are added up, grams become kilograms, rows are grouped by supermarket aisle. In the shop it works with no signal and catches up with the server once the network is back.

What is inside

A week as a feed of days

A day is a section holding lunch and dinner with dish cards. One column works the same at the kitchen table and on a phone: nothing is reinvented for the small screen.

Drag written by hand

A hook on Pointer Events instead of a library: it works with a mouse and with a finger, because HTML5 drag-and-drop simply does not exist on phones. You drag by the grip, and its touch-action: none keeps the page from scrolling under your thumb.

The list is derived, never stored

A pure function of the plan, so «what we cook» and «what to buy» cannot drift apart. Incompatible units stay honest: «20 pcs + 800 g» instead of a made-up single number.

Undo instead of dialogs

The week is a document in a reducer and past states live in a stack, so undo and redo come for free. Ticking things off in the shop stays out of the history: buying is not an edit.

Works offline

Installable as an app: the shell is cached by a service worker, changes wait in a queue in localStorage and go out when the network returns. Nothing is ever blocked.

Two dependencies

React and React DOM, nothing else at runtime. A 30-line router of its own, hand-written CSS, a server on Node 24 and node:sqlite with no build step. 21 tests on the pure logic.

Screenshots

The week: days top to bottom, dishes dragged between them
The week: days top to bottom, dishes dragged between them
The shopping list: merged, converted and sorted by aisle
The shopping list: merged, converted and sorted by aisle
Picking a dish, searching by name or by ingredient
Picking a dish, searching by name or by ingredient
Recipes: what this household actually cooks
Recipes: what this household actually cooks
The week in the dark theme
The week in the dark theme
The list in the dark theme
The list in the dark theme

Installation

git clone https://github.com/dripips/sprig.git cd sprig docker compose up -d

Have a project or idea?

Write to me and we will talk the task through.