Working with sources
The Kitchen Notebook Stays on the Device
Cost a dish in this browser with no account and no server call, then export the notebook to a file you own. What it keeps, what it refuses, and where it stops.
- Published
- Checked against the release
- Read
- 9 min
- By
- Novus Stream Solutions
A public market price tells you what a published series was a price for. It does not tell you what your dish costs. That number needs your prices, your quantities and your trim loss, and most of the time it is needed standing at a pass with no laptop, no login and sometimes no signal. The Kitchen Notebook exists for that moment. It is a small costing workspace that lives in the browser you open it in, uses the same costing rules as the signed-in product, and hands you a file whenever you want a copy that does not depend on this site at all.
This article describes what the notebook actually does as released, because a costing tool is only useful if you know exactly where its numbers come from and exactly where it will refuse to give you one.
- Account needed for the costing loop
- None
- The page makes no server call after it loads.
- Notebook format version
- 1
- A file written by a newer version is refused, not half read.
- Named reasons a load is refused
- 4
- Not JSON, wrong format, future version, malformed.
- Named costing gaps
- 7
- Each one replaces a number that would otherwise be a guess.
Checked Sep 22, 2026 against the notebook's shipped source, src/lib/notebook/local-store.ts, notebook-workbench.tsx and src/lib/menu/costing.ts. These describe the release on that day, and a later release can change them. Take your own reading
What the notebook keeps
The stored notebook is deliberately small. It holds two lists: what you pay for things, and dishes built from them. An ingredient entry is a name, a price, the unit you buy it in and the moment you recorded it. A dish is a name, how many portions it makes, an optional menu price and the ingredient it uses, with a quantity, a unit and an optional yield. That is the whole shape. There is no copy of the signed-in workspace, no supplier list and no purchase history.
That narrowness is a design choice rather than a missing feature. Mirroring the whole product into the browser would mean two implementations of every rule, and the second one drifts. So the notebook stores only what costing needs and hands it to the same costing functions the signed-in menu costing page uses. A cost per portion shown in the notebook is the figure the server would compute from the same inputs, because it is computed by the same code.
- One price per ingredient. Recording a price for an ingredient that already has one replaces it. Two prices for one item would make the cost depend on which the engine met first, and the last thing you typed is what you meant.
- One ingredient line per dish. The notebook answers whether a dish stands up. A recipe with many components is what the account product is for, and the page says so rather than rebuilding the full recipe editor in a place that has to work offline.
- A menu price is optional. Without one the notebook shows the cost and says plainly that no margin is shown. With one it shows the contribution and names the cost basis it was worked out from.
Where it lives, and what that means
The notebook is kept in this browser on this device. The page says so in its first line, in those words, because the failure this feature could most easily cause is a chef who believes their costings are safe because they can see them. Another browser does not have it. Another computer does not have it. Clearing site data removes it. A private window, or a browser set to block storage, cannot keep it at all, and in that case the page says the notebook lasts only until you leave and asks you to export it before you go.
That is the privacy benefit and the durability cost in the same sentence. Nothing you type is sent anywhere. The page is delivered, and after that it makes no request to the server: there is no sign in, no save call and no session. The same fact means nothing is kept for you. If the notebook has to survive a new laptop or a browser reset, the file is how it survives.
Keep a copy you own
The portability section of the page has two controls. Export this notebook writes the whole thing to a file called kitchen-notebook.json. It is readable JSON: a format name, a version number and the two lists. You can open it in any text editor, keep it in a folder with your supplier invoices, or email it to yourself. Load one reads such a file back and replaces what was in this browser, and the page says in so many words that it has replaced it.
Replacement is the honest behaviour for a small workspace. Merging two notebooks silently would raise questions the page cannot answer, such as which of two prices for the same ingredient is right. If you want to keep what is in the browser, export it first, then load the other file.
What a refused file looks like
Reading a notebook is strict, and every refusal names itself. The alternative, returning an empty notebook when a file cannot be read, looks identical to a notebook that really is empty, and somebody would conclude their work was gone when it was only unreadable by this build. So there are four named refusals, and each leaves the current notebook exactly as it was.
- The file is not readable as JSON, so nothing was loaded.
- The file is JSON but is not a Kitchen Notebook, which is what a signed-in workspace backup produces.
- The file was written by a newer version of the site. It is refused whole, because a half-read notebook leaves dishes pointing at ingredients that did not come back.
- The file claims to be a notebook but is missing the ingredient and recipe lists a notebook has to carry.
The same rule applies to what is already stored. If this browser holds a notebook that the current build cannot read, the page shows the problem and does not overwrite it. Replacing it with an empty notebook would destroy whatever a newer build wrote.
What it refuses to pretend
Most costing mistakes are not arithmetic errors. They are a missing input quietly treated as nought. A price nobody recorded costs nothing, a trim loss nobody measured costs nothing, and the dish looks cheaper than it is. The notebook uses the product's costing engine, and that engine names each of those cases instead of filling them in.
- No price on record. The ingredient's cost is missing from the total rather than counted as nought. Remove an ingredient that a dish uses and the page tells you that dish now reports a missing price.
- A unit mismatch. If the dish measures an ingredient in a different unit from the one it is bought in, the cost is not converted. Nothing in the notebook converts between units, and it says so when you record a price with no unit.
- No yield measured. Leave the yield blank and the cost assumes all of the ingredient survives trimming. The page says the real cost is higher, rather than letting the optimistic figure stand unexplained.
- No portions. A dish must say how many portions it makes. Nought portions is a division by nothing, so the notebook refuses to store a dish that could never produce a figure.
Where a cost cannot be worked out honestly, the page says not known. That phrase appears on screen more often than people expect the first time they use the notebook, and it is the point of it. A cost you can defend is worth more than a cost that fills the box.
Where public market prices fit
The rest of this site publishes market prices from official providers. Those series are context, not invoices. A wholesale observation for a region and a pack size is a price for that item on that market, and the methodology page explains what each one covers. When you cost a dish in the notebook, the price you enter should be the one on your supplier invoice. When you only have a public series, the notebook will cost from whatever number you type, but it is on you to remember that it was context rather than a quote.
The two numbers are allowed to differ, and when they do the difference is information. A supplier price well above the published market is a conversation to have. A dish that only works at the market price is a dish that does not work yet.
When to move to the signed-in product
The notebook is the right tool for a quick answer on one device. It is the wrong tool once more than one person needs the same numbers, once a dish has several components or preparations inside it, or once prices should come from imported supplier files rather than typing. Those are what the account product is for, and what the calculators assume describes the rules both share. The notebook does not upload itself into an account, and nothing on the page suggests that it will.
Try it in five minutes
- Open the Kitchen Notebook and record one ingredient with the price and unit on your last invoice.
- Record a dish that uses it, with the number of portions and a menu price, and read the cost per portion and the contribution.
- Record the same dish again with the yield left blank, and read the note about trimming.
- Export the notebook, clear this site's data in your browser settings, and load the file back. Confirm the dish returns with the same cost.
- Try loading any other JSON file and read the refusal. Your notebook is still there afterwards.
If each of those steps behaves as described here, you know where your numbers live and what would lose them. If one does not, the reproduction steps at the foot of this page name the files to check.
Reproducing these figures
Every number above was checked against the release on September 22, 2026. A later release can change them, which is why they carry that date.
- Open /notebook, record one ingredient price and one dish that uses it, and confirm a cost per portion appears without signing in.
- Use Export this notebook and open the downloaded kitchen-notebook.json in a text editor: it holds a format name, a version, an ingredients list and a recipes list.
- Load a file that is not a notebook, such as any other JSON file, and confirm the page names the refusal and leaves the current notebook alone.
- Record a dish measured in a different unit from its ingredient price and confirm the cost reports a unit mismatch rather than a number.
- Read src/lib/notebook/local-store.ts for the format, version and refusal rules, and src/lib/menu/costing.ts for the named costing gaps.
Sources
Read next
Working with sources
Budget Scenarios: Ask What If Without Rewriting the Budget
A scenario is a second plan for the same month, read against the same actuals. It copies the budget lines and leaves the agreed plan untouched, even locked.
- Published
- Checked against the release
- Read
- 8 min
Working with sources
The invoice lines an importer quietly drops
A comma in a price is the most expensive punctuation in a supplier export. Why the rows it dropped were never a random sample of your invoice.
- Published
- Figures measured
- Read
- 3 min