@beerwright/core
    Preparing search index...

    Yeast and starters

    This is the guide for a pitch-rate calculator or a starter planner: is the yeast I have enough for this beer, and if it isn't, what starter makes up the difference?

    • pitchPlan answers "is this pitch enough?" from the yeast rows, the volume and the gravity. It ages each pack from its manufacture date, counts the viable cells, and says how short or over the pitch is and how many packs would cover it.
    • planStarter answers "what starter gets me there?" from the cells you need and the cells you have. It returns one step if one is enough, two if not, and refuses to plan three.

    Two liquid packs of a lager strain, made on August 1st and pitched on October 1st into 20 L of 1.048 wort:

    const pitch = pitchPlan({
    yeasts: [
    {
    name: 'Wyeast 2124 Bohemian Lager',
    type: 'lager',
    form: 'liquid',
    attenuationMinPercent: 73,
    attenuationMaxPercent: 77,
    packs: 2,
    manufactureDate: new Date('2026-08-01'),
    },
    ],
    volumeL: 20,
    og: 1.048,
    pitchDate: new Date('2026-10-01'),
    });

    The batch needs 357 billion cells, which is the lager rate of 1.5 million cells per mL per °P. Two months on the shelf has left the packs at 62 % viability, so they hold 124 billion between them. The pitch is 234 billion short, and packsRequired says six packs of this age would cover it. That works, and so does a starter:

    const starter = planStarter(pitch.cellsNeededBillion, pitch.cellsFromPacksBillion);
    const steps = starter.steps.map((step) => ({
    litres: step.volumeL,
    dmeGrams: step.dmeGrams,
    cellsAfter: step.finalCellsBillion,
    }));

    One step is enough: 1.75 L on a stir plate with 175 g of dry malt extract, growing the 124 billion to 369 billion.

    pitch.notes lists the assumptions as sentences. Here there are two: the pitch rate defaulted to 1.5 for a lager, and each liquid pack was assumed to hold 100 billion cells when it was made. pitchPlanExplained and starterPlanExplained return the same working as an Explanation, citing White and Zainasheff's Yeast and Mr Malty for the rates and viability, and Kai Troester's measurements for starter growth.

    • pitchDate defaults to today. Pass it, or the same recipe gives a different answer tomorrow, and your tests fail next month.
    • A dry yeast starter is ignored. Dry yeast is packed with the sterols it needs, and a starter uses them up, so pitchPlan ignores a starter on a dry row and adds a note saying why. Count sachets with dryYeastSachets instead.
    • Cells are in billions. cellsNeededBillion: 357 is 357 billion cells, and every count in this area uses the same unit.
    • The volume is the wort into the fermenter. Pass what goes in the fermenter, which may differ from the batch size on the recipe.
    • Starter growth is an estimate. The growth model is Kai Troester's (Braukaiser's), and he puts it at ±15 % or worse. A planned starter can still come up a little short.

    There's no method page for yeast yet. The comments on pitchPlan, packViability and starterGrowth explain the models and where their numbers come from. In the reference, the Yeast category has the viability curves, the pitch-rate table DEFAULT_PITCH_RATES, and the dry-yeast dosage bands.