This is the guide for the cellar side: blending finished beers (sours and barrel-aged beers, mostly), building a mead or cider must, and proofing and sweetening a spirit. These are smaller calculations than a recipe, and each one stands on its own.
How much of a 7.5 % sour and a 4.5 % sour make 20 L at 6.5 %:
// How much of a 7.5 % sour and a 4.5 % sour make 20 L at 6.5 %?
const square = pearsonSquare({ a: 7.5, b: 4.5, target: 6.5, totalVolumeL: 20 });
13.3 L of the stronger and 6.7 L of the weaker. If the target is outside the
two, or the two are the same, it returns null.
Three barrels of sour, blended and bottle conditioned to 2.8 volumes:
const sour = (
name: string,
volumeL: number,
og: number,
fg: number,
ph: number,
): BlendComponentInput => ({
name,
volumeL,
og,
fg,
ph,
srm: 5,
peakTempC: 22,
barrelAged: true,
naohMl: null,
});
const blend = evaluateBlend({
components: [
sour('Three-year barrel', 8, 1.062, 1.002, 3.3),
sour('Two-year barrel', 10, 1.058, 1.004, 3.4),
sour('One-year barrel', 6, 1.055, 1.008, 3.6),
],
targetVolumes: 2.8,
additions: [],
kegVolumeL: null,
});
The 24 L blend is 7.3 % ABV at pH 3.40 and FG 1.0043. The barrels have off-gassed, so the blend holds only 0.41 volumes of CO₂ from fermentation. The two sweeter barrels will ferment down to the driest one's 1.002 in the bottle, and that leftover extract is worth 1.19 volumes more. That makes 1.60 volumes before any sugar, so the priming dose is 110 g of table sugar for the last 1.2. Priming a blend from its temperature alone would overcarbonate it.
Honey for a traditional mead, 15 L of water up to 1.100:
// Honey to bring 15 L of water up to 1.100 for a traditional mead.
const honey = sugarToGravity({ currentSg: 1, targetSg: 1.1, volumeL: 15, sugar: 'honey' });
5.1 kg of honey. Leave room for it, because dissolving it adds about 0.7 L per kilogram and the calculation doesn't count that.
A liter of lemon-peel macerate at 60 %, down to 28 % with 250 g of sugar per liter:
// A litre of lemon-peel macerate at 60 %, down to 28 % with 250 g of sugar per litre.
const limoncello = proofAndSweeten({
volumeL: 1,
abvPercent: 60,
targetAbvPercent: 28,
targetSugarGL: 250,
sweetener: { kind: 'sugar' },
});
Add 0.54 kg of sugar and 0.81 L of water, for 2.14 L of finished limoncello. The strength fixes the final volume first, because water and sugar add no alcohol, and the sugar's own volume comes out of the water.
blendExplanations returns an Explanation for each figure a blend shows, citing Michael Tonsmeire's article on priming barrel-aged and blended sours and Curtis Crane's blending spreadsheet, which extends it. The others have twins: pearsonSquareExplained, sugarToGravityExplained, proofAndSweetenExplained, and nutrientScheduleExplained for the TOSNA nutrient schedule.
evaluateBlend wants every field, with null for unknown. A component
with no measured pH has ph: null, and the blend's pH is worked out from
the components that have one. A figure that none of them can supply comes
back null.packagedOn and dates on
the additions, and evaluateBlend counts that sugar toward the dose.sugarToGravity never lowers a gravity. A target below the current one
returns zero. To dilute, use dilutionToTargetGravity.proofAndSweeten returns null for an impossible target. Water can't
make a spirit stronger, and past some sweetness the sugar alone takes more
room than the target strength leaves.There's no method page for this area yet. The comments on evaluateBlend, sugarToGravity and proofAndSweeten have the formulas and their sources. In the reference, the Blending, mead and spirits category has the rest, including the nutrient schedule in nutrientSchedule and the acid-shock starter in acidShockStarter.