Three identical additionsready
Buffer Water Unbuffered, same start pH
Buffer recipe
System
pKa
[base]/[acid] ratio
Henderson–Hasselbalch pH
Exact model pH
Capacity remaining vs HCl
Capacity remaining vs NaOH
pH vs volume of HCl (◀) or NaOH (▶) added
Volume added0.00 cm³
pH · buffer
pH · water
pH · same-pH
ΔpH · buffer
ΔpH · water
ΔpH · same-pH
Buffering factor
Buffer system
Acid-form concentration0.100 mol dm⁻³
Base-form concentration0.100 mol dm⁻³
Buffer volume25.0 cm³
Titrant concentration (both HCl and NaOH)0.500 mol dm⁻³
◀ HCl added · volume added · NaOH added ▶0.00 cm³
HCl NaOH
Model notes & assumptions

Method. As with the titration simulation, one general charge-balance equation is solved for pH at every volume added, rather than special-casing each buffer system. A buffer's acid form and conjugate base form share a fixed total concentration (their sum never changes — adding titrant just redistributes it), while each contributes a fixed "spectator" counter-ion (e.g. Na⁺ from sodium ethanoate, Cl⁻ from ammonium chloride) that never takes part in the equilibrium. Solving H⁺ − OH⁻ + (net spectator charge) + (charge from the acid/base pair at that pH) = 0 for pH reproduces the Henderson–Hasselbalch result in the buffering region and — without any extra code — also captures what happens once the buffer's capacity runs out.

Reading the bidirectional axis. The graph is two independent hypothetical experiments, both starting from the same pristine buffer and sharing one axis for comparison — it is not one continuous addition. Moving left computes "what if this much HCl, and only HCl, had been added"; moving right computes the same for NaOH. That's why moving the slider from the HCl side to the NaOH side doesn't pass through "HCl being neutralised" — each point on the curve is calculated fresh from the original buffer recipe, exactly like a normal titration curve is, just with both directions of titrant drawn on the same picture instead of two separate graphs.

The "same starting pH" comparison. This is a solution of a strong acid or strong base, with no conjugate pair at all, whose concentration is chosen so its initial pH exactly matches the buffer's. Because both start at the same pH and receive the same additions to the same volume, any difference that develops between the two curves is caused only by the presence of the buffering pair — it isn't a side-effect of comparing two solutions that started differently, which is what makes it a fairer test than comparing against plain water alone.

Why the water and same-pH curves often look identical. For most systems here, both unbuffered curves collapse onto almost the same line within a tiny fraction of a cm³ on either side, and stay indistinguishable for the rest of the graph — this is real, not a rendering fault (the graph deliberately gives them different dash rhythms so both lines stay visible even where they coincide). A dilute solution's own starting [H⁺] or [OH⁻] is minuscule next to any titrant concentration worth putting in a burette, so as soon as a real amount of titrant is added, both unbuffered solutions are overwhelmingly set by the titrant rather than by whatever pH they began at. Only the buffer, which holds a genuine reserve of reactive acid/base to consume that titrant, keeps its own identity for longer — read the stats panel at a small volume added (rather than the full sweep) to see the effect most clearly, since that is exactly where the contrast is largest.

Constants used (25 °C). Kw = 1.0×10⁻¹⁴; ethanoic acid Ka = 1.74×10⁻⁵ (pKa = 4.76); ammonium ion Ka = 5.56×10⁻¹⁰ (pKa = 9.25, from ammonia's Kb = 1.8×10⁻⁵); dihydrogenphosphate Ka2 = 6.2×10⁻⁸ (pKa = 7.21).

Buffer capacity, on both sides at once. The HCl side and the NaOH side each have their own, independent capacity: adding HCl depletes the base form's reserve while leaving the acid form's reserve untouched (and vice versa for NaOH), because the two sides are separate hypothetical experiments starting from the same untouched buffer. Each capacity limit reaches zero at a definite volume — the model doesn't need to be told this; the same charge-balance solve just stops being able to hold pH steady once that side's species is exhausted, and that half of the curve turns sharply upward or downward exactly like a titration nearing its titre.

Simplifications. Activity coefficients are ignored (concentrations stand in for activities); temperature is fixed at 25 °C; Henderson–Hasselbalch is shown alongside the exact model for comparison — the two agree closely except at very low concentrations or extreme ratios, where H–H's approximation that [HA]≈Cacid and [A⁻]≈Cbase (ignoring how much each is shifted by water's own autoionisation) starts to break down.