Skip to content

Base Dose and Water Activity Planner

Version 1 · Disclaimer

The two pieces of the skill's prep_calc.py that are needed at the hob without running the skill: how much base takes a fruit mixture from its native pH to the target, dosed in two passes; and how far the Stage B fraction still has to be reduced, what water activity that implies, and whether the safety hurdle exists yet. The planner also keeps a predicted-against-measured log, because the real control is the delta: three consistent deltas for a fruit are a standing correction, one is a measurement.

The arithmetic is a port, not a re-derivation. Where this page and the script disagree, the script wins and the page has a bug; the page checks itself against the script's own figures on load.

The bench

It also runs on its own at /assets/apps/base-dose-planner/index.html if the frame above is awkward on a phone. The pH bench can open it with the corrected native pH and TA filled in.

Why the solve is anchored on native pH

Titratable acidity is titrated from the fruit's native pH to a pH 8.2 endpoint, so it counts only the protons still on the acid, not the acid itself: fruit at pH 3.5 already carries its own potassium. The fraction of TA that must be neutralised therefore depends on where the fruit starts, not only on which acid it carries. With \(z(\mathrm{pH})\) the mean negative charge per acid molecule (from the pKa sets: malic 3.40 / 5.13, citric 3.13 / 4.76 / 6.40, tartaric 3.04 / 4.37, quinic 3.39, lactic 3.86; 25 °C, ideal):

\[ \begin{aligned} n_{acid} &= \mathrm{TA} \,/\, [\,z(8.2) - z(\mathrm{pH}_{native})\,] \\ \mathrm{base}_{meq} &= n_{acid} \cdot [\,z(\mathrm{target}) - z(\mathrm{pH}_{native})\,] \end{aligned} \]

Potassium bicarbonate, MW 100.1, is 10 meq per gram; sodium bicarbonate 11.9 but it adds sodium; calcium hydroxide overshoots on a steep curve and sets pectin-rich purée solid. Where the native pH sits near an acid's top pKa (dates at 5.8 attributed to malic) the denominator collapses and the solve falls back to an unanchored figure and says so; such ingredients carry little TA anyway. Several ingredients combine by charge balance: the mixture's native pH is the pH at which the combined anion charge equals the cations the ingredients brought.

The figures the page checks itself against (from the script, 2026-09-18):

Acid TA meq Native Target Base meq g KHCO₃ Fraction of TA Anchored pH after 80 %
malic 40 3.5 6.15 37.57 3.76 0.939 yes 5.40
citric 40 3.2 6.15 29.12 2.91 0.728 yes 5.53
malic 40 3.2 4.5 18.04 1.80 0.451 yes 4.21
malic 40 3.9 4.5 10.29 1.03 0.257 yes 4.38
malic 10 5.8 6.15 9.56 0.96 0.956 no, fallback 5.20

No flat factor can be right: malic fruit needs ~0.94 of its TA for a 6.15 target, citric ~0.73, and for a furanone target the factor depends on native pH as much as on the acid.

The procedure, which is the real control

  1. Compute the full dose and the target (cold).
  2. Add 80 % in two or three portions; it foams.
  3. Measure cold on a thin smear with a flat or spear probe (a bulb will not read paste); the pH bench corrects a slurry reading if that is what you have.
  4. Titrate the rest in, measuring.
  5. Log predicted against measured. The page stores the log in this browser only, exports it as CSV, and offers a standing correction when the last three entries for a fruit agree within 20 %.

An overshoot is pulled back with phosphoric acid, not lactic; the page gives the millilitres of 85 % acid from the same speciation model (14.6 mmol per mL).

The reduction side

Known-solutes mode reproduces the script's brix_block: it counts sugars, added amino acid or collagen and the base residue (0.39 g per g KHCO₃), so the Brix it reports is a lower bound and the water to remove an upper bound, because fruit non-sugar soluble solids are not counted. Refractometer mode takes the current pot contents and a measured Brix (from the Brix bench if above 32) and the mass balance is then exact: mass at the aim is contents × Brix ÷ aim.

Water activity is mapped from Brix two ways (Norrish, with sucrose 6.47 and hexose 2.25 constants; Money–Born) and shown as the band they span, widened by 0.02 when glycine or potassium salts are present, since small solutes depress a_w more than the sugar mapping predicts. At 64 °Brix the band is about 0.79–0.88. The hurdle verdict follows the primer: an unbased jar below pH 4.6 is protected by acidity; a based jar is protected only by a_w below ~0.93, which exists only once the refractometer reads 60–68, and never above 72.

Open points

  • The unanchored fallback for a date-like ingredient lands close to the anchored malic figure by coincidence; the page flags it rather than letting the number look confident.
  • The hexose Norrish constant is a Med value; the band spans the uncertainty. A single "operational a_w" line could replace it if preferred.
  • The delta log is per browser. A durable log means a CSV committed under docs/assets/data/, which is a publishing step, not a page feature.