Brewbuddy '26 Manual
Version 4.88 ยท By Leonard Hamers ยท Bossche Brouwers
Installation
Brewbuddy '26 is a single HTML file โ no installation required. Download the file and open it in your browser.
Install as an app (recommended)
You can install Brewbuddy '26 as a real app on your phone or laptop:
- Android (Chrome): Open the app in Chrome โ menu (โฎ) โ "Add to Home screen"
- iPhone (Safari): Open the app in Safari โ share icon โ "Add to Home Screen"
- Windows/Mac (Chrome): Click the install icon in the address bar
Creating your first recipe
Go to the My Recipes tab and click + New Recipe. The recipe editor opens with default settings you can adjust right away.
- Name your recipe and choose a beer style
- Set the batch volume and efficiency (default 20L / 75%)
- Add malt via the + Add button in the fermentables section
- Add hops with timing and use
- Select a yeast from the database
- Save with ๐พ Save Recipe
Archiving recipes
A recipe list only ever grows. After a few years it holds the trial brews you made once, the variants that never worked out, and that one recipe from that one summer. You do not want to throw them away โ a batch may be attached to them, or simply a memory โ but they are in the way every day.
Every recipe card therefore has an 🗄️ Archive button. An archived recipe disappears from your recipe list and from the dropdowns on brew day, on the water page and in your shopping list. It otherwise remains fully intact: in your backup, in your BeerXML export, with all its versions, and any batch linked to it keeps working as before.
As soon as something is archived, a 🗄️ Show archive button appears at the top, with the count next to it. Click it and the archived recipes appear among the others, greyed out and labelled Archived, each with a ↩️ Restore button. The count above the list by default only counts the recipes you have not archived.
Brew day
When you brew, convert the recipe into a brew batch via ๐บ Create as Brew Batch. You are automatically taken to the log. The reverse also works: create an empty batch and attach a recipe on the spot via ๐ Attach Recipe โ no tab switching. Use ๐ Attach a different recipe to swap later.
The log contains:
- The full recipe next to your brewing tools: grain bill (with share and EBC), hop additions, other ingredients and yeast
- Mash step timers linked to your recipe schedule (or the default schedule)
- Timers for mash, boil and stopwatch, with an alarm at every hop addition
- Gravity readings per phase with temperature correction
- Fermentation progress and carbonation calculation
- Notes and tasting notes
What to aim for
Below the fermentation schedule sits the ๐ฏ What to aim for card: the numbers you tick off one after another on brew day, so you never have to open the recipe for them. It sits just above your mash steps, which is where you read them side by side.
| Strike water | How hot the water you pour onto the grain must be |
| Mash water | What goes into the mash tun |
| Sparge water | What you rinse through it |
| Total water | What you need in total, losses included |
| Pre-boil volume | What stands in the kettle when you start boiling |
| Pre-boil gravity | What you measure in the full kettle before the boil |
All six come from the brew's own copy, not from the recipe. Switch to a different rig on brew day or adjust the grain bill and they follow along.
Pre-boil gravity is your earliest check on efficiency. Measure lower than shown and your mash yielded less than the recipe assumes, so your OG will come out lower too; measure higher and the reverse. You know that before you start boiling, not once the yeast is in.
How hot should your strike water be?
Water poured onto cold grain cools down. How far depends on three things: how much grain there is, how cold it is, and how much water goes on. The app works it out from the heat balance between those masses โ grain absorbs about two and a half times less heat per kilo than water โ and adds the heat that disappears into a cold vessel.
You enter your grain temperature once under Settings โ ๐ง My brewing equipment โ Grain and vessel temperature. It sits with the equipment rather than the recipe, because it depends on where you keep your grain: a garage in January is not a kitchen cupboard. Leave it and the app uses 20 ยฐC. If it freezes in your shed, enter a temperature below zero โ that is not a typo but the very reason your strike water has to be hotter.
Whether the vessel counts is taken from the dropdown under Mash tun dead space. Set to stays behind it is a cooler or a separate tun: that sits cold and pulls heat out of your strike water. Set to comes along into the kettle it is a single vessel with a pump and an element, already up to temperature.
Following and steering the fermentation
The fermentation schedule in the log is editable, just like your grain bill and your hops. Per step you change the name, the temperature, an optional end temperature and the number of days; + Add step puts a phase in and โ takes one out. The dates beside them shift straight away, so you see at once when the next step is due.
A new step starts at the temperature the previous one ended on. That is almost always what you mean when you add a phase halfway through.
The boil timer warns you at every hop addition
Link a recipe to your brew day and the boil timer reads the hop schedule along with it. Every addition with use Boil triggers the same alarm as a mash step: sound that repeats until you confirm, vibration on Android and a browser notification. Below the clock you also see which addition comes next and in how long, so you can weigh it out in advance.
The times are remaining boil time, the way brewers write them. A hop at 60 minutes therefore goes in straight away in a 60-minute boil, and only after half an hour in a 90-minute boil. If an addition is set to more minutes than your boil time, the app reports it at the start โ any later is impossible.
Only additions with use Boil get their own alarm. First wort hops are already in before the timer runs, whirlpool and dry hops come afterwards, and hop extract goes in after fermentation. Hops at 0 minutes get no separate signal but are named in the final alarm โ two alarms at the same moment is not an alarm but noise.
Other ingredients count too. Orange peel, coriander, Irish moss โ they were always in your recipe, but had only a phase and no timing, so the timer could do nothing with them. Every other ingredient with timing Boil now has a Time field in minutes of boil remaining, exactly as for hops. That matters here: coriander and peel give up their aroma to the steam, so ten minutes too early costs you half of it.
Your own batch numbers
The number at the top left of the log is free text. If you use your own series such as GB202, KB22 or 2026-014, simply type it in; letters, hyphens and leading zeroes are all fine.
The app counts on from the last block of digits and leaves the rest alone: GB202 becomes GB203, 2026-014 becomes 2026-015, and GB007 becomes GB008. Switch series by setting the most recently created batch to KB22 and the next one becomes KB23. So you type the prefix only once per series.
When you create a new batch, the next number is already offered in the name field. Press OK straight away and the batch is called GB203 and carries that number. Prefer a real name such as Tripel test brew? Then the batch gets that name and keeps GB203 as its number.
Under Settings โ Next batch number you set what the very next batch will get, for instance when you move over from another program and want to carry on counting. The overview sorts batch numbers naturally, so GB9 comes before GB99 rather than after it.
Brew-day adjustments โ without changing the recipe
The batch always works on a copy of the recipe. Everything you adjust in the log applies only to that brew day: change amounts, add (+ Add) or remove (โ) ingredients, and even swap the yeast โ the new yeast's attenuation is taken over automatically. OG, FG, ABV, IBU and EBC are recalculated live. The original recipe in your library always stays unchanged. Useful when an ingredient is out of stock or a hop lot has a different alpha acid percentage.
Changing the batch volume โ with or without scaling
Changing the batch volume now changes only the volume. Your grain bill, hop additions and yeast stay exactly as they are. You immediately see what happens to your beer: the same malt in fewer litres gives a higher gravity and more bitterness. That is precisely what you want to know when you got 18 litres out of the kettle instead of the 20 you expected.
What is recalculated are the boil volume and your mash and sparge water. That is not scaling but a consequence: they follow from your grain bill and your equipment profile, and would otherwise no longer be right at the new volume.
If you do want to convert the recipe to a different batch size, use the โ๏ธ Scale button next to the volume field. It shows you the factor and a preview first, and the amounts only change after Apply. A line with that button appears after a volume change, so you do not have to go looking for it.
The batch overview
The Overview tab shows a chart of your last twenty batches. The Show dropdown picks what you see in it: alcohol, bitterness, colour, original gravity, final gravity or your measured efficiency. That way you can tell at a glance whether your beers are getting more bitter or your efficiency is rising โ something the table below does not show.
For original and final gravity the axis starts at 1.000 rather than zero. Otherwise 1.040 and 1.080 would barely differ on the scale. A batch for which you did not record that value gets no bar; a sliver would suggest a measurement that is not there.
Click a row in the table below to open the brew day log for that batch. This also works with the tab key and Enter.
Malt & Grains
Adding sugar or honey during fermentation
The malt table has an Add column with four moments. They run in brew-day order, and they decide which calculation the ingredient counts towards:
| Moment | Mash water | Pre-boil gravity | Original gravity | Alcohol |
|---|---|---|---|---|
| Mash | yes | yes | yes | yes |
| Kettle | no | no | yes | yes |
| Fermentation | no | no | no | yes |
| Bottling | no | no | no | yes |
Mash is the default and the ordinary case: grain and anything else you mash in. Kettle is for sugar or extract you only tip into the boil kettle โ you see that in your original gravity but not in the reading you take before the boil, because it is not in there yet. Set it to Fermentation and a day field appears โ day 3 by default. That is the usual choice: the primary is past its peak, so the yeast takes up the new sugar calmly instead of tearing through it. Bottling is for priming sugar and has no day.
This is what you use it for: honey in a tripel, candi sugar in a quadrupel, or plain sugar to dry out a strong beer without putting the yeast under osmotic pressure at pitching.
The app treats it differently from sugar in the kettle, and that difference is the whole reason this column exists:
| Sugar in the kettle | Sugar on day 3 | |
|---|---|---|
| OG | counts | does not count |
| Pre-boil gravity | counts | does not count |
| IBU | counts | does not count |
| Alcohol | counts | counts |
| FG | no difference: simple sugar ferments out completely | |
The OG is the important one. You measure your original gravity on brew day, and the honey is not in there yet. If the app counted it anyway it would predict 1.086 where you measure 1.071, and you would go looking for an efficiency problem that does not exist. For the same reason it does not count towards bitterness: it was never in the kettle, so it never diluted the wort during the boil.
A second line under the OG shows the gravity including the late sugar. That figure is the one your alcohol percentage comes from โ without it the alcohol appears out of nowhere.
The brew card, the printout and the share text add only on day 3 of fermentation, so you do not tip it into the kettle by mistake on the day. In BeerXML it travels as ADD_AFTER_BOIL with the day in the notes; a file that arrives without a day note falls back to day 3.
Anything set to Fermentation also stays out of the mash: out of the mash water, the water-to-grain ratio, the grain absorption and the mash pH. With honey that made no difference, because sugars and extracts are excluded there anyway. Set an ordinary malt to Fermentation โ or import honey from another program without its type โ and the difference is a whole kilo of grain, which is roughly a litre of mash water plus a litre left behind in the spent grain.
Priming sugar
The third choice in the Added column is Bottling. Enter your priming sugar that way in the malt list and it counts where it should:
| Priming sugar | |
|---|---|
| OG | does not count โ you measure that in the fermenter |
| FG | does not count โ you measure that just before bottling |
| IBU | does not count โ the sugar never saw the kettle |
| Alcohol | does count โ sugar makes alcohol in the bottle too |
Seven grams per litre, an ordinary dose for 2.4 volumes of COโ, adds about 0.4 % alcohol. That is not a rounding error: it is the difference between an 8.0 % tripel and an 8.4 % one.
There is no day field with Bottling: bottling is not a day of fermentation. How much sugar you need for a given number of COโ volumes is what the Priming sugar tool works out โ the two do not clash: the tool calculates what you need, the recipe row records what you add.
What does points/kg mean?
Points/kg is how many gravity points one kilo of an ingredient yields in one litre of wort, at 100 % efficiency. One kilo of sugar dissolved to one litre gives SG 1.384 โ so sugar is 384 points. Pilsner malt does not reach that and sits around 300.
Maltsters do not print this figure; they give the extract content as a percentage. Converting:
| What you have | Calculation | Example |
|---|---|---|
| Fine extract dry basis + moisture | extract ร (100 โ moisture)/100 ร 3.84 | 80 % at 4.5 % moisture โ 293 points |
| PPG (US) | PPG ร 8.35 | 37 PPG โ 309 points |
| Yield as SG | (SG โ 1) ร 8350 | 1.037 โ 309 points |
In the + Add custom malt form you do not have to calculate anything: copy the two figures from the analysis certificate โ fine extract on a dry basis and moisture content โ and the Points/kg field fills itself. All three fields convert into one another.
Why the moisture figure belongs there
A European maltster states fine extract on a dry basis: the maximum a laboratory gets out, measured on malt with all moisture calculated out. That is a standardised EBC measurement, a congress mash on a 0.2 mm grind.
Your sack does contain that moisture, some 4 to 5 percent, so that kilo yields proportionally less. A pilsner malt at 80 % extract and 4.5 % moisture gives 80 ร 95.5/100 = 76.4 % in practice, and 76.4 ร 3.84 = 293 points. Skip the moisture step and you land on 307, reckoning yourself a good four percent richer than you are.
Names and list order
The brand name is not part of a malt's name. Pilsner malt is simply Pilsmout 3 EBC. The reason: the app is also used in English and Spanish, where different maltsters fill the shelves โ a name with a Belgian maltster in it is wrong there. The supplier has not disappeared: it sits in its own Producer column on the Ingredients tab, and you can search on it.
The same goes for yeast: it is called SafAle US-05, not SafAle US-05 (Fermentis). The brand lives in the Producer column, where you can search and sort on it.
When you add an ingredient yourself there is a Producer field for who you buy it from. That applies to malt, hops, yeast and other ingredients, and you can fill it in for existing own ingredients as well.
The supplier also appears where you actually need it: after the name in the recipe dropdown, in your stock and on the shopping list. That way you can tell apart three pilsner malts that differ only in EBC. For hops it shows the country of origin, since no brand is recorded for those. Only the name is stored.
Editing your own ingredients
Everything you entered for an ingredient of your own can be changed afterwards, straight in the table on the Ingredients tab. The name and the producer; for malt the points, EBC and type; for hops the alpha acid, type and origin; for yeast the attenuation, form and temperature; for other ingredients the type, unit, maximum dose and note. A change is saved immediately and carries through to your recipes.
That is how you tell apart three pilsner malts from different suppliers: give each its own name โ Pilsner malt Dingemans, Pilsner malt Belgomalt โ and fill in the producer. Each then has its own price, its own stock and its own points, and the recipe dropdown shows who it comes from after the name.
All lists โ malt, hops, yeast, other ingredients and beer styles โ are in alphabetical order. For hops, malt and other ingredients that applies within the groups the dropdown uses (for other ingredients: Citrus, Fruit, Herbs and so on). Ingredients you add yourself appear at the bottom in their own group Custom malt / Custom hops / Custom yeast.
Choosing the beer style
The style list is grouped by beer type โ lager, wheat beer, pale ale and IPA, amber and bitter, stout and porter, Belgian and French, sour and wild, strong beer, and fruit, spice and smoke. Within each group it is alphabetical, so the American IPA sits next to the English one instead of forty lines away.
Above the list is a search field. Type ipa, stout or weizen and the list shrinks to what matches; accents and capitals are ignored, so munchner also finds Mรผnchner. Esc clears the field.
The fermentables section contains a database of more than 80 malts and grains, organised in categories:
| Category | Examples | Max. share |
|---|---|---|
| Base malt | Pilsner, Pale Ale, Munich | 100% |
| Caramel/Crystal | Crystal 40L, Caramunich | 25% |
| Roasted | Chocolate, Black Patent | 15% |
| Unmalted grain | Oats, Wheat, Rye | 40% |
| Sugar/Extract | Candi sugar, DME | 20% (info) |
Hops
Add hop additions with weight, alpha acid percentage, use and timing. IBU is calculated with the Tinseth formula.
| Use | Explanation |
|---|---|
| Boil | Standard bittering hops. IBU depends on boil time. |
| First wort (FWH) | Added before the boil. Mild bitterness, good integration. |
| Whirlpool | After the boil. Enter the stand time under boil time and the temperature under WP ยฐC โ bitterness follows from those |
| Dry hop | During fermentation. Pure aroma, no IBU. |
Whirlpool: how the bitterness is calculated
A whirlpool addition gets a full IBU calculation, on temperature as well as stand time. Set the row to Whirlpool, enter the stand time under Time (min) and the wort temperature under WP ยฐC. Leave the temperature empty and the app uses 80 ยฐC.
By way of illustration, 50 g of 12 % alpha hops in 20 litres, thirty-minute stand:
| Temperature | IBU |
|---|---|
| 70 ยฐC | 10 |
| 80 ยฐC | 14 |
| 90 ยฐC | 20 |
| 99 ยฐC | 28 |
Why not simply Arrhenius
The temptation is to extend the reaction rate of isomerisation down to lower temperatures, as with the altitude correction. That gives 2 % utilisation at 80 ยฐC and 14 % at 99 ยฐC โ a factor of seven. Measured values are far flatter: Rodammer, working with the laboratory of Bell's Brewery (AHA, 2017), measured 3.96 % at 82 ยฐC against 4.36 % at 99 ยฐC, thirty minutes each. A factor of 1.1, then, not seven.
Part of that bitterness probably comes not from iso-alpha acids but from humulinones, which simply dissolve at lower temperatures without isomerising. The app therefore uses a damped model: the kinetic factor to the power 0.4, a ceiling of 12 % utilisation and a time factor that rises quickly and then levels off. That matches the same series over time โ 10 to 60 minutes at about 95 ยฐC gave 3.6 to 5.1 %.
The stand time and temperature also appear on the brew sheet and in the shared text, so that on brew day you can see at what temperature to hop and for how long. Both travel in BeerXML.
Pellets, cones or T-45?
For each hop addition you pick the Form it came in. This feeds into utilisation:
| Form | Utilisation | Notes |
|---|---|---|
| Pellets T-90 | 100 % (default) | By far the most common. The plant material is milled, so alpha acids are released more readily |
| Whole cones | 90 % | Alpha acids are still locked in the leaf and the hop bed holds back more wort |
| T-45 / Cryo | 100 % | Lupulin concentrate. No extra factor โ see below |
Existing recipes are set to pellets, so your calculated IBU does not change. On export to BeerXML the form is written as Pellet or Leaf; BeerXML has no separate category for T-45 or Cryo.
Harvest year and storage โ hop ageing
Alpha acids degrade through oxidation. Enter the harvest year and storage method per hop addition and the app calculates with the alpha acid actually left. The effective percentage appears below the IBU value once the loss exceeds 2%. Leave the year empty and no correction is applied.
| Storage | Loss per year | Example: 12% ฮฑ after 2 years |
|---|---|---|
| โ๏ธ Freezer, airtight | ยฑ5% | 10.9% |
| ๐ง Fridge, airtight | ยฑ14% | 9.0% |
| ๐ Room temperature, airtight | ยฑ30% | 6.1% |
| ๐ Room temperature, open package | ยฑ45% | 3.8% |
Isomerised hop extract (tetrahop, isohop)
Under Use choose Extract (post-fermentation) for products such as Tetrahop Gold, Isohop, Hexahop or Redihop. These extracts already contain isomerised alpha acids: they need no boiling and are dosed after fermentation, usually just before packaging.
- Enter the dose in mL in the weight field (density โ 1 g/mL)
- Enter the product's percentage of iso-alpha acids in the alpha acid field (Tetrahop Gold: 10%, Isohop: 30%)
- Boil time is irrelevant and is ignored
Bitterness is calculated at near-complete utilisation: IBU = mL ร %iso ร 1000 / batch volume. Example: 2 mL of Tetrahop Gold 10% in 20 L gives 10 IBU.
A different alpha acid on your bag than in your recipe
The alpha acid in the database is a typical value. The bag you open says something else, because alpha acid varies by harvest and by lot. Just enter it in the Alpha acid column, as you would.
A line then appears below the hop table:
One click on that button and your weight is adjusted. If you would rather keep the extra bitterness, do not click; the line disappears as soon as you do something else.
The reference point is your saved recipe. The app looks at the bitterness as it stood when you last saved, not at something it memorised along the way. If you have already adjusted the weight yourself, the app keeps quiet: clearly you have handled it.
The same suggestion appears for a different hop variety, a different form, a different harvest year or different storage — all things printed on your packaging. Change the boil time, the use or the weight yourself and nothing appears: those are decisions in your recipe, not surprises from a bag.
Choosing a bitterness yourself: the scales button
Next to the IBU figure of every hop row there is a ⚖️ button. It opens a card where you steer everything yourself: pick a different variety, enter an alpha acid, a harvest year, and above all a target IBU of your choosing. Type 30 where it said 41.9 and the app tells you what that costs in grams.
For the ordinary case — a bag with a different alpha acid — you do not need that card. Use the line below the table; it does the same in one click.
Yeast
Select a yeast from the database (Fermentis, Lallemand, Mangrove Jack's, Wyeast, White Labs). If yours is not there, pick โ๏ธ Add your own yeastโฆ at the bottom of the dropdown: you fill in name, attenuation and form, and it appears in your recipe and in your ingredient list at once โ with price, stock and shopping list. You can also do it beforehand via Ingredients โ Custom yeast. Attenuation is required: it determines your final gravity, so the app cannot fill it in for you. The right-hand panel shows your pitching rate and compares it with what you need. That figure comes from the same cell model as the Yeast pitching tool (White & Zainasheff):
| Million cells per mL per ยฐPlato | up to OG 1.061 | from OG 1.061 |
|---|---|---|
| Ale (top-fermenting) | 0.75 | 1.0 |
| Lager (bottom-fermenting) | 1.5 | 2.0 |
Two independent reasons, and they stack. A lager ferments at 8โ13 ยฐC: cold yeast grows more slowly and multiplies less, so you make up the shortfall at the start rather than letting the yeast catch up on its own โ and the faults of underpitching, diacetyl and sulphur and esters, stand out immediately in a clean beer. Heavy wort puts the yeast under osmotic pressure, so it multiplies less well; hence a third on top from 1.061. A strong lager faces both, which is how it arrives at 2.0.
Dry yeast provides roughly 20 billion viable cells per gram, a pack of liquid yeast 100 billion. For dry yeast the app gives the advice in grams, for liquid yeast in packs โ liquid yeast is not sold by weight.
Dry yeast: the manufacturer's own figure
For dry yeast the app does not follow the cell model but the dosage the manufacturer publishes, in grams per hectolitre. That figure already contains their own cell count and their own viability, so it is more reliable than assuming 20 billion cells per gram โ a number that differs between manufacturers and even between strains.
- Fermentis: 50โ80 g/hL for ale, 80โ120 g/hL for lager at 12โ18 ยฐC โ their own specification
- Other brands: 50โ100 g/hL for ale, 100โ150 g/hL for lager โ a general range, and the app says so rather than pretending it is a manufacturer figure
From 15 ยฐPlato the whole range scales with the strength of the beer. Fermenting a lager below 12 ยฐC pushes the advice up further: Fermentis recommends up to 200โ300 g/hL for W-34/70 at 9 ยฐC. The app reads that temperature from the first step of your fermentation profile.
More than one yeast in a recipe
The yeast card is a list, just like malt and hops. + Yeast adds a row; per row you pick the yeast, the form and the amount. More than six yeasts in one recipe is refused โ that stops being a recipe and becomes an experiment.
The Added column says when it goes in:
- Primary โ into the fermenter on brew day. Pitching two or more together is a blend: their cell counts add up.
- Later โ a number of days after brew day, day 7 by default. For Brett or a second strain joining during the secondary.
- Bottling โ only at bottling, after fermentation is complete and any lagering. This is where a bottling yeast such as CBC-1 belongs.
The list holds two bottling yeasts: CBC-1 from Lallemand and SafAle F-2 from Fermentis. Fermentis gives F-2 a dose of 2 to 35 grams per hectolitre at 15โ25 ยฐC, and advises against sprinkling it straight into the beer: rehydrate it first in at least ten times its own weight of sterile water at 25 to 29 ยฐC.
That difference is not cosmetic. A yeast that only joins on day 7 does not count towards your pitching rate, which is about the cells you put into the wort at the start. Pitch two at once and the panel adds up the cells of both and sets the total against what you need โ a dose in grams per hectolitre would be meaningless there, because it applies per product.
The shopping list, stock and cost price count every yeast, each in sachets. The brew card and the share text state per yeast when it goes in. In BeerXML each yeast gets its own YEAST element; a late addition travels as ADD_TO_SECONDARY with the reason in the notes. A file with several yeasts is read back the same way.
Grams, packs or a starter
Next to the yeast choice is Yeast form. Choose Dry and you enter grams as always. Choose Liquid and you count packs. Choose Starter and you enter the number of litres of starter you grew โ no more converting on a scrap of paper.
The app converts all three to the same figure: the number of cells that ends up in your wort. The right-hand panel puts that next to what you need, so you can see at a glance whether your starter was big enough. A litre of 1.036 starter holds about 37 grams of extract and yields roughly 1.4 billion new cells per gram with a stir plate. Without one, reckon on about half; the app assumes a stir plate and says so.
Leave the amount field empty and there is nothing to compare, so the panel answers the other question: how much do you need? For liquid yeast it shows the number of packs to buy, for a starter the number of litres that yields that many cells.
Liquid yeast: cells per pack differ by brand
Liquid yeast is sold by the pack, and packs are not equal. The app uses the brand's own figure: Omega 150 billion, Wyeast and White Labs 100 billion, unknown brands a cautious 100. The advice is therefore given in packs, not grams.
Below 70% of the recommended count the message turns red, between 70 and 90% orange, and above double the app warns about autolysis.
Other ingredients
Add herbs, fruits, spices and finings via the ๐ Other Ingredients card. The database contains ~45 ingredients in categories:
For each ingredient you choose the moment it goes in. The list follows the brew day: mash, sparge water, boil, whirlpool, dry hop, secondary, bottling. Brewing salts that belong in your sparge water are therefore set to Sparge water; on the brew sheet and in the shared text they then appear in that place instead of among the boil additions.
- ๐ Citrus (orange peel, lemon zest)
- ๐ Fruits (raspberries, cherries, mango)
- ๐ฟ Herbs (coriander, ginger, lavender)
- โจ Spices (vanilla, cinnamon, cardamom)
- ๐ง Finings (Irish moss, rice hulls, gelatin)
Each ingredient has a maximum dose per 20L as a reference. Exceeding it triggers a warning.
Mash schedule
Add mash steps with temperature and duration. On brew day these steps appear in the log as individual countdown timers โ start a step and the timer counts down automatically. On completion you get a browser notification (if you granted permission).
Brewbuddy '26 also calculates automatically:
- Grain absorption โ according to your equipment profile
- Pre-boil volume โ mash water + sparge water โ grain absorption โ dead space
- Water/grain ratio โ for mash thickness
Single infusion or step mashing
Below the mash schedule there are two rows of buttons. Quick add puts a single rest into the schedule; Whole schedule replaces the entire schedule in one click.
| Button | Schedule | What for |
|---|---|---|
| ๐ฏ Single infusion 67ยฐC | 67ยฐC ยท 60 min | By far the most used. At 67ยฐC both beta and alpha amylase still work: enough fermentable sugar for a dry beer, enough dextrins for body |
| ๐ฏ Single infusion + mash-out | 67ยฐC ยท 60 min, then 78ยฐC ยท 10 min | Same rest, with an amylase stop. Thins the wort and makes sparging easier |
| ๐งฌ Classic step mash | 52 / 62 / 72 / 78ยฐC | Protein rest and separate amylase rests. Worth it with wheat, rye or poorly modified malt |
For a drier beer go lower โ 64 to 65ยฐC yields more fermentable sugar. For more body mash at 68 to 69ยฐC. The conversion advice below the schedule shows straight away how many minutes that temperature needs as a minimum.
Setting up your own equipment
Every brewing setup evaporates differently. Under Settings โ ๐ง My brewing equipment you enter five values that drive the whole water calculation:
| Setting | Meaning | Default |
|---|---|---|
| Boil-off rate | Litres evaporating per hour | 3.0 L/hour |
| Grain absorption | Liquid retained by the spent grain | 0.8 L/kg |
| Mash thickness | Water per kilo of malt in the mash tun; 0 = all at once (BIAB) | 3.0 L/kg |
| Fixed mash water | Always mash with the same volume? Enter it here; 0 = do not use | 0 L |
| Kettle/trub loss | What stays behind after transfer | 1.5 L |
| Mash tun dead space | Liquid below the false bottom | 0 L |
| Cooling shrinkage | Volume loss from 100 ยฐC to 20 ยฐC | 4% |
Below the mash schedule the recipe editor shows the full water balance: what the grain retains, what boils off (rate ร boil time), kettle loss and shrinkage โ plus the required pre-boil and total water volume. If your mash and sparge water do not match, you see exactly how many litres you are short. The button ๐ง Fill water volumes from my equipment fills mash water, sparge water and boil volume in one go.
If you brew on more than one system โ a club kettle and a smaller rig at home โ store them separately. Enter the values, click ๐พ Save as equipment and give it a name such as Club kettle 190 L. Above the form a dropdown lets you switch between them in one click; every field and the water calculation follow along. Your equipment profiles are included in the backup.
If you always mash with the same volume โ the working capacity of your mash tun, say โ enter it under Fixed mash water. It takes precedence over mash thickness and stays the same whether you use 50 or 60 kilos of malt; the sparge water absorbs the difference. If you work per kilo instead, leave this field at 0.
Sugar and malt extract do not count towards the water calculation. They dissolve, retain no water and usually never enter the mash tun at all. So only the grain determines grain absorption, mash thickness and the water-to-grain ratio. In the right-hand column Total grain and Total sugar are therefore listed separately; the second line appears only when the recipe actually contains sugar or extract.
Mash thickness determines how the total water is split between mashing and sparging. Classic mashing with a sparge sits between 2.5 and 4 litres per kilo; if you brew in one go at full volume without sparging (BIAB), enter 0. This number decides the split entirely: mash thinner than you enter here and you are assigned too little mash water and far too much sparge water. So enter what you actually do.
Stays behind (loss) โ a cooler with a manifold, a separate lauter tun, or any system where you transfer the wort to another kettle. Whatever sits below the false bottom does not come along, so you have to make it up.
Carries over into the kettle โ a single vessel with a pump: Grainfather, Braumeister, Robobrew, Anvil Foundry, Brewzilla. That liquid sits in the very kettle you are about to boil in; you lift out the malt pipe and it comes along. It is not a loss then, just water that is not in your grain bed โ which is exactly why it belongs with your mash water and not with your total.
The default is stays behind, as the app always had it. With an all-in-one system you set it once and it is right from then on.
Do you heat your sparge water in a separate vessel? Then there is a third place where water stays behind: below the tap and around the heating element. Enter it under Hot liquor tank loss. If you heat sparge water in the same kettle, or do not sparge at all, leave it at 0.
The water/grain ratio the app shows with your grain bill is therefore the thickness in the grain bed: mash water minus dead space, divided by your grain. That is the number you mean when you say 2.7 L/kg โ not what you pour into the vessel. With a fixed mash volume no such correction happens, because that number is your vessel's working volume and already includes the dead space.
More than one brewing rig
If you brew at home one week and on a club kettle the next, save both as profiles in your settings. On the recipe you then choose which rig it is written for. Leave that field empty and the recipe calculates with the rig from your settings โ exactly as it always did, so nothing changes for your existing recipes.
That choice drives everything your kettle decides: mash water, sparge water and kettle volume, the water/grist ratio below the malt list โ which subtracts your vessel's dead space โ and the boiling point. That last one shows up in the bitterness: if the profile holds an altitude or a boil temperature of its own, the wort boils cooler, the alpha acids isomerise more slowly and the IBU comes out lower. Screen, recipe list and brew sheet then all say the same number.
The brew log carries the same choice, starting from whatever the recipe said. Brewed somewhere else that day? Switch it over: the mash water, sparge water, kettle volume and bitterness of that one brew are recalculated for that rig straight away โ on the brew sheet you print and in the overview as well. Beside the dropdown you see what comes out.
Couple a different recipe to a brew that already sits on a rig, and the recipe moves to that rig rather than the other way round. On brew day the vessel you are standing at counts, not the one the plan was written for.
Bottling: what actually came out
In the brew day log, under ๐พ Packaging & Carbonation, enter how many bottles you filled and how big they are. If part went into a keg, add that too. The app works out your bottled volume and puts your loss beside it: the difference from the batch size in your recipe, in litres and as a percentage.
The volume in the priming calculation follows along automatically, because that is exactly the beer you are priming. Type a figure there yourself and it stays โ useful if you prime in a bottling bucket and do not bottle everything.
Priming sugar: which kind and how much
The app works out how much sugar you need for the number of COโ volumes you want, allowing for the carbon dioxide already in the beer โ which depends on the temperature the beer last sat at. Hence that temperature field: beer kept at 20 ยฐC holds less COโ of its own than beer that was crashed cold, and so needs more sugar.
There are ten kinds to choose from. Behind each name is the factor: how many times more you need compared with plain table sugar. That factor follows from the fermentable share of the product โ factor = 1 รท fermentable fraction.
- Table sugar (sucrose) โ ร1.00, by definition
- Candi or soft brown sugar โ ร1.03
- Dextrose (glucose monohydrate) โ ร1.11
- Honey and sugar syrup โ ร1.25, both about 80% fermentable
- Belgian candi syrup โ ร1.30 ยท agave syrup โ ร1.32
- DME (dry malt extract) โ ร1.43 ยท maple syrup โ ร1.52
- LME (liquid malt extract) โ ร1.79, because that is DME with roughly 20% water added
What priming sugar does to your beer
That sugar ferments too, and you notice it two ways. It adds alcohol, and the water you dissolve it in dilutes your beer and increases your final volume. Enter that water under Dissolving water next to the sugar type; below the result you then see what it comes to on balance.
The alcohol follows straight from your COโ target, not from the type of sugar. Every molecule of sugar yields four molecules of alcohol and four of COโ โ 184.3 against 176.0 grams by mass. So the same carbonation means the same alcohol, whether you use table sugar or malt extract.
Calculating boil-off instead of measuring it
Once the wort boils the temperature is fixed: all the energy left after heat losses goes into turning water into steam. That costs 2.26 MJ per litre, and that figure is independent of boil time, of how much is in the kettle and of how wide that kettle is. So if you know the power of your element, you do not need to measure.
Under Settings โ ๐ง My brewing equipment, next to Boil-off, enter the power in watts and the percentage of the time the element is actually on during the boil. The app works it out: 1800 W for one hour is 6.48 MJ, divided by 2.26 gives 2.87 litres per hour. Use this puts that value in the field.
Printing a recipe or saving it as PDF
Want the recipe on paper for brew day? Click ๐จ๏ธ Print / PDF in the recipe editor (or top right of the recipe summary in the log). A clean brew sheet opens in plain language with all key figures, water volumes, the mash schedule with tick boxes, grain bill, hop schedule, yeast and blank fields to write down your readings and notes. Choose Save as PDF in the print dialog to keep it instead of printing.
At the bottom are two ruled blocks to write in by hand: Brew day notes with eight lines and Tasting notes with six. They run the full width of the sheet, so a sentence actually fits. The lines are 8 mm apart โ the height of ordinary handwriting โ and a block is never split across a page break.
The brew sheet follows the order in which you work, not the order in which you typed the rows: the grain bill with the heaviest sack first, the hops from first wort through the boil and whirlpool to the dry hop, and the other ingredients from mash to bottling. In the recipe editor the rows stay where you put them โ a row that jumps away while you are adjusting a weight is unworkable.
Sharing your recipe on a forum
A forum post, an e-mail or a chat message does not need a PDF but text you can paste. In the recipe editor click ๐ Copy recipe: the key figures, the grain bill with percentages, the hop schedule, the other ingredients, the yeast, the mash schedule, the fermentation schedule and your notes go to your clipboard as plain text. Paste with Ctrl+V, or โV on a Mac.
The water block and the blank fields are left out. Those are for brew day and tell a reader nothing โ your mash water depends on your equipment, not on the recipe.
Brewing at altitude โ boiling temperature and bitterness
Above sea level water boils below 100 ยฐC. Alpha acids therefore isomerise more slowly and bitterness comes out lower โ a difference that is far from negligible at high altitude. Enter your altitude above sea level under Settings โ ๐ง My brewing equipment; the app calculates the boiling point and corrects every IBU calculation automatically. If you know your actual boiling temperature (measured with a thermometer), enter it under Boiling temperature โ it overrides the altitude calculation. Altitude and boiling temperature belong to the equipment profile: if a recipe has picked a rig of its own, the bitterness is calculated with that rig's boiling point.
| Altitude | Boiling point | IBU for a 60-min boil |
|---|---|---|
| 0 m (sea level) | 100.0 ยฐC | 100% |
| 1000 m | 96.7 ยฐC | โ13% |
| 2000 m (e.g. Mexico City) | 93.4 ยฐC | โ24% |
| 2850 m (Quito) | 90.5 ยฐC | โ32% |
| 3400 m (Cusco) | 88.7 ยฐC | โ35% |
| 3650 m (La Paz) | 87.9 ยฐC | โ37% |
The boiling point follows from the barometric altitude formula combined with the Antoine equation for water; the isomerisation rate from the Arrhenius equation using the constants of Malowicki & Shellhammer (2005). Isomerised hop extract is not corrected โ it is already converted.
Conversion advice โ avoid under-mashing
Below the mash schedule (and next to the timers in the log) an advice box shows the total saccharification time. The app adds up all rests between 60 and 73ยฐC and compares that with the time needed at your highest saccharification temperature for full starch conversion:
| Saccharification temperature | Advised minimum time |
|---|---|
| 70โ73ยฐC (alpha-amylase optimum) | 25 min |
| 67โ69ยฐC | 35 min |
| 64โ66ยฐC | 45 min |
| 62โ63ยฐC | 60 min |
| 60โ61ยฐC (beta only, effectively) | 90 min |
Adjust one step and the advice recalculates instantly, showing how many minutes you are short. This prevents incomplete conversion and lower efficiency.
Calculations & calc panel
All calculations update live. The calc panel (right side of the recipe editor) shows:
| Value | Explanation |
|---|---|
| OG | Original gravity |
| FG | Final gravity (based on attenuation) |
| ABV | Alcohol percentage |
| IBU | Bitterness (Tinseth or Rager) |
| EBC | Colour (Morey formula) |
| Pre-boil SG | Expected gravity before the boil |
| BU:GU | Bitterness/gravity ratio |
| Pitching rate | Yeast dose per litre, with advice |
| Cost | Calculated from your prices |
Enter your own purchase prices on the Ingredients tab, in the Price column next to each ingredient (malt โฌ/kg, hops โฌ/100 g, yeast โฌ/gram, other ingredients โฌ/100 g or per piece). Leave a field empty and the app uses the default price shown in grey. Changes are saved immediately; โบ Default prices resets a whole category.
Click Show cost breakdown per ingredient below the cost figure to see how it is built up: per ingredient the name with its cost, and underneath the arithmetic (for example 5 kg ร โฌ 2.35/kg). The total is at the bottom. Ingredients without a known price are shown in orange and count as โฌ 0 โ the cost is then too low.
Where your original gravity comes from
Under Original gravity (OG) in the calculation panel there is a fold-out: Show gravity breakdown per ingredient. It works like the cost breakdown, but in gravity points.
The grain bill is one line, with the total grain weight and the efficiency used. Per malt the contribution is already in the malt table itself; repeating it here would make the list long without adding anything. Sugar and malt extract each get their own line, because that is usually the question: which part of my gravity does not come from the grain. Behind each line a bar shows its share as a percentage.
The total is at the bottom, and it is exactly the figure shown above it. Late additions โ sugar during fermentation, priming sugar โ sit below in grey with their moment, and do not count towards that total: they are not in your wort yet when you measure the OG. What they would add together is stated as well, because that is the figure the alcohol calculation uses.
The lines are rounded so that they visibly add up to the total, and the percentages to a hundred. Round each line on its own and two of them may go up, leaving the sum a thousandth off โ you then read 0.058 + 0.011 with 1.068 below it. The app therefore distributes first and rounds after, as in apportioning seats: no line is ever more than one thousandth away from its own value.
Excise duty (theoretical)
Below the cost figure the app shows what Dutch beer excise duty would be owed if you sold this beer commercially. You get two amounts: the standard rate, which applies to breweries producing more than 200,000 hl per year, and the reduced rate for independent breweries up to 200,000 hl per year. Both are charged per hectolitre per percent alcohol by volume, with the same minimum amount per hectolitre for either: on light beers that minimum applies rather than the alcohol content. The rates come from the Dutch customs excise tariff list. If you brew at home for your own use you are exempt and owe nothing; the amounts are shown for information.
Timers
Besides the mash steps the log has two timers: a boil timer and a stopwatch. The boil timer counts down: enter the number of minutes and click โถ Start. Link a recipe and its boil time is already filled in. At zero you get the same alarm as a mash step โ sound that repeats until you acknowledge it, a vibration on Android and a browser notification. You may still change the time while boiling; the elapsed time is kept.
The log has three general timers โ Mash, Boil and Stopwatch โ and alongside them the mash step timers from your recipe. If the recipe has no mash schedule, the four default steps are ready: protein rest 52ยฐC/15 min, beta amylase 62ยฐC/45 min, alpha amylase 72ยฐC/20 min and mash-out 78ยฐC/10 min. Click โถ Start on a step to start its countdown; adjust each step's duration directly in the table โ even while the timer is running.
When a step finishes you get an audible alert (three beeps, repeated every 5 seconds until acknowledged), a pulsing green banner in the log, a flashing row in the step table and โ on Android โ a vibration. Click โ Got it to stop the alarm. Sound is enabled the moment you press โถ Start, because browsers (especially on iPhone) only allow audio after a user action.
Gravity readings & fermentation progress
Record gravity readings per phase (pre-boil, OG, primary fermentation, FG). Enter the temperature too โ Brewbuddy '26 automatically shows the reading corrected to 20ยฐC. That applies to every temperature except 20ยฐC itself, including 0ยฐC: measure the FG of a beer that has been cold-crashed and your hydrometer reads almost two points high.
Leave the Date & time field empty for a reading you are taking right now. Fill it in and you add an older reading afterwards โ useful when moving a logbook over from another program. The reading then takes its own place in time rather than going to the bottom of the list: fermentation progress reads the most recent measurement, and that should be the last one.
Once you have an OG reading and a later reading, a fermentation progress bar appears with the current attenuation percentage and current ABV.
Carbonation
The carbonation calculator is at the bottom of the log. Enter: desired COโ volumes, beer temperature at bottling and beer volume. Brewbuddy '26 calculates how many grams of sugar (or honey, DME) you need.
Water
The pH of your source water belongs to your tap, so it is stored: it goes into your water settings and into a profile you save yourself. Pick that profile later and your measured pH is back. The built-in profiles โ Pilsen, Burton, Dublin โ do not have one: those are ion profiles, not water samples, so they leave your measurement alone.
The water tab lets you enter your source water profile and choose a target profile. Brewbuddy '26 calculates which minerals to add (gypsum, calcium chloride, Epsom salt, sodium and magnesium salts).
Entering and saving your own water
You are not limited to the built-in profiles: simply type the values of your own tap water into the six ion fields. Then click ๐พ Save as profile and give it a name โ it appears at the top of the list under "๐งโ๐ณ My own water" and can be recalled with one click, also as target water. Use ๐๏ธ to delete one. Your profiles are included in backups and the JSON export.
For brewers using RO or distilled water there are two salt-free starting profiles: Demineralised / RO water (all ions zero) and Rainwater. Ideal as a base to build up with salts yourself.
Copying your water treatment into the recipe
The water tab does the maths, the recipe keeps the result. As long as your salt additions live only on the water tab, they are not on your brew sheet, not on your shopping list and not in your cost price โ and there is only one water tab, while you may have ten recipes.
So link a recipe and click ๐ Copy into <name> below the analysis. The button puts into that recipe:
- the mash and sparge water as entered here;
- every salt and acid addition that is not zero, as a row under Other ingredients, timed Mash or Sparge water;
- which water it is: the source profile name, the dilution percentage and the six ion values. These appear at the top of the water block on the brew sheet, so the paper says whether you are brewing with tap water, RO water or a blend.
The brewing salts are ordinary database ingredients, under the group ๐ง Brewing salts. They therefore count towards the shopping list and the cost price, and you can enter your own purchase price for them on the Ingredients tab.
Lactic acid carries its strength in the name, because one millilitre of 80% is not the same as one millilitre of 88%. Dilute to, say, 30% yourself and that percentage appears in the name, with the ingredient marked by an asterisk in the picker.
Which acid should you use?
| Acid | Strength | What else it does |
|---|---|---|
| Lactic acid 80% | 10.5 mEq/mL | What is normally sold in the Netherlands and Belgium. Above ~400 mg/L in the beer it becomes noticeable as a slight tartness |
| Lactic acid 88% | 11.8 mEq/mL | The American standard, and what most English-language literature assumes. Same acid, 12% stronger per mL |
| Phosphoric acid 75% | 12.1 mEq/mL | Flavour-neutral โ phosphate largely precipitates with calcium in the mash. Same dose in mL as lactic acid |
| Hydrochloric acid 10% | 2.88 mEq/mL | Adds chloride, which accentuates maltiness. Needs over four times the volume |
Lactic and 75% phosphoric acid are almost equally strong: where you need 3 mL of lactic, roughly the same amount of phosphoric does the job. The difference is flavour. If you have to acidify heavily โ soft water with a lot of dark malt, or a pale lager with hard water โ phosphoric acid keeps you below the taste threshold.
Diluting it yourself โ usually a good idea
Concentrated lactic acid is corrosive, and on a 20-litre batch you only dose a few millilitres of it. One drop too many is already 10% of your addition. Many brewers therefore dilute to, say, 30% first: you work in whole millilitres instead of tenths, and less can go wrong if you spill.
Simply enter your own percentage in the strength field. The app derives the solution's density from a measurement table and calculates the strength from that, so 30% is just as accurate as 80%. For orientation: 80% โ 10.5 mEq/mL, 50% โ 6.2, 30% โ 3.6, 10% โ 1.1.
Not sure it worked out? Measure it
Under Tools you will find ๐งช Measure lactic acid strength. Enter your refractometer or hydrometer reading there and you get the mass percentage back, with a button to put it straight into the water tab.
The hydrometer is the more accurate: for that the app simply reads the same density table backwards. It does need a full trial jar of your acid.
The refractometer needs only two drops, but the Brix scale is calibrated for sugar, not lactic acid. The app therefore converts in two steps: from Brix to refractive index via the sugar scale, and from refractive index to mass percentage via a straight line between water and pure lactic acid. Expect roughly one percentage point of uncertainty โ plenty good enough, because the alternative is guessing and that easily costs ten percent.
Either way, measure at 20 ยฐC, because that is the temperature both tables are based on.
Diluting tap water with RO or distilled water
With hard water and a pale lager in mind, diluting is often easier than acidifying. Under Dilute with RO/distilled water enter what part of your total water is RO โ as a percentage or in litres, whichever suits you. The other field follows.
Dilution is linear: one part tap water to one part RO halves every ion. Nothing reacts and nothing precipitates; it is the same amount of dissolved matter in more water. RO, deionised and distilled water count as zero here; in practice RO retains a few mg/L, and that disappears against the uncertainty in your own water report.
Everything that follows from your water uses the diluted figures: the ion overview, residual alkalinity, mash pH and sparge pH. The salts you add come on top of the diluted water, which is right โ you dissolve them in the mixture.
Letting the app work out the salts for your target
Above the salt table sits โ๏ธ Calculate salts for target profile. It looks at your source water โ after dilution โ and at the target profile you picked, and fills in the six brewing salts that get you closest. Below it you see, per ion, where you end up against where you were heading.
Calcium chloride comes as granules or as a liquid 36% solution. Next to the button there is I use liquid calcium chloride (36%): tick it and the button works in millilitres and leaves the granule field alone. The tick belongs to your brewery and is stored with your water settings. Both forms deliver the same ions โ the app swaps the salt inside the calculation itself, so calcium and chloride both come out right, not just one of them.
The mash and sparge additions get the same concentration, so different weights: you treat your water, not your mash. Clear salts puts everything back to zero.
If the calculation picks chalk, the app warns about it. Chalk is the only way to add bicarbonate without sodium, but it only half dissolves in the mash โ expect less effect than shown, or use baking soda and accept the extra sodium.
It is a least-squares calculation: six salts, six ions, and the condition that an amount can never be negative. A perfect hit is usually impossible โ gypsum brings calcium and sulphate in a fixed ratio, so if your target does not have that ratio it becomes a compromise. That is why the deviation per ion is stated.
Your sparge water pH
That is a different question from mash pH. There your grain bill decides; here it is the water itself. Sparge water that is too alkaline draws tannins from the husks in the last runnings, which you taste as dry astringency. The rule of thumb: stay below pH 6.
Enter the pH of your source water with your water report. Without that measurement the app does not calculate this, deliberately so: how much carbon dioxide sits in your tap water depends on your plumbing and your tap, and cannot be derived from the rest of the analysis. Pretending your water is in equilibrium with the air gives a pH that is far off.
The method is the carbonate equilibrium: pH = 6.38 + log(HCOโโป / COโ). Acid converts bicarbonate into carbon dioxide โ mole for mole off the one and onto the other. Your measured source pH fixes the starting point, so the carbon dioxide content does not have to be guessed.
Demineralised, RO and distilled water
Brew with water that carries no bicarbonate and there is no buffer. The carbonate equilibrium above does not apply: your sparge water pH is simply the pH you measure, and adding more water does not change it.
That is also the answer to whether you should acidify: no. Demineralised and RO water sit at around pH 6 already, below the point where tannin extraction starts, and there is nothing to buffer away. The app says there is no buffer and leaves out the acid advice.
[Hโบ] = โ(Ka ร C) for lactic acid (pKa 3.86). With phosphoric acid the result is lower still.Mash pH โ link your recipe first
Mash pH depends mostly on your grain bill: dark and caramel malts are acidic, base malt much less so. So pick a recipe at the top of the water tab under Link recipe. The app takes over the mash water volume and calculates pH from that specific grain bill. Without a linked recipe it deliberately shows a dash instead of a misleading number.
The model uses each malt's pH in distilled water and its buffering capacity per kilo. Your water's alkalinity pushes that pH up, acid pushes it down โ and every extra millilitre of acid keeps working, even after all bicarbonate has been neutralised. When pH is too high the app shows roughly how many millilitres of lactic acid you need, using the strength you selected in the salts table.
Granules or liquid? Mind the unit
Calcium chloride comes in two forms, and they are certainly not interchangeable. The granules you buy as a powder are the dihydrate CaClโยท2HโO: one gram delivers 273 mg of calcium. The liquid 36% solution is entered in millilitres: one millilitre delivers 176 mg of calcium and 312 mg of chloride.
The salts table therefore has two separate rows. Enter the liquid on Calcium chloride 36% liquid (ml), not on the granules row above it.
The arithmetic behind it: the 36% solution has a density of about 1.35 g/mL, so one millilitre contains 0.486 grams of anhydrous CaClโ. Of that, 36.1% is calcium and 63.9% chloride. Those figures match what the manufacturer prints on the bottle: 1 mL per 10 litres gives 17.6 mg/L of calcium and 31.2 mg/L of chloride.
Metabisulfite-based antioxidants
Products such as Antioxin SBT, or plain potassium metabisulfite, scavenge oxygen and keep your beer fresh for longer. They do one thing that is easy to overlook: the sulfite largely oxidises to sulfate, which shifts your water profile. In a soft-water pilsner a single dose can treble the sulfate level and push the chloride-to-sulfate balance from round to dry and bitter.
So fill in the Antioxidant (metabisulfite) row in the salts table: the number of grams, and below it the percentage of potassium metabisulfite printed on the packaging. That way the field works for any brand. Antioxin SBT contains 45%, Antioxin SB 46.8%, plain KMS 100%.
| Product | Dose | Extra sulfate |
|---|---|---|
| Antioxin SBT | 0.5 g per 10 L | about 17 ppm |
| Antioxin SBT | 1.0 g per 10 L | about 34 ppm |
| Potassium metabisulfite | 1.0 g per 10 L | about 75 ppm |
The arithmetic. Potassium metabisulfite (KโSโOโ , 222.31 g/mol) yields two sulfur atoms per molecule and therefore two sulfate ions of 96.06 g/mol. Complete conversion would give 0.864 grams of sulfate per gram. It never gets that far: some sulfite binds to carbonyls and some escapes with the COโ. The app therefore uses the practical factor of 0.87 common in winemaking โ 0.752 grams of sulfate per gram of metabisulfite. Treat it as an order of magnitude, not as two decimals.
Two things the app deliberately ignores. Potassium is not tracked: it appears in none of the target profiles and has no flavour threshold at the levels reachable here. And the ascorbic acid often present in these products is indeed an acid, but its effect on mash pH stays below 0.05 โ smaller than the uncertainty of the pH model itself.
Acidifying with acidulated malt instead of an acid dose
Acidulated malt โ Sauermalz โ is ordinary base malt that has been soured with lactic acid bacteria. You weigh it out like any other ingredient and it lowers the mash pH without you having to reach for a pipette.
Add it in the recipe editor's malt section; it sits in the dropdown under the group ๐ Acidulated malt. Enter the weight and you are done: as soon as the recipe is linked in the water tab, the acidification is included in the mash pH shown there. Below the pH the app reports exactly how much acid the malt contributes and how many millilitres of lactic acid that equals.
| Share of acidulated malt | Effect on mash pH |
|---|---|
| 1% of the grist | about 0.1 lower |
| 2% | about 0.2 lower |
| 3% | about 0.3 lower |
This is Weyermann's rule of thumb, and the app works to the same order of magnitude. The arithmetic behind it: at pH 5.45 acidulated malt has an effective lactic acid content of roughly 3.13%, so one kilo delivers 31.3 grams of lactic acid. Divided by the molar mass of 90.08 g/mol that is 347 mEq of acid per kilo โ the same unit the app uses for an acid dose. A hundred grams of acidulated malt therefore equals about 3 mL of 88% lactic acid.
Stay below 5% of the grist; above 10% the app warns you, because the beer turns noticeably tart. For styles that want exactly that, such as Berliner Weisse or Gose, you can go higher. In extract and colour acidulated malt behaves like pilsner malt, so your OG and EBC barely change.
Built-in target profiles: Pilsen, Burton, Dublin, Vienna, Munich, Dortmund and Soft Water.
Inventory
Track how much malt, hops, yeast and other ingredients you have in stock. Four buttons sit at the top: ๐พ Malt & Grains, ๐ฟ Hops, ๐งซ Yeast and ๐ง Other ingredients. For malt and hops the figure turns red once you drop below the threshold; yeast is counted in packets.
Other ingredients carry the unit that belongs to them: grams for coriander, millilitres for lactic acid, pieces for an oak spiral. There is deliberately no "nearly out" threshold โ one threshold for a category mixing grams of spice with litres of acid is an invented number. Whatever you are short of for the recipes you want to brew appears on the shopping list, which is where it belongs.
Yeast counts in sachets by default, but you can switch that to grams per yeast. That is there for anyone who buys a 500 gram brick: a sachet cannot be split, a brick can, and then you want to count in grams. Next to the stock field are a dropdown for the unit and a field for the weight of one package โ a sachet of dry yeast is 11.5 g, a pack of liquid yeast about 100 g, your brick 500 g.
Switch a yeast over and the app converts your stock on the spot and says what it did: three sachets of 11.5 grams become 34.5 grams. Nothing changes behind your back, and the choice applies to that yeast only โ most brewers have both sachets and bricks in the fridge. Changing the package weight leaves your stock alone; there is not suddenly more or less, only one package weighs differently.
Your shopping list, your cost price and the raw material ledger in the excise module all follow that choice. If a yeast counts in sachets, a recipe calling for 23 grams is rounded up to two sachets: half a sachet does not exist in the shop. If it counts in grams, 23 grams is simply 23 grams, and 477 grams are left in your brick.
Customs and excise duty
This module is off by default and you will find it under โ๏ธ Settings โ ๐ Customs and excise duty. If you brew at home for your own use, leave it off: own use is exempt and there is nothing to declare. If you hold a licence โ a tax warehouse, or the equivalent in your country โ a ๐ Excise tab appears with three panels.
The three balances
An inspection comes down to three sums that each have to balance on their own:
| Balance | What has to add up |
|---|---|
| Raw materials | opening stocktake + purchases โ use โ write-offs = closing stock |
| Volume | litres brewed = packaged + loss + destroyed |
| Excise duty | litres released ร rate = amount payable |
What does not add up is kilos of malt against litres of beer: that depends on your efficiency and is not a checkable identity. Anyone offering it as proof proves nothing. The three balances above do add up, each on its own, and together they account for the chain from raw material to duty paid.
Switching it on
When you switch the module on, the app writes an opening stocktake dated today for every raw material you hold stock of. That is your zero point: without it your first purchase would become the entire balance, since the ledger would have no opening figure. Switching it off erases nothing โ your ledger stays, and only the inventory screen goes back to reading the loose number.
Raw material ledger
The ledger consists of entries, not balances. Every entry carries a date, a kind and a quantity, and that quantity is always positive: the kind determines the direction.
| Kind | What it does |
|---|---|
| Stocktake | sets the balance to what you counted; everything before it no longer counts |
| Purchase | adds, with supplier and amount |
| Use | subtracts, with the batch number it went to |
| Write-off | subtracts without beer having been made of it โ spoiled, spilled, discarded |
Entries are added up by date. If you record two things on the same day, the order in which you enter them counts: a stocktake you enter after a use on that same day also counts after that use. That is how you write it down and therefore how you mean it.
When you create a brew, the whole grain bill goes into the ledger automatically as use, on the brew date and with the batch number attached. That way every kilo of malt can be traced to the batch it disappeared into. The units are the same as on the inventory screen: malt and hops in grams, yeast in sachets or grams as you choose, other ingredients in their own unit.
If you adjust something in the log on brew day โ a weight, an extra addition, an ingredient removed, a different yeast quantity โ the use is recorded again. So the ledger holds what actually went into the kettle, not what you intended. Change the batch number and it moves along to the ledger entries; link a different recipe to the brew and that grain bill replaces the old one.
If you switch the module on with a log already full of brews, the grain bill of all of those brews goes into the ledger too, each on its own brew date. Your balance does not change because of it: those entries sit before your opening stocktake, and a stocktake sets the balance. What you do get is traceability across your existing batches โ exactly the column a raw material inspection looks at.
Reading an order or invoice
Purchases are the one thing the app cannot derive from your own data: your order confirmation is nowhere in BROUWHULP '26. To save you retyping it line by line, there is a paste box below the raw material ledger. Open your supplier's invoice, select the text and paste it in; the app finds the article lines and proposes purchase entries. Headers, shipping costs, subtotals and VAT are skipped.
Why pasting rather than dragging in a PDF: reading a PDF properly takes a library of about a megabyte, and even then it cannot read a scanned invoice. This app has no dependencies at all and that is its strongest security argument. Selecting text is something anyone can do, in any reader, including on a phone โ and it works with every supplier.
If the amounts are not on the same line as the description, the app takes them from the lines below. Text from a PDF rarely comes out one table row at a time: often each column lands on its own line, or the whole column row runs together as 18568 1.00 63.99 63.99 1 โ article number, quantity, unit price, total, line number. The last amount is the line total. The quantity comes from the column written as "1.00" that is not the last amount; if there is none, from the last whole number that can pass for a quantity. A number above a thousand is an article number, not an order.
Below the paste box is ๐งพ Recorded invoices: every invoice you have processed, newest first, with date, invoice number, supplier, the number of recorded lines and the amount. That tells you at a glance whether you have already entered an invoice. The amount is the sum of the lines you recorded and therefore not necessarily the invoice total: lines you unticked or could not link are not in it. That is why the line count sits next to it. Click an invoice to unfold it: you then see the lines it contains, each with the raw material, the quantity and the amount. If the amount does not match the invoice, this is where you see the difference. A raw material that appears twice on one invoice is flagged โ that is nearly always the invoice read in twice rather than two lines on the paper. The same goes for an invoice number that appears on more than one date for the same supplier: the invoice was recorded twice, or once with the wrong date. The bin behind a line removes that one line; Delete whole invoice takes the whole invoice back out, stock effect included. Consumption from a brew stays put: that does not belong to an invoice.
Entering a brew retroactively
If you switch the customs module on after years of brewing, you will want your old brew days in it after all. You can. Create the brew as usual and then set the brew date in the log back to the day you actually brewed; the grain bill moves along with it in the raw-material ledger. The release date is entered separately with the release, so a beer brewed in March and released in May lands in the right period on both counts.
Your shop calls it something else than the app does
An invoice may say Aroma mout type Amber 50 EBC while the malt list calls that same malt Aroma Amber 50 EBC from Dingemans. It goes like that with nearly every supplier: the maltster gives a name, the shop wraps its own description around it, and you end up hunting for something that is there but under a different name.
So every ingredient carries a set of alternative spellings alongside its name. You will find the Aroma Amber on "amber", on "aromatic amber" and on the description from your invoice. The same applies to the search box on the Ingredients tab. The names themselves do not change: your recipes, prices, stock and raw-material ledger all hang on them.
The invoice reader uses it too. Read in an invoice with an article you have never linked, and the app fills in a proposal marked guessed from the description โ check that this is right. That is deliberately something other than linked before: the latter is your own choice from a previous time, and it always takes precedence.
Above every dropdown there is a search box. The list holds over sixty malts and is sorted alphabetically, not by supplier โ Weyermann dark wheat malt therefore sits under T, between Special B and Roasted Wheat Malt, and not next to the other Weyermann malts. Type "weyermann" and only those remain; type "dark wheat" or "weizenmalz dunkel" and one remains. The box looks at the same text as the search box on the Ingredients tab, so it sees the alternative spellings too. Beside it you see how many entries are left out of how many.
For a yeast the Quantity column holds a dropdown rather than a fixed label: that is where you switch between sachets and grams on the spot. Choose grams and the weight printed on the invoice immediately becomes that yeast's package weight โ you just bought that box, after all. As long as you count in sachets and the invoice names a different package size than you have set, the app says so: "1 sachet" does not match a 500 gram box.
Per line you choose the category and the ingredient. The quantity follows from the count times the package size, converted to the unit your inventory screen uses: two 25 kg sacks become 50,000 grams, and yeast counts in the unit you chose for that yeast. If the invoice unit does not match the ingredient's โ kilos on something measured in millilitres โ the field stays empty and the app says you have to fill it in yourself. A wrong figure is worse here than an empty field.
The price per unit is worked out from the line total, in the unit your price table uses, and goes into that table if you leave the tick box on. Your cost price then uses what you actually paid rather than the default price. Correct the quantity and the price moves with it: the line total is fixed, so less delivered means more per kilo.
The invoice date is required and is not silently set to today. It is the date printed on the invoice: that puts your purchase in the right period. An invoice from last month recorded on today's date gives a balance that adds up, but on the wrong day.
Packaging and release
One entry per time beer leaves the tank. That is not always once per brew: part into kegs today, the rest into bottles next week, with two different dates and possibly two destinations.
If you have already recorded in the brew day log how many bottles you filled, how big they are and how much went into kegs, ๐ Copy from log brings that over. The bottles go onto the packaging type with the same capacity, and the keg volume onto the largest keg size it divides into as a whole number. If something does not fit โ a bottle size you have not set up, or a number of litres that does not come out as a whole number of kegs โ the app says so rather than guessing; a wrong count is worse than an empty field. Recording it is up to you: a release is the moment duty becomes payable, and deriving that from a bottle counter would produce declarations you never made.
Below the dropdown is what the app knows about this brew: the batch number, the brew date, the OG and FG with the alcohol percentage that follows from them, and how many litres were brewed, have already been released and are still open. If you recorded an OG and an FG in the log, it says Measured and the duty is calculated from your hydrometer โ including temperature correction, because an FG straight from the cold store reads almost two points high and that is a quarter of a percent of alcohol. If nothing was measured, it says From the recipe and you know your declaration rests on a prediction.
The alcohol percentage and the Plato figure are ordinary input fields: overwrite them with what you measured yourself. Pick a different brew and they are refreshed โ they are figures belonging to that beer. Stay on the same brew and what you typed stays; โบ From brew fetches the figures again anyway.
The release date is separate from your brew date, because duty becomes payable on release. A December brew that you release in January belongs in the January period. Loss and destruction go in separately: they do leave the tank but not as beer out of the door, so they do not count towards the amount โ they do count in the volume balance.
Below the form is the summary per period with a This quarter button, and below that the volume balance per brew: what went in against what has gone out, with half a percent of slack. A brew that does not balance is shown in colour. Under each batch number is the grain bill it consumed, read straight from the raw material ledger โ so per batch you see in one line what went in and what came out. If it warns that no use is recorded in the ledger, that batch was never written off and your raw material balance does not add up. ๐จ๏ธ Print turns it into a page you can file with your records.
Scheme, packaging and destinations
By default the app uses the Dutch scheme. If you live or brew elsewhere, choose the calculation model your law uses โ excise systems differ not only in the amounts but in the way they calculate:
| Model | How it calculates | Used by |
|---|---|---|
| Per hl per %vol | rate ร alcohol percentage, with a minimum per hectolitre | Netherlands |
| Per hl per ยฐPlato | rate ร degrees Plato, with a minimum per hectolitre | Belgium |
| Per litre of pure alcohol | rate ร the alcohol contained in the beer; no minimum | United Kingdom |
| Band rates | a fixed amount per hectolitre per strength band | Germany |
The rates sit in a table with a start date. The most recent row that has already come into force wins, so a rate change is one row added and changes nothing about what has already been recorded. Within a row are the categories a brewery can fall into; in the Netherlands those are normaal and verlaagd. Which one applies to you is set under My category.
For band rates you state what your bands are based on โ degrees Plato or alcohol by volume โ and you leave the upper limit of the last band empty: it applies to everything above.
Under packaging types you enter the forms you package into with their capacity in litres: a 33 cl longneck is 0.33 and a 20 L keg is 20. The litres on your release entry follow from that. A packaging type that appears in a recorded release cannot be deleted; that release would retroactively become zero litres.
Under destinations you record where the beer goes and whether duty is payable on it. A destination you untick โ storage under suspension, export โ counts in your volume balance but not in the amount. If you pick no destination, the app assumes duty is payable; that is the safe side.
Incidents: breakage, leakage, samples and discarded batches
The volume balance puts what you brewed next to what you released. In practice that never quite adds up, and the reason is rarely an accounting one: a bottle falls off the table, a keg starts leaking, three bottles go to the judging panel, a batch turns out to be infected and goes down the drain. Without those entries no balance ever closes, and a balance that never closes is a check nobody reads any more.
Below the release form you will therefore find the 🩹 Incidents card. You enter a date, pick a type โ breakage, leakage, sample, destroyed or other โ pick the batch, enter the number of litres and write one line about what happened and where your evidence is. After recording, the date, type and batch stay put, so you can book a few more straight after.
Those litres appear as their own Explained column in the volume balance and are subtracted from the difference. What remains is the genuinely unexplained part โ the figure you need to have an answer for. The period overview gains a line with the total and the breakdown per type, because in an audit four litres of samples is a different story from four litres of breakage.
If you cannot attribute an incident to a batch โ a bottle from the shelves you can no longer place โ leave the batch empty. The entry then counts towards the period but towards no volume balance.
Tools
| Tool | Use |
|---|---|
| SG โ Plato/Brix | Conversion between units |
| Refractometer | Correct the refractometer reading during fermentation (Sean Terrill) |
| Hydrometer temperature correction | Correct a reading taken at non-20ยฐC temperature (Kell/NIST) |
| Yeast starter | Calculate sugar/DME for a given starter volume and gravity |
| Raise gravity | How much sucrose/dextrose for a higher OG |
| Dilution | What happens to the gravity when you dilute with water |
Each tool in the app carries a short explanation of what it does and what to enter. The fields with an orange border are results, not something you fill in yourself โ the answer appears there once your input is complete.
Shopping
On the ๐ Shopping tab you pick which recipes you want to brew and how often. The app adds up every ingredient, subtracts your stock and shows per line what you still need to buy, with estimated costs based on your own prices. A green tick means you already have enough.
An orange question mark in the cost column means no price is known for that ingredient yet. Enter it on the Ingredients tab, Price column.
A price of 0 is allowed and counts normally: hops you grew yourself, or yeast harvested from an earlier brew, genuinely cost nothing. That is different from an empty cell, which means nothing has been entered yet and keeps the question mark.
๐จ๏ธ Print / PDF turns it into a list to take to the shop: a tick box per ingredient, the amount to buy, and beside it in smaller type what you need and what you already have. The largest quantity comes first, so the heavy sacks stand out straight away. Anything you have enough of is left out of the buying list but listed at the bottom, so you can see it was not forgotten. Choose Save as PDF in the print dialog to carry it on your phone.
Fermentation profile
In the recipe editor, under ๐ง Fermentation profile, you can build a schedule: primary, diacetyl rest, dry hop, cold crash, lagering. Each step gets a temperature and a number of days. On brew day the log converts this into real dates and shows which step is running and when the next one is due. You can adjust the start date in the log if you started later than the brew day.
Next to the temperature there is a second field for an end temperature. Leave it empty and the whole step runs at one temperature. Fill it in and the step becomes a ramp: you move from one temperature to the other over the given number of days. That is how you record a diacetyl rest as 18 โ 22 ยฐC over three days, or a cold crash as 20 โ 2 ยฐC over two. The ramp shows with an arrow in the log and in the text you share with ๐ Copy recipe.
Yeast pitching and starter
Under Tools, Yeast pitching & starter calculates how many yeast cells you need and how many you actually have. The beer type is a choice between ale and lager; the surcharge for strong beer follows from the OG you enter above. It uses 0.75 million cells per mL per ยฐP for ales and 1.5 for lagers, with a third on top from OG 1.061 (White & Zainasheff), 20 billion viable cells per gram of dry yeast and 100 billion per liquid pack. Liquid yeast loses about 0.7 % viability per day; dry yeast much less.
Measured attenuation
Enter a Final gravity (FG) alongside your OG and the app works back what your yeast actually did, setting it next to the percentage the recipe assumed. Both readings are corrected to 20 ยฐC first, so an FG taken straight from the fridge does not count too high.
This is apparent attenuation: (OG โ FG) divided by (OG โ 1). That is the figure on a yeast data sheet and the one the attenuation field in your recipe works with. Real attenuation runs some five points lower because alcohol is lighter than water and fools your hydrometer; it would not be comparable with what you entered.
Measured efficiency
As soon as you log an OG reading, the app works backwards to your actual brewhouse efficiency and compares it with the figure you designed the recipe with. The overview shows the average across all your batches.
Duplicating a recipe
If you want to vary on a recipe that already works โ a stronger version, a different hop, a trial batch at half scale โ there is no need to retype anything. There are two ways, and the difference is when you decide.
From the recipe list, click ๐ Duplicate on the recipe card. You give it a name and the copy appears right below the original, ready to be changed.
From the recipe editor, use ๐ Save as new recipe. Handy when you are already tinkering and realise halfway through that this should really become a separate recipe: your changes travel to the copy and the original stays as it was.
The copy is fully independent: change a malt weight or a mash step in it and nothing happens to the recipe it came from. The version history deliberately does not travel along โ a copy is a new recipe and starts with a clean slate.
If the suggested name already exists, the app counts on: Tripel (kopie), Tripel (kopie 2), and so on. Duplicating a copy does not stack the suffix.
Version history
Every time you save an existing recipe with changes, the previous version is kept along with the date and a note you can write yourself. โบ Restore brings an earlier version back; the current state is saved first, so restoring is reversible. Up to 20 versions are kept per recipe.
You find it at the bottom of the editor, just above the button bar, in a card that starts collapsed. Click ๐ Version history to fold it open; beside it stands how many versions are kept. The field What are you changing? belongs to the save you are about to make, not to a previous one โ fill it in before you press Save. Leave it empty and the version is simply kept without a note.
Security
Brewbuddy '26 runs entirely on your own device. There is no account, no server storing your data and no connection to other websites โ apart from the version check, which only fetches a version number.
Files from other people
The one real risk is a file from someone else: a BeerXML recipe or a JSON backup you import. The app assumes such a file may be malicious. All names and text are neutralised before they reach the screen, keys that could alter the app's behaviour are stripped, and limits apply to file size, number of recipes and length of names.
What the app does not do
- Send data anywhere โ the page's security policy blocks connections to other domains
- Execute code that comes from a file
- Load scripts, fonts or images from other websites
- Use cookies, tracking or advertising
Your data lives in the browser storage of this one device. Anyone with physical access to your unlocked device can read it; encryption would not change that as long as the key sits in the same browser. So do not keep sensitive information in the notes fields.
Installing updates
If you use the online version, the app checks by itself whether something newer exists each time you open it. If so, a bar appears at the top with the new version number and what changed, plus a button to update straight away. Your recipes and batches stay put โ they live in your browser's storage, not in the file.
You can dismiss the bar with Later. It returns the next time you open the app, until you update.
Use the ๐ Update button next to the version number in the header, or go to Settings โ Version & Updates โ Force update to clear the cache and fetch the latest version.
Formulas & Calculations
Gravity (OG/FG)
totPoints = ฮฃ(kg ร points ร factor) where factor = efficiency/100 for malt and 1.0 for sugar/extract. Then OG = 1 + (totPoints / volume) / 1000.
Alcohol (ABV)
ABV = 76.08 ร (OGโFG) / (1.775โOG) ร (FG/0.794) โ more accurate than the simple (OGโFG)ร131.25, especially for strong beers. Simple sugars (sucrose, candi) count as fully fermentable in the FG calculation.
Bitterness (IBU โ Tinseth)
bigness = 1.65 ร 0.000125^(boilSGโ1), where boilSG is the average of pre-boil and final gravityBTF = (1 โ e^(โ0.04 ร T)) / 4.15IBU = (AA/100) ร weight ร bigness ร BTF ร 1000 / batch volume- Whirlpool hops use stand temperature and time:
U = 0.12 ร isoFactor(T)^0.4 ร (1 โ e^(โt/20)), where isoFactor is the Arrhenius ratio relative to 100 ยฐC. Dry hops contribute no IBU. - You pick the method under Settings, and that choice applies app-wide. Switch it and the bitterness figures of your recipes and your brews move together: the overview and the graph recalculate on every view, so they never show a number from an earlier calculation.
Colour (EBC โ Morey)
MCU = ฮฃ(kg / 0.4536 ร ebc / 1.97) / (vol / 3.785), then SRM = 1.4922 ร MCU^0.6859, then EBC = SRM ร 1.97.
Mash pH
pH = pH_DI + (alkalinity โ acidMaltMeq) / ฮฃ(kg ร buffer), where pH_DI is the buffer-weighted average of the pH each malt gives in distilled water. Acidulated malt counts as negative alkalinity: 347 mEq per kg, from 3.13% lactic acid divided by the molar mass of 90.08 g/mol.
Gravity temperature correction (Kell/NIST)
SG_corr = SG_meas ร ฯ(20ยฐC) / ฯ(TยฐC) where ฯ is the Kell water density formula (calibrated on NIST data).
FAQ
My data is gone after a browser update
Data lives in the browser's localStorage. Clearing browser cookies/cache can erase it. Enable Settings โ ๐ Auto-backup: the app then writes a backup to a folder on your computer after every change โ files on disk survive clearing browser data (Chrome/Edge desktop). Apple does not allow this on iPad/iPhone: make regular manual backups there via ๐ Back up to folderโฆ or Export everything (JSON).
Can I use the app on multiple devices?
Yes, but data is stored per browser. Use the JSON export/import to transfer data between devices.
How do I import a recipe from another program?
Brewbuddy '26 supports BeerXML in both directions: import .xml files from BeerSmith or Brewfather via ๐ฅ Import BeerXML, and export all your own recipes via ๐ค Export BeerXML โ both buttons sit above the recipe list.
Every program uses its own ingredient names: where Brewfather writes Pilsner Malt, this app knows Pilsmout 3 EBC. Names it does not recognise are added automatically to your own ingredients during import, along with the colour, extract and alpha acid from the file. Afterwards the app reports how many that was.
They then sit on the Ingredients tab, marked with the label custom, and that is where you enter the price. Without this step the cost would stay at โฌ 0 with no field anywhere to fix it. If the BeerXML file carries a price of its own it is taken over straight away; Brewfather usually does not export one. Importing the same recipe again adds nothing twice.
An entry created this way carries the label imported next to custom. That way you can tell what you created yourself from what a file left behind โ and you need that difference, because after a few imported recipes your list holds ingredients you are never going to buy.
Do check the new rows. Colour and extract come from the file and are usually right, but for hops the app infers bitter versus aroma from the alpha acid percentage, and miscellaneous ingredients are filed under herbs. You can correct both in the table itself.
The water volumes come from the file itself: BeerXML records the infusion amount per mash step, and those are added up to give your mash water. If the file does not have them, the app works them out from your own equipment profile โ the same arithmetic as behind the ๐ง Fill water volumes from my equipment button.
The yeast form comes across as well. Dry becomes dry yeast in grams; Liquid, Slant and Culture become packages. More than a quarter of a litre fits in no package โ the largest you can buy is a Wyeast XL of about 125 mL โ so the app reads that as a starter in litres.
Recipes you imported before version 3.53
Older versions did take the name from the file but registered the ingredient nowhere. On startup the app now makes up for that once: every ingredient in your recipes and batches that appears nowhere in the database is added to your own ingredients โ with the colour and extract stored in the recipe. You need do nothing, and none of your calculations change; a price field is simply added.
Can I share Brewbuddy '26 with other brewers?
Yes โ point them to brouwhulp.bosschebrouwers.nl or forward the BrouwHulp.html file. Free for everyone.
The version check does not work
The version check needs an internet connection and only works when the app is hosted (not as a local file). Opening locally shows an error โ that is normal.