How the model works
Proportion is a beer fermentation model with a recipe builder on top. This page explains the brewing science behind each part, how Proportion implements it, and where the model is grounded in first principles versus fit to data. Every equation and interactive widget in this document mirrors the code, with the source file noted so you can check it.
Overview
Most brewing calculators predict each number from an empirical formula fitted to data. Proportion is built the other way around: a simulation of what actually happens to the wort, from the grain and water you start with through to the compounds your yeast leaves behind. The recipe builder is the interface to that simulation, not the thing itself. Change a mash temperature and the enzyme kinetics shift; the fermentability of the wort changes; the yeast produces a different spectrum of esters and fusel alcohols; the predicted aroma moves. Everything is connected through the underlying model.
The model covers five domains, which are also the tabs in the app:
- Recipe gathers the inputs: grain, hops, adjuncts, yeast, water, batch size, and the mash and fermentation schedules.
- Water chemistry predicts mash pH from your ion profile and grist, and handles salt and acid additions.
- Mash runs enzyme kinetics over your temperature schedule to work out fermentability and efficiency.
- Fermentation simulates yeast: sugar uptake, growth, and the biochemistry that makes flavour compounds.
- Forecast turns the predicted beer composition into an aroma profile and off-flavour warnings.
One simulation, many readouts
These are not five separate calculators. The whole recipe is run through a single process graph once, and every number you see in the app is read out of that one result. Water feeds the mash; the mash feeds the boil and sets fermentability; the boil and cooling set bitterness and hop chemistry; fermentation consumes the wort and emits the beer. The stages are wired in that order and computed together.
1.The recipe
The recipe is the set of inputs to the simulation. Everything downstream is derived from it. A recipe holds a grain bill, hop additions, sugar adjuncts and yeast nutrient, one or more yeast strains, a water profile with salt and acid additions, and two schedules: a mash temperature curve and a fermentation temperature and pressure curve. A number of further parameters are set by the user, such as batch size, boil length, kettle geometry, crush setting, and target carbonation.
Two numbers can be either measured or predicted. Efficiency (how much of the grain's potential extract ends up in the kettle) and attenuation (how far the yeast ferments the wort) each have an auto mode, where the mash and yeast models predict them, and a manual mode, where you pin the value from your own records. In auto mode they emerge from the mash and fermentation sections described later.
Where the numbers come from
Ingredients carry real, cited data rather than style categories. Each malt has an extract potential, colour, diastatic power, and a base sugar spectrum. Each hop variety carries alpha acid, cohumulone fraction, and the composition of its essential oil (myrcene, humulene, caryophyllene, farnesene, linalool, geraniol, and so on), plus thiol precursor and polyphenol content. Yeast strains carry attenuation parameters and a flavour fingerprint. These data are the raw material the models act on.
2.Water chemistry and treatment
Water does two jobs in brewing. Its mineral content shapes flavour and mouthfeel, and, more importantly for the chemistry downstream, it sets the pH of the mash. Mash pH is the master variable of the hot side: the starch-converting enzymes each have a pH optimum, extraction of tannins and colour depends on it, and it carries through to the finished beer's balance. Get it into the 5.2 to 5.5 range and everything else behaves; drift out of it and conversion, clarity, and flavour all suffer.
The difficulty is that mash pH is not a property of the water alone. It is where two things settle: the acidity of the malt, and the alkalinity of the water pushing back against it. Dark and crystal malts are acidic; base malt is mildly so; bicarbonate in the water resists acidification. Proportion models both sides and predicts where they land.
Residual alkalinity
The starting point is a number from Paul Kolbach in 1953: residual alkalinity. Not all of the water's alkalinity actually resists the mash, because calcium and magnesium react with malt phosphate and release acidity that offsets some of it. Residual alkalinity is the alkalinity that remains after that offset, expressed as parts per million of calcium carbonate.
Calcium contributes about a third of its equivalent weight to the offset and magnesium about a seventh, which is where the 1.40 and 1.70 divisors come from. A soft, low-bicarbonate water has near-zero or negative residual alkalinity and wants a pale grist; a hard, alkaline water has high residual alkalinity and needs dark malt or acid to pull the mash down.
Predicting mash pH
Residual alkalinity tells you which way the water pushes, but not by how much. Proportion does not apply a fitted RA-to-pH curve; it solves for the pH where the mash's acid and base terms balance. It writes the net proton balance as a function of pH and bisects for the pH that makes it zero. Four terms contribute:
- The malt buffer. Each grain has a distilled-water pH and a buffering strength (mEq per kg per pH unit, from Troester's and Bru'n Water's measurements). Below its own pH a grain donates acidity, above it absorbs; summed over the grist this is the dominant term, so a little roast or crystal malt pulls the whole mash down more than its weight suggests.
- Water bicarbonate absorbs protons, weighted by how protonated the carbonate system is at that pH (Henderson-Hasselbalch on carbonic acid, pKa₁ 6.35).
- Calcium and magnesium react with malt phosphate and release protons (about 0.71 and 0.59 mEq per mmol). This is the acidifying effect that residual alkalinity summarises.
- Added acid contributes free protons directly, in the real strength of lactic, phosphoric, or CRS.
Every term is monotonic in pH, so a dozen bisection steps land the answer to about 0.001. Residual alkalinity is still computed and shown as the single-number read on the water's push, but the pH itself falls out of the balance rather than a curve fit. Separately, a meter reads about 0.0033 units lower per °C above room temperature, so the app can show both the room-temperature prediction and the hot-mash reading.
Salts, acids, and pre-treatment
Additions are handled with real stoichiometry, not per-style presets. Each salt contributes a known ppm
of each ion per gram per litre (gypsum, calcium chloride, epsom, table salt, chalk, baking soda). Each acid
neutralises a known amount of bicarbonate per millilitre, with lactic, phosphoric, and the CRS/AMS blend
worked out from their real formulations. Pre-treatment options follow the chemistry too: boiling
precipitates temporary hardness as chalk (Ca(HCO₃)₂ → CaCO₃↓ + H₂O + CO₂↑), and slaked lime
does classic lime softening. Sparge water gets its own pH prediction from the carbonic acid equilibrium,
since it has no grain to buffer it.
3.The mash
The mash is where starch becomes sugar, and it is the part of brewing that most rewards being modelled properly. Malt starch is not fermentable; yeast cannot touch it. Enzymes already present in the malt cut it into sugars, and which sugars they make depends almost entirely on temperature. Mash warm and you favour one enzyme that leaves larger, less fermentable sugars, giving a fuller, sweeter beer. Mash cool and you favour another that produces mostly maltose, giving a drier, more attenuable one. The mash schedule is how a brewer dials in the body of the beer, and Proportion simulates the enzymes rather than looking the result up in a table.
Enzyme activity depends on temperature and pH
Two enzymes do most of the work. Beta-amylase works from the ends of starch chains, snipping off maltose two glucose units at a time; it peaks around 63°C and dies quickly above 70°C. Alpha-amylase cuts chains at random interior points, liquefying the mash and producing a mixture of maltose, maltotriose, glucose, and unfermentable dextrins; it peaks higher, around 72 to 73°C, and tolerates more heat. A third, limit dextrinase, attacks the branch points that neither amylase can reach. There are also lower-temperature enzymes for the protein, beta-glucan, and ferulic acid rests.
Proportion models each enzyme's instantaneous activity as the product of two bell curves, one over temperature and one over pH, each centred on that enzyme's optimum. That is why water chemistry and the mash are coupled: the pH the water model predicts sets how far off-optimum each enzyme is.
Denaturation, gelatinisation, and fermentability
Activity is only half the story. Enzymes are proteins, and heat unfolds them for good. Proportion applies first-order thermal decay whose rate constant follows a smooth Arrhenius law in temperature: negligible while the enzyme is cool, then rising steeply as it nears its denaturation range. There is no onset threshold and no cliff. This is why a hot rest converts fast but burns out its beta-amylase, and a cool rest is slower but preserves it. The rate is anchored so that the value and slope near each enzyme's characteristic temperature match measured thermal half-lives (beta-amylase around 40 minutes at 65°C; Briggs et al. 2004, Bamforth 2006).
Two more effects gate conversion. Starch has to gelatinise (swell and become accessible) before enzymes can work on it, which happens over a grain-specific temperature range. And the malt has to supply enough enzyme in the first place: diastatic power, the grain bill's enzyme content in Windisch-Kolbach units, scales the available enzyme pool. A bill that is mostly unmalted adjunct or roast malt has little diastatic power and converts poorly however you mash it.
All of this feeds fermentability. Proportion integrates the enzyme work over your whole schedule, minute by minute, shifts each grain's base sugar spectrum accordingly, then applies the yeast's ability to ferment each sugar class. The result is the predicted attenuation and final gravity, with an irreducible floor of roughly ten percent dextrins that standard malt enzymes cannot break down. The efficiency number comes out of the same place: conversion follows saturation kinetics on the integrated enzyme work, and lauter recovery depends on how much sugar-laden wort the grain retains.
The step and graph editor
A mash schedule can be described two ways. Brewers who think in rests want to say "66°C for 60 minutes, then mash out." Brewers who think in curves want to draw the temperature over time, including the real ramps and the slow drift of an uninsulated tun. Proportion lets you do both, on the same schedule, because both are views of one underlying object: the temperature curve itself. The step chips are derived from the curve, and editing either one writes back to the curve.
That slow drift is simulated, not just drawn. Between the points you set, the schedule is a smooth monotone spline that never overshoots them, and between plateaus the ramps rise at a realistic rate while the tun loses heat by Newton's law of cooling. The rate of loss scales with vessel size as $(20/V)^{1/3}$, because a larger vessel has less surface area per unit of volume and holds its heat longer.
The interesting problem is going from a hand-drawn curve back to a tidy list of steps without inventing detail or losing anything that matters. Proportion decides which wiggles are brewing-relevant using an idea from information theory: two temperature curves are treated as the same if they are indistinguishable under a weight function that is large exactly where enzymes are active or denaturing. A half-degree wobble at 40°C, where nothing is converting, is discarded; the same wobble at 65°C is kept. This weighted-L² simplification is what makes the two views round-trip cleanly, and it also drives the "which schedule changes are perceptible" logic.
4.Fermentation
Fermentation is where wort becomes beer, and where most of what people taste as "the yeast" is decided. Yeast eats sugar and makes ethanol and CO₂, but that headline reaction is the least interesting part. Along the way it throws off esters (fruit), higher alcohols (solvent and warmth), phenols (clove and pepper), diacetyl (butter), and a long tail of minor compounds, in proportions set by the strain and by the conditions you ferment in. Warm, underpitched, and low on oxygen pushes one way; cool, well-pitched, and aerated pushes another. Proportion models both the physical progress of fermentation and the biochemistry that rides on it.
These are two connected but distinct simulations, and it helps to keep them apart.
The physical model: how fast, how warm, how much pressure
The first simulation is a genuine time-stepped system of coupled differential equations (forward Euler at about 15-minute steps). It tracks three things that feed back on each other: how much sugar has been consumed, the temperature of the fermenting beer, and the pressure in the vessel.
- Sugar uptake follows a Gompertz curve (Zwietering et al. 1990), chosen over a symmetric logistic because real fermentation ramps up fast and tails off slowly. Its rate constant depends on temperature through a cardinal-temperature curve (Rosso et al. 1993) set by the strain's minimum, optimum, and maximum fermentation temperatures, so a cold-adapted lager out-ferments an ale in the cold, and it scales sub-linearly with pitch rate.
- Temperature is a heat balance: fermentation releases about 0.56 kJ per gram of sugar consumed, the vessel loses heat to ambient, and the net drives the beer temperature. This is why a vigorous, warm ferment can run away from its set point.
- Pressure is a CO₂ mass balance. In a sealed vessel the CO₂ produced partitions between dissolved (by Henry's law) and the headspace (ideal gas), and a spunding valve caps the gauge pressure. This is how the app models natural carbonation and pressure fermentation.
The biochemistry: a reaction network
The second simulation predicts what compounds end up in the beer. It is built as a network of biochemical reactions, each declared as its reactants, its products, and a rate law. The central chain is the real one: sugars are taken up and run through glycolysis to pyruvate, pyruvate is decarboxylated to acetaldehyde, and acetaldehyde is reduced to ethanol, with correct molar yields at each step. Glycerol comes off as a redox byproduct, and CO₂ is split between what stays dissolved and what escapes.
The flavour compounds branch off that chain:
- Esters are formed by two enzyme families (Verstrepen et al. 2003; Saerens et al. 2010). ATF1 makes acetate esters (isoamyl acetate is the banana of a hefeweizen) from an alcohol plus acetyl-CoA; EHT1 makes ethyl esters (apple, tropical) from ethanol plus a medium-chain fatty acid. Each ester's rate is a two-substrate Michaelis-Menten law, so it saturates when either substrate runs short. Acetate esters draw down their parent fusel alcohol as they form, which is the mechanism behind the "estery and not fusely" character of good Belgian yeast.
- Higher alcohols (fusels) come from two sources: the Ehrlich pathway, which strips amino acids for their carbon skeletons, and de novo biosynthesis. Because the many stress signals that push fusel production share regulatory machinery, Proportion damps their combined effect rather than multiplying them naively.
- Phenols (4-vinyl guaiacol clove, 4-vinyl phenol pepper) are made only by POF-positive strains that can decarboxylate malt and hop phenolic acids, amplified by a ferulic acid rest.
- Diacetyl, organic acids, thiol release from hop precursors, and geraniol reduction to citronellol each have their own reaction in the network.
Conditions steer the whole network
Temperature, pressure, pitch rate, oxygen, wort gravity, and yeast nutrition do not each poke one compound; they scale families of reactions through a single set of modifiers. Because these are computed by integrating over the fermentation curve weighted by how fast fermentation is going at each moment, a cold crash after the yeast is done barely moves them, while the temperature during active fermentation moves them a lot. Diacetyl is the exception that proves the rule: it has no modifier at all, because production and cleanup happen at once and the answer depends on the order events happen in, so it is integrated as a real two-pool ODE instead. The widget below lets you feel the main levers.
How different strains make different beer
All of this runs the same for every strain. What makes a lager taste like a lager and a Belgian taste like a Belgian is a set of per-strain parameters. A strain carries its attenuation behaviour (which sugars it will ferment), its temperature reference, the activity of its ester enzymes, and a baseline level for each flavour compound calibrated from published measurements. Feed the same wort to two strains and the model produces two different beers, entirely from these numbers.
A high-ATF1 hefeweizen strain fermented warm produces a lot of isoamyl acetate; a clean lager strain at 0.5 ATF1 fermented cold produces almost none, and makes no phenols at all because its phenol baselines are zero. Compare any two below.
5.The flavour forecast
The last step is the one brewers actually care about: what will it taste like? Predicting compound concentrations is chemistry; predicting flavour from them is psychophysics, and it is a genuinely harder problem because perception is not linear, compounds mask and reinforce each other, and thresholds vary between people. Proportion is deliberate about grounding this step in published sensory science rather than fitting it to individual beers.
From molecules to aroma
The bridge from a concentration to a perceived intensity is built from published sensory science:
- Odour activity value. The first question for any compound is how it compares to its own detection threshold. The ratio of concentration to threshold (isoamyl acetate 1.4 mg/L, diacetyl about 0.1 mg/L; thresholds after Meilgaard 1975) sorts what is smellable from what is present but silent.
- Detection times strength. Perceived intensity is the product of two grounded quantities: how many people detect the compound at this dose (a psychometric detection curve, 50% at threshold) and how strong it is once detected (odour-receptor occupancy, which saturates as the receptors fill and from which Stevens' compressive power law emerges). Most beer compounds (OAV roughly 1 to 10) sit on the early rising part, so they read present-to-prominent without pinning at maximum.
- Soft threshold and mixture effects. The threshold is the 50% point of a probabilistic ramp, not a wall, so a compound just under it still reads faintly (a Belgian ale's isoamyl acetate at 0.9× reads "faint banana", not "none"). Same-character compounds are combined by their odour-activity values before the curve is applied.
The detection term passes through 0.5 at OAV = 1 — the threshold is, by definition, where half a panel
just notices it — with a steepness set by the spread of individual thresholds. The occupancy half-point
K is set per class: about 1.5 OAV for esters and the general dimensions, 2.5 for phenols, whose
higher in-beer OAVs (4-vinyl guaiacol reaches 4 to 7×) saturate later. The product leaves the origin with
zero slope, so the low end is smooth with no floor: below threshold the detection term goes to zero, which
is what stops deep-subthreshold traces from summing into a phantom aroma.
The full profile Proportion reports spans about twenty dimensions. On the recipe side: alcohol, roast, malt, toffee/caramel, smoky, astringency, acidity/sour, sweetness, body, and bitterness. On the aroma side: woody/herbal, citrus/pine, tropical, floral, banana, apple/orchard, fruity, clove, pepper, and funk. Each is built from the relevant compounds through the same perception model, then binned into none, low, moderate, high, or intense. The compound-to-descriptor dictionary is explicit and cited: isoamyl acetate reads as banana and pear, 4-vinyl guaiacol as clove and smoke, ethyl hexanoate as apple and aniseed, and so on.
Off-flavour warnings
Some compounds are only wanted up to a point. Fusel alcohols, ethyl acetate at solvent levels, diacetyl, and acetaldehyde each get a warning when their combined odour activity crosses a gate. The severity is a smooth logistic in the amount over threshold, not an on/off flag, and each warning carries the actual contributing factors from the model (a warm ferment, an underpitch, low free amino nitrogen, low oxygen, high gravity, no diacetyl rest) with the corresponding fix. Because the factors are read from the same modifiers that produced the compound, the advice points at the real cause rather than a generic checklist.
How honest is the model?
Proportion aims to be mechanistic: results should fall out of chemistry and biology, not be fitted to a target. That is the standard, and it is worth being clear about where the model meets it and where it falls back on calibration, because the code is candid about it and the documentation should be too.
Well grounded in first principles: the water chemistry (ion equilibria, buffer capacity, pre-treatment stoichiometry), the enzyme kinetics (activity bells, Arrhenius denaturation, gelatinisation, diastatic power gating), the fermentation physics (Gompertz uptake, the heat balance, Henry's law and the pressure balance), and the central carbon chain and ester kinetics (real molar yields, two-substrate Michaelis-Menten, and the in-state FAS-versus-ATF1 acetyl-CoA competition by which oxygen suppresses esters). The mass conservation of the whole graph is enforced by property-based tests over randomised inputs.
Anchored to data or simplified, and marked as such:
- Oxygen, free amino nitrogen, and pyruvate are consumed by reactions but not tracked as depleting pools, so they cannot yet limit later steps by running out.
- Diacetyl runs the true two-pool model (α-acetolactate tracked separately from diacetyl, cleanup gated on suspended yeast), but its production, conversion and cleanup rate constants are fitted scalars rather than measured ones, and pressure has no effect on it at all.
- Thiol biotransformation is a dimensionless 0-to-1 score, not a concentration in ng/L.
- Per-strain flavour baselines are calibrated to published ranges. The model shapes how conditions move them from first principles, but the anchor points themselves are measured, not derived.
None of these are hidden. They are the honest edge of a model that is otherwise built from the underlying science, and they are where the work continues.
References
Sources the underlying models draw on, collected from the citations in the code. The load-bearing ones are cited inline above; this is the fuller list.
Water and mash
- Kolbach, P. (1953). Residual alkalinity.
- Troester, K. (2009). The effect of brewing water and grist composition on the pH of the mash. braukaiser.com.
- Brungard, M. Bru'n Water spreadsheet (v4+).
- de Clerck, J. A Textbook of Brewing.
- Narziss, L. (1992); Briggs, D.E. et al. (2004) Brewing: Science and Practice; Palmer, J. How To Brew.
- Faulds & Williamson (1994); Bamforth (1985); Jones & Budde (2005) — mash-rest enzymes.
- Coghe et al. (2004); Fix, G. (1999) — sugar spectrum. Kirkpatrick & Shellhammer (2018) — hop creep.
- Fritsch & Carlson; Fritsch & Butland — monotone spline interpolation.
Fermentation and flavour
- Boulton & Quain (2001) Brewing Yeast and Fermentation; White & Zainasheff (2010) Yeast.
- Zwietering et al. (1990) — Gompertz kinetics. Rosso et al. (1993) — cardinal-temperature rate model. Preiss et al. (2018) — kveik thermotolerance.
- Verstrepen et al. (2003); Saerens et al. (2008, 2010); Mason & Dufour (2000) — ester synthesis and ATF1/EHT1. Landaud et al. (2001) — head pressure, dissolved CO₂, and the fusel-to-ester ratio.
- Nykänen (1986); Dickinson (2003); Pires et al. (2014); Verbelen et al. (2009) — higher alcohols and the Ehrlich pathway.
- Krogerus & Gibson (2013) — diacetyl and valine regulation.
- Vanbeneden et al. (2008); Coghe et al. (2004) — phenolic off-flavour.
- Roncoroni et al. (2011); Roland et al. (2016); Michel et al. (2023) — thiol biotransformation.
- King & Dickinson (2003); Takoi et al. (2010); Holt et al. (2019) — geraniol reduction.
- Meilgaard (1975); Frijters (1978) — sensory thresholds and mixture perception. Stevens (1960) — the power law of sensation (the earlier perception form; the current model is a Hill dose-response whose per-class half-saturations are calibrated to the fixture corpus, not taken from the literature).
- Bamforth (2006); Briggs (2004); Fix (1999) — DMS and general brewing science.
Every widget and equation on this page reimplements the cited source locally so the page works offline. The authoritative version is always the code in the file noted beside each one.