Why your shopping list has garlic on it three times

A shopping list shows the same ingredient several times because the app is merging on the words rather than on the ingredient. "2 cloves garlic", "1 tbsp minced garlic" and "garlic, to taste" are one bulb of garlic and three different strings, and matching text cannot tell that garlic and garlic powder are not the same shop.

Take three recipes. One wants 2 cloves garlic. One wants 1 tbsp garlic, minced. One wants garlic, to taste.

How many lines should the shopping list have?

One. Obviously one. It is one bulb of garlic and every person alive knows it. But almost every recipe app on the store will give you three, and this small, stupid failure is the reason people quietly stop using them. Not the missing features. This.

Why does the same ingredient appear twice on a grocery list?

Because the app is matching strings, and you are thinking about shopping.

To a person, "2 cloves garlic" and "1 tbsp minced garlic" are the same trip to the same shelf. To software comparing text, they share four characters and differ in every other respect. So it does the safe thing, which is to print both, and the safe thing is the wrong thing.

The tempting fix — match on any shared word — is worse than the bug. Do that and garlic merges with garlic powder, which is a different aisle and a different purchase. You have replaced a list that is annoying with a list that is wrong, and a list that is wrong gets abandoned in the car park.

The four questions that have to be answered first

Merging those three lines means answering four questions in order. Get any one of them wrong and the result is visibly foolish.

What is this ingredient, really? "Garlic", "garlic cloves", "fresh garlic" and "minced garlic" are one shopping item. "Garlic powder" is not. Neither is "garlic bread". Neither, less obviously, is "wild garlic", which is a leaf sold in a different part of the shop for most of the year.

What kind of unit is this? Cloves are a count. Tablespoons are a volume. Grams are a mass. You cannot add a count to a volume without knowing something about the specific ingredient — a clove of garlic is roughly a teaspoon minced, and a clove of anything else is a meaningless phrase.

Which conversions are actually safe? Three teaspoons is exactly one tablespoon, always, for everything, because both are volumes. But 100 g of flour is not 100 ml of flour, and an app that quietly pretends otherwise sends you home with half of what you needed. Mass and volume only convert through density, and density is per-ingredient.

And what do you write when you cannot merge? "To taste" has no quantity at all. Dropping the line loses the ingredient. Inventing a number is a lie you will discover mid-recipe. The honest answer is to keep the line and leave the quantity empty, which looks less clever and is far more useful.

What we actually do about it

Every ingredient is normalised against a dictionary before anything else happens. Not fuzzy-matched at merge time — normalised on the way in, once, so that by the time two recipes meet in a shopping list they are already speaking the same language.

That dictionary currently holds 412 canonical ingredients and 1,370 written aliases: every reasonable way a person might write the same thing, mapped back to one. It is unglamorous, hand-checked work, and it is the whole difference between a list with garlic on it three times and a list with garlic on it once.

It is also why "fresh basil" lands in produce and "dried basil" lands in spices. They are different products on different shelves, and an app that files them together makes you walk the shop twice.

Merging then happens on the pair (canonical ingredient, unit dimension).

You wroteCanonicalDimensionResult
2 cloves garlicgarliccountmerged
1 tbsp garlic, mincedgarlicvolume → countmerged, converted
garlic, to tastegarlicnonemerged, no quantity added
1 tsp garlic powdergarlic powdervolumeseparate line, spice aisle

Masses merge with masses. Volumes merge with volumes. Counts merge with counts. When a count and a mass meet and the dictionary knows the conversion for that specific ingredient, we convert. When it doesn't, we keep both lines rather than guess. Two honest lines beat one confident wrong one.

Three details that took more work than they sound like:

teaspoon and a tablespoon independently and three teaspoons stops equalling one tablespoon, and your list starts showing "14.79 ml". Every volume in the system is derived from the teaspoon so the arithmetic stays closed.

is 1⅓. A shopping list is not a database report and should not read like one.

guess, not an average, not a rounded-up "1".

Why the aisle order matters more than it sounds

A merged list is still a bad list if it is in the wrong order. Walking back across the shop for the coriander you passed four minutes ago is the same irritation as buying garlic twice, and it comes from the same root cause: the app knows the words and not the shop.

So every canonical ingredient carries an aisle, and the list is sorted the way you actually walk: produce, dairy, meat and fish, pantry, spices, frozen, bakery, everything else.

Aisles are also the one place where being wrong is guaranteed. Shops differ, countries differ, and somebody's local supermarket keeps the tortillas somewhere no algorithm would predict. So when you move an item to a different aisle, we remember it for that ingredient, permanently, for you. You fix it once and it stays fixed. This is the single most complained-about thing in reviews of the apps that already exist, and fixing it properly is cheap.

The ticks have to survive

Change your meal plan on Tuesday and the list has to change with it. But the six things already in your trolley must stay ticked.

That sounds too obvious to state. It is also one of the most common complaints in reviews of existing apps, because an app that rebuilds the list from scratch wipes your ticks, and now you are walking the shop again with a list that has forgotten what you are holding.

We reconcile rather than replace. The new list is merged against the old one, and anything you ticked stays ticked — including items that are no longer strictly required by the plan, because you have already bought them and pretending otherwise helps nobody.

The list is not a feature. It is the reason you trust the plan.

Why we care quite this much

Every competitor already has recipe saving. Several have meal planning of a sort. The two things that are consistently, publicly, verifiably bad across the whole category are the automatic plan and the shopping list — and you can read that in the reviews of any of them.

So those are the two things we decided to be genuinely good at. Everything else in FasterChef is table stakes: necessary, unremarkable, and not a reason to switch. These two are.

If you want the other half of the story — why the week ought to plan itself instead of handing you an empty calendar — that's the meal planner problem nobody names. And if you're wondering where all these recipes come from in the first place, start with how to save a recipe from an Instagram reel.

FasterChef turns your saved reels into dinner.

Join the waitlist