How to Scale Recipes Without Mistakes

Doubling a recipe should be simple math. So why does doubling chocolate chip cookies always turn out wrong?

You've been there. The original batch was perfect. You multiplied everything by two, followed the same steps, baked for the same time — and something was off. The texture wasn't right. The flavor was unbalanced. You ate them anyway and told yourself they were fine.

The problem isn't your math. Scaling recipes fails for reasons most cooks don't think about until they've already made the mistake.

Why Scaling Goes Wrong

The most common failure is seasoning. Salt, spice, and acid don't scale linearly. A dish that calls for 1 tsp of salt for 2 servings doesn't need 4 tsp at 8 servings. It needs maybe 2.5 or 3. Flavor compounds accumulate and interact differently at volume. Professional cooks scale seasoning by taste, not by ratio — and they adjust at the end, not the beginning.

Baking is worse. Leavening agents — baking soda, baking powder, yeast — operate through chemical reactions with specific ratios of reactant to substrate. Scale them linearly and you get too much CO2, which can make baked goods taste metallic or collapse. Some bakers use the rule that leavening scales at roughly 75% of the linear rate. That's not intuitive if you're just multiplying.

Then there's cookware. Doubling a recipe doesn't double your pan size. A recipe designed for a 10-inch skillet won't work in the same skillet with double the ingredients — the heat distribution changes, the steam can't escape properly, and you end up braising when you meant to sear. Surface-area-to-volume ratios matter.

Units cause their own problems. You're scaling a recipe that uses "1/3 cup" and you need 5x. That's 1 and 2/3 cups. Is that 1 cup and 10 tablespoons and 2 teaspoons? Most people don't have that memorized, and mental conversion errors add up across a recipe with 12 ingredients.

The Manual Approach

Most people scale recipes by opening a calculator app, typing each quantity, and writing the result on a sticky note or in the margin of a printed recipe. This works. It's also slow, error-prone, and requires you to redo the work every time.

The steps look like this: find the scale factor, multiply each quantity, convert to sensible units (1.33 cups → 1 cup + 5 tbsp + 1 tsp), remember which ingredients you've already done, hope you didn't miss one.

If you're scaling across multiple recipes for a meal — say, a main dish for 8, a salad for 6, and bread for 4 — you're doing this process three times, then combining the shopping lists by hand. That's where mistakes compound.

There's a better way.

How Cooklang Handles Scaling

Cooklang is a plain-text recipe format where ingredients are machine-readable. That structure is what makes scaling reliable.

A recipe file declares how many servings it makes in the frontmatter:

---
servings: 2
---

Every ingredient uses structured syntax: the @ sigil, the ingredient name, and a quantity with unit in curly braces:

@pasta{200%g}
@olive oil{2%tbsp}
@garlic{2%cloves}
@cherry tomatoes{300%g}
@parmesan{40%g}
@salt{1%tsp}

To scale this recipe to 8 servings using CookCLI, you pass a scale factor with the colon syntax:

cook recipe "Pasta.cook:4"

That :4 means "scale by 4x" — which takes a 2-serving recipe to 8 servings. CookCLI multiplies every ingredient quantity by 4 and outputs the scaled recipe.

You can also use the flag form:

cook recipe --scale 4 Pasta.cook

Both produce the same result.

Before and After: A Real Example

Here's a simple pasta recipe at 2 servings, written in Cooklang:

---
servings: 2
---

Bring a large pot of water to a boil. Cook @pasta{200%g} until al dente, about ~{10%minutes}. Reserve 1/2 cup pasta water before draining.

While the pasta cooks, heat @olive oil{2%tbsp} in a #large skillet over medium heat. Add @garlic{2%cloves}, minced, and cook for ~{1%minute} until fragrant.

Add @cherry tomatoes{300%g}, halved. Cook for ~{8%minutes} until they burst and release their juice. Season with @salt{=1%tsp} and @black pepper{=1/4%tsp}.

Toss the drained pasta with the sauce. Finish with @parmesan{40%g}, grated.

Scale this to 8 servings with cook recipe "Pasta.cook:4" and the ingredients become:

pasta              800 g
olive oil          8 tbsp
garlic             8 cloves
cherry tomatoes    1200 g
salt               1 tsp     ← fixed, does not scale
black pepper       1/4 tsp   ← fixed, does not scale
parmesan           160 g

Notice that salt and black pepper didn't change. That's intentional, and it's the most important feature.

The Fixed Ingredient Pattern

Some ingredients should not scale with serving count. Cooklang handles this with the = prefix inside the quantity braces:

@salt{=1%tsp}
@vanilla extract{=1%tsp}

The = tells the scaling engine: this quantity is fixed. Don't touch it regardless of the scale factor.

This matters in practice. Salt is added to taste and adjusted at the end — you don't actually need 4x salt for 4x pasta. Bay leaves are a classic example: one bay leaf works for 2 servings or 20. Vanilla extract in baked goods hits diminishing returns fast; using 4 tsp where 1 tsp is called for can make the result taste medicinal.

In the pasta recipe, marking salt as fixed means someone cooking the 8-serving version starts with 1 tsp and seasons from there. That's the right behavior.

Cookware doesn't scale either — the recipe still refers to a large skillet regardless of how many servings you're making. Cooklang leaves cookware alone during scaling because there's no sensible automatic adjustment. You have to make that call yourself.

Timers also don't scale. The pasta still takes 10 minutes to cook whether you're making 200g or 800g (though in practice you'd use a bigger pot). Cooking time is a physical property of the process, not the quantity.

Scaling Across Multiple Recipes

Where this gets genuinely useful is scaling several recipes at once for a combined shopping list.

Say you're cooking for a dinner party: pasta for 8, a green salad for 6, and garlic bread for 4. Instead of scaling each recipe manually and combining the lists by hand, you run one command:

cook shopping-list "Pasta.cook:4" "GreenSalad.cook:3" "GarlicBread.cook:2"

The numbers after the colon are the scale multipliers — the pasta recipe (2 servings) scales to 8, the salad (2 servings) scales to 6, the bread (2 servings) scales to 4. CookCLI scales each recipe, extracts ingredients, combines matching items, and outputs a unified list:

PRODUCE
    cherry tomatoes    1200 g
    garlic             10 cloves
    romaine lettuce    3 heads
    lemon              2

DAIRY
    parmesan           160 g
    butter             120 g

PANTRY
    pasta              800 g
    olive oil          10 tbsp
    dijon mustard      1 tbsp

BAKING
    baguette           2

That's three scaled recipes merged into one shopping list. The garlic from the pasta and the garlic bread are summed together automatically. Fixed ingredients remain at their declared quantities regardless of scale.

The web server UI also supports scaling interactively — you can adjust serving counts in the browser and see ingredient quantities update in real time, which is useful when you're mid-cook and want to check a scaled quantity without running a command.

Writing Scale-Friendly Recipes

If you're writing recipes in Cooklang and want them to scale cleanly, a few practices help.

Use precise quantities for everything. "Some garlic" is not scalable. "2 cloves" is. Even for things that get fixed later, start with a precise number so the parser has something to work with.

Mark fixed ingredients at the point of writing, not after. When you're writing a recipe and you know the salt is going to be adjusted to taste anyway, put the = on it immediately:

@salt{=1%tsp}

Don't wait until you're debugging weird scaled output to add it.

Test at 2x and 0.5x. If you're publishing a recipe, make it at double and half the declared servings before you share it. The doubling test catches linear scaling problems in baking. The halving test catches minimum thresholds — some techniques don't work with very small quantities.

Write serving notes for large batches. Some recipes work fundamentally differently at scale. A sauce that reduces perfectly in a 10-inch pan will take twice as long in a Dutch oven because the surface area ratio is different. Add a note in the recipe text:

-- Note: at 4x+ servings, use a wide Dutch oven and expect longer reduction time

That's something no automatic scaling tool can tell you. It has to come from the cook.

The Real Benefit

The point of structured recipe scaling isn't to replace judgment — it's to get the arithmetic out of the way so you can use your judgment where it actually matters.

You don't want to spend mental energy converting 1/3 cup to tablespoons while also watching a pan and talking to a guest. You want the numbers handled so you can focus on the cooking. That's what Cooklang's scaling does: it makes the mechanical parts mechanical, so the parts that require a cook's instinct get your full attention.

Seasoning is still your job. Pan size judgment is still your job. Scaling 200g of pasta to 800g is not your job anymore.

Try Cooklang →

-Alex