
How ingredients are parsed and grouped
Categorization, quantity merging, pluralization, and why your shopping list keeps cups separate from grams.
Most recipe apps treat ingredients as strings of text. We treat them as structured data — quantity, unit, name, modifier — so we can scale, convert, group, and aggregate. That structure is what makes scaling work, what makes the grocery list combine recipes cleanly, and what occasionally produces a mildly opinionated result you didn't expect.
Categorization (the "aisle" tag)
Every ingredient gets tagged with a grocery-store aisle — Produce, Dairy, Pantry, Meat & Seafood, Frozen, Bakery, International, Beverages, etc. The grocery list groups by aisle so you walk the store once instead of zig-zagging.
Behind the scenes, there's a curated dictionary of ~5000 ingredients with a categorizer that prefers the head noun (the rightmost word in English compounds). "Corn oil" → Pantry (it's an oil), not Produce. "Biryani masala powder" → International Foods (matches biryani masala), not Health & Beauty (powder alone).
Quantity merging across recipes
When you add multiple recipes to your meal plan, the grocery list merges quantities of the same ingredient. Three recipes calling for 1 cup of flour become 3 cups of flour on the list — singular, with the count combined.
Merging matches on a cleaned, singularized ingredient name. chopped onion and 1 onion, diced merge as onion. cherry tomatoes and cherry tomato merge. chicken stock and chicken broth don't merge (they're different products).
Pluralization (cooking-domain, not English)
Off-the-shelf libraries pluralize "flour" to "flours" and "broccoli" to "broccolis". Commercially that's correct (a shelf of flours); in a recipe it's wrong. We hand-rolled a cooking-domain pluralizer:
- Mass nouns never inflect — flour, sugar, salt, butter, oil, rice, pasta.
- Plurale tantum never singularize — chives, scissors, glasses (the eyewear/serving kind).
- Counts pluralize normally —
1 onion/2 onions,1 stalk/3 stalks.
Volume vs weight: why the shopping list keeps them separate
If you have two recipes — one calling for 1 cup of butter and another for 200 g of butter — the shopping list shows them as separate entries rather than collapsing them into a single number.
Why? Density-based conversion is good enough to display a recipe's ingredient in your preferred unit, but it isn't precise enough to aggregate across recipes for shopping. The error compounds — sum of approximations is itself approximate, and a kitchen-scale-buying decision wants a real number.
Every other grocery-list app we looked at — Mealie, Tandoor, Paprika, Plan to Eat — drew the same line. Cross-axis stays as separate entries.
On the Aisle tab of the grocery list, ingredients with split entries get an orange sparkle so you know they didn't simply combine. Tap the sparkle to see the breakdown.
Density tables (King Arthur first, USDA fallback)
When we do convert volume to weight for a single recipe (because your weighing preference asks for it), we use a curated density table seeded from King Arthur's flour weights and Stella Parks's sugar measurements. USDA is the fallback when our table doesn't have an entry.
USDA is a fallback rather than the primary because some entries are misleading — "cocoa powder" maps to a sweetened hot-chocolate mix, not pure cocoa. The curated table always wins when both have an entry.
Cookware
Cookware references in the recipe (#large pot, #9-inch baking dish) get pulled out and listed at the top so you can pre-stage what you'll need. They don't appear in the grocery list. Doubling a recipe doesn't double the pan count.
Related guides
How recipes.im handles cups vs grams, US vs Australian tablespoons, and when we weigh solids vs measure them by volume.
How recipes.im handles serving size scaling — and why some ingredients are intentionally fixed, marked with an orange sparkle.
How recipes.im households work — invite codes, shared libraries, and the per-household preferences that drive units, scaling, and grocery aggregation.