BrewWaterSolver calculates brewing salt additions to hit a target water profile - whether that's a BJCP beer style, a named water profile (modern or historical), or ppm values you enter yourself.

How it works

Given a target ion profile (Ca, Mg, Na, Cl, SO₄, HCO₃) and starting water - RO/distilled by default, or your actual tap water - the solver works out how much of each of the 9 brewing salts to add, restricted to whichever ones you actually have on hand, to get as close as possible to the target.

Mash pH is predicted from average beer style color alone, for a fast rough estimate, or, if you enter your actual grain bill, from each malt's measured acidity and buffering capacity, for a more accurate calculation. See the Help page for a walkthrough of every feature.

Data sources

  • Water profiles: Braukaiser (Kai Troester), Palmer & Kaminski's Water: A Comprehensive Guide for Brewers, and historical city water analyses (Burton, Dublin, Munich, Pilsen, etc.), kept separate from practical modern RO-based targets.
  • Beer styles: BJCP 2021 guidelines, with a confidence rating per style noting how well-established its water target is.
  • BA styles: Brewers Association 2026 Beer Style Guidelines (names and numeric ranges only, never BA's own descriptive text), each mapped to its closest BJCP analog to reuse that style's already-vetted water profile rather than inventing new, unreviewed targets. Confidence is flagged per style since some analogs are closer than others.
  • Malt data: published brewing-science measurements (Kai Troester, Palmer & Kaminski) - planning-grade approximations, not lab values for any specific maltster's current product.

License

BrewWaterSolver is closed-source, proprietary software - built with Python, FastAPI, and Chart.js. All rights reserved; the source code is not publicly available, and no license to copy, modify, or redistribute it is granted.

Get in Touch

Explore active projects & developer credentials.

Featured project

noip-bot

Auto renew noip free domains. Takes care of the code challenge and adjusts on when to scan for "needs renewal."

Python