This is the guide for an IBU calculator, a hop schedule editor, or a hop inventory that wants to know how much alpha acid is left in an old bag.
calculateRecipe calls calculateIbu itself, so you only need it directly
when you're working on hops without the rest of the recipe.
Cascade that's been open in the fridge for a year, used in a whirlpool after a 60-minute Magnum charge:
// Cascade loses about half its alpha in six months at room temperature.
const cascadeAlpha = agedAlphaAcidPercent(6.5, {
alphaLostSixMonths: 0.5,
months: 12,
storageC: 4,
packaging: 'wrapped',
});
const hops: HopAddition[] = [
{
name: 'Magnum',
amountKg: 0.015,
alphaAcidPercent: 12,
form: 'pellet',
use: 'boil',
timeMinutes: 60,
},
{
name: 'Cascade',
amountKg: 0.05,
alphaAcidPercent: cascadeAlpha,
form: 'pellet',
use: 'whirlpool',
timeMinutes: 20,
whirlpoolTempC: 85,
},
];
const bitterness = calculateIbu({
hops,
volumeL: 21,
boilGravity: 1.05,
boilTimeMinutes: 60,
});
The 6.5 % on the label has dropped to 4.0 %. Cascade is a poor keeper, losing about half its alpha in six months at room temperature, and a fridge and a squeezed-shut bag slow that down without stopping it.
The schedule comes to 24.3 IBU. The Magnum gives 21.7 of it. The Cascade gives 2.5, because a 20-minute stand that starts at 85 °C and cools is worth only 2.5 minutes at a full boil.
Each entry in contributions carries its own IBU, its utilization, and the
boil minutes it was worth. A whirlpool addition also has a standDescription,
a sentence you can show as it is: "Cascade, 20 min from 85 °C cooling: worth
2.5 boil minutes, 2.5 IBU."
For the whole recipe, calculateRecipe's explain.ibu names the model
(tinseth-1997 by default), lists the volume and gravity it used, and cites
Tinseth, Malowicki's isomerization kinetics and the mIBU method the whirlpool
model comes from. The README prints that explanation in full.
amountKg: 0.015.timeMinutes means different things. For a boil addition it's the time
left in the boil. For a whirlpool it's the length of the stand. First-wort
hops get the whole boil whatever it says, and dry hops use dryHopDays.ibuVolumeBasis, bitternessGravityBasis), but numbers then stop matching
other calculators.hopFormMultipliers.iso-extract addition reads
isoAlphaPercent, not alphaAcidPercent. They measure different things, and
reading one as the other makes the beer about a fifth as bitter as intended.