Water chemistry
Water is the panel that does the most work per click, and the one most worth understanding before you trust it. This page walks the panel top to bottom, and says what each model is and is not.
The panel is Water & mash pH, near the bottom of the recipe editor. It computes nothing itself — every number comes from the same engine the rest of the app uses, and everything recalculates locally on every keystroke, salt solver and pH model included.
Starting from nothing
Section titled “Starting from nothing”An empty recipe has no water configured, and says so:
Mash pH, salt additions and the sulfate:chloride balance need to know what comes out of your tap.
Set up water seeds an RO profile — all zeros — so that nothing is assumed about your supply.
1. Source water
Section titled “1. Source water”Pick a saved profile, or choose Custom report… and type your own in. Seven profiles ship built in, read-only (duplicate one to edit):
| Ca | Mg | Na | Cl | SO₄ | HCO₃ | RA | |
|---|---|---|---|---|---|---|---|
| RO / distilled | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Pilsen | 7 | 2 | 2 | 5 | 5 | 15 | 6 |
| Burton on Trent | 295 | 45 | 55 | 25 | 725 | 300 | 9 |
| Vienna | 200 | 60 | 8 | 12 | 125 | 120 | −80 |
| London | 52 | 32 | 86 | 34 | 32 | 104 | 29 |
| Munich | 76 | 18 | 2 | 2 | 10 | 200 | 99 |
| Dublin | 118 | 4 | 12 | 19 | 54 | 319 | 175 |
These are the historical analyses reproduced by essentially every brewing calculator, from Palmer & Kaminski’s Water (2013). They are not this morning’s utility report, and for a beer you actually intend to drink your own report is worth the twenty pounds it costs. Vienna’s negative residual alkalinity is not a typo.
Six ions are tracked, all in ppm: calcium, magnesium, sodium, chloride, sulfate and bicarbonate. An ion you leave blank is zero, which is the honest reading of “not on my water report”.
Alkalinity can be entered three ways — as bicarbonate, as CaCO₃, or as German
carbonate hardness — and is stored as bicarbonate. The conversion is the
standard equivalence, 1 mEq = 50.043 mg CaCO₃ = 61.016 mg HCO₃⁻ (Standard
Methods 2320), so HCO₃ = alkalinity × 1.21927. It is exact only while the
alkalinity is carried entirely by bicarbonate, which holds below about pH 8.3.
Residual alkalinity
Section titled “Residual alkalinity”The readout that matters, because it is what actually moves mash pH:
RA = alkalinity − (calcium hardness / 3.5) − (magnesium hardness / 7)all as CaCO₃ — Kolbach, P., “Der Einfluß des Brauwassers auf den pH-Wert der
Würze und des Bieres”, Monatsschrift für Brauerei 6 (1953). In elemental ppm
the same thing reads RA = alkalinity − Ca/1.4 − Mg/1.7, which is the form
most often transcribed wrongly.
Diluting
Section titled “Diluting”A slider blends your water with RO, 0–90 %. Ions scale linearly. If you are diluting, do it here — everything downstream sees the diluted water.
If your report does not add up
Section titled “If your report does not add up”Cations and anions have to balance. If they differ by more than 5 % you get told:
Cations and anions differ by X %: check the report for a typo, a missing ion, or an alkalinity entered in the wrong unit.
Beerwright tracks six ions, so potassium, nitrate or silica in your supply will show up here as an imbalance rather than as an error.
Ward Labs reports
Section titled “Ward Labs reports”The Water page has an Import Ward Labs button that reads a W-1 PDF and opens a draft profile. It converts the sulfur figure to sulfate (SO₄-S × 2.996) and alkalinity to bicarbonate, and tells you it did. Review the numbers before you save — it is a draft on purpose.
2. Target profile
Section titled “2. Target profile”Five presets, described as representative rather than authoritative:
| Ca | Mg | Na | Cl | SO₄ | HCO₃ | SO₄:Cl | |
|---|---|---|---|---|---|---|---|
| Balanced | 75 | 5 | 15 | 60 | 75 | 0 | 1–2 |
| Hoppy pale | 110 | 10 | 12 | 55 | 190 | 0 | 2–4 |
| Malty amber | 90 | 10 | 25 | 110 | 65 | 60 | 0.4–0.8 |
| Dark roasty | 100 | 15 | 35 | 90 | 65 | 160 | 0.5–1 |
| Crisp lager | 45 | 5 | 8 | 45 | 60 | 0 | 1–1.5 |
If your recipe has a style, one of them is suggested. That suggestion is a lookup table keyed on the BJCP category number, not a model, and the panel says as much: a rule of thumb, not a prescription.
3. Salts
Section titled “3. Salts”Suggest additions runs the solver against your target. It searches every combination of up to three salts, weights each ion by how much it matters (calcium ±10 ppm, magnesium ±5, sodium ±10, chloride ±15, sulfate ±25, bicarbonate ±20), and rounds doses to 0.1 g — what a brewing scale reads. It is deterministic: the same target gives the same schedule every time.
The result is staged, not applied. You get a preview with a per-ion Target / Achieved / Δ / Tolerance table and a badge saying either Every ion in tolerance or Best available fit, and then you press Accept or Dismiss. Accepting is one action and one undo.
The manual salt table below it is always there, and is not a fallback.
The nine salts
Section titled “The nine salts”Gypsum, calcium chloride (dihydrate and anhydrous, as two separate entries), Epsom salt, table salt, magnesium chloride, baking soda, chalk and slaked lime.
Every ppm-per-gram figure is computed from molar masses when the module loads, waters of hydration included — not copied from a published table. That is why dihydrate and anhydrous calcium chloride are separate: they differ by a factor of 1.325 in calcium per gram, and treating them as one thing is among the most common silent errors in brewing water.
Each addition goes to the mash, the sparge, or both split by volume.
Two salts carry warnings the app will not let you miss. Chalk is only sparingly soluble — the figures assume it all dissolves, and in a mash tun it will not — so baking soda or slaked lime is the better way to add alkalinity. Slaked lime adds hydroxide rather than bicarbonate, and is reported as the bicarbonate equivalent. Neither is offered by the solver: chalk because it does not work, lime because it is potent enough that an automated solver reaching for it unprompted is a hazard.
Sulfate to chloride
Section titled “Sulfate to chloride”| Ratio | Reads as |
|---|---|
| under 0.5 | Too malty / minerally flat |
| 0.5–1 | Malty |
| 1–2 | Balanced |
| 2–4 | Hoppy / bitter |
| 4 and above | Very hoppy — can turn harsh |
The cut points follow Palmer & Kaminski’s Water (2013) and Martin’s Bru’n Water notes. They are a flavour heuristic, not a measurement.
Salts can only add ions. If the solver overshoots it will tell you the only way down is RO water.
4. Mash pH
Section titled “4. Mash pH”The prediction is a charge-balance model in the Troester/Kaiser lineage. Each malt has a distilled-water pH and a buffering capacity; the water contributes alkalinity and the Kolbach calcium and magnesium proton release; acids contribute pH-dependent equivalents. The pH where it all balances is:
Σ Bᵢ · mᵢ · (pH_DI,ᵢ − pH) = A_acids(pH) + A_water(pH)found by bisection to 10⁻⁶ pH.
Sources, as the engine carries them:
- Troester, K., “Understanding Mash pH” and “A general approach to brewing water” (braukaiser.com, 2009–2012) — the DI-pH plus buffering-capacity model, and the malt measurements the class defaults round to.
- Riffe, D. M., MpH mash pH spreadsheet — the same charge balance expressed as malt acidity at a reference pH, used as the cross-check.
- Kolbach, P. (1953) — residual alkalinity, applied as the Ca/3.5 and Mg/7 proton release.
- Bates & Pinching, and the CRC Handbook (97th ed.) — every pKa.
- Harned & Davis (1943) — carbonic acid, pKa₁ 6.35 and pKa₂ 10.33.
- Palmer & Kaminski, Water (2013) — the acid strength tables the computed figures are checked against.
The result is quoted at 25 °C, the temperature a pH meter is calibrated at, not at mash temperature.
Malt defaults
Section titled “Malt defaults”| Class | DI pH | Buffering (mEq/kg/pH) |
|---|---|---|
| Base | 5.72 | 41 |
| Munich / Vienna | 5.54 | 46 |
| Wheat and other | 5.95 | 33 |
| Roasted | 4.68 | 100 |
| Sugars and extracts | — | 0 |
Crystal malt is interpolated from its colour — pH_DI = 5.42 − 0.00727 × °L,
B = 45 + 0.35 × °L, both clamped — which is a straight line through
Troester’s caramel-malt measurements. It is a fit over a handful of points, not
a law.
Where the catalog publishes a measured figure for a specific malt, that wins.
Alkalinity is titrated, not assumed
Section titled “Alkalinity is titrated, not assumed”Alkalinity is measured to a pH 4.3 end point, but a mash only reaches about 5.4 — where roughly a tenth of the carbonate is still bicarbonate and has consumed no acid at all. Beerwright models that speciation by default, which is why its prediction sits about 0.03 pH below calculators that do not.
If you have not measured your source water’s pH, 7.5 is assumed. It barely matters: the prediction moves by under 0.01 pH across the whole 7.0–8.3 range.
Six acids, plus acidulated malt: lactic (80 / 85 / 88 %), phosphoric (10 / 75 / 85 %), citric as the solid monohydrate, acetic as 5 % vinegar, hydrochloric and sulfuric.
Strength is not a fixed equivalents-per-mole table. The engine works out how many protons an acid actually donates at the prevailing pH, from Henderson–Hasselbalch generalised to a polyprotic acid. Phosphoric acid is not “1 eq/mol” — at pH 5.4 it is 1.016. Citric acid at pH 5.4 is 2.20 eq/mol, not 3. Hard-coding those makes a calculator wrong the moment the target pH moves.
The cross-check: 88 % lactic works out at 11.48 mEq/mL at pH 5.4, against the ≈11.8 mEq/mL that Bru’n Water and Palmer & Kaminski publish.
Acidulated malt is grain, not acid. It goes in the grist, it is assumed to be 3 % lactic by mass, and the dose is solved against the actual grain bill — because adding it also changes the buffering. Treating it as lactic acid in a bag, which is the linear conversion most calculators do, overstates the dose.
The panel offers you the one-click version: Add 2.40 mL Lactic 88 % → 5.40, or Add 150 g acid malt → 5.40. If the target is out of reach it says so instead of clamping:
Lactic 88 % cannot reach 5.20 at a sane dose.
And if your mash is below target, it will not offer you an acid at all:
Mash is below target: 2 g baking soda would raise it to 5.40. Add it as a salt above — alkalinity belongs in the water profile, never in the acid list.
The band
Section titled “The band”5.2–5.6 at room temperature, with the default target 5.40. Outside it you get told what to expect: below, thin body, poor extract and a sharp acidic finish; above, harsh tannin extraction, dull bitterness and hazy beer.
An all-extract recipe has no mash pH
Section titled “An all-extract recipe has no mash pH”It reads as a dash, not 5.4:
Extract worts arrive at whatever pH the maltster left them at.
5. Sparge water
Section titled “5. Sparge water”The panel works out what the sparge needs on its own:
Sparge water: 12.0 L needs 2.20 mL to reach pH 5.5 and stop tannin extraction in the last runnings.
Acidify sparge adds an ordinary acid row targeted at the sparge — a real, persisted, undoable row rather than a hidden setting.
What the model does not do
Section titled “What the model does not do”Worth knowing before you trust a number to two decimal places.
- No full ionic equilibrium. Carbonate speciation only, and the strict hydroxide and hydrogen terms are deliberately dropped. Six ions, so no potassium, nitrate or silica.
- No measured-pH input. The model is predictive. There is nowhere to record what your meter actually read and have the app adjust — take the reading, and trust the meter over the model.
- No kettle additions. Salts and acids go to the mash, the sparge or both. Nothing doses post-lauter.
- No temperature model. pKa values and solution densities are fixed constants at 25 °C and 20 °C. There is no mash-temperature-to-room-temperature conversion.
- pH is never averaged. Blending two waters drops the pH rather than averaging it, because pH is a logarithm and the mean of two logarithms is not the logarithm of the mean.
- Chalk is not pretended to work. It is modelled as fully dissolving, warned about every single time, and kept out of the solver.