Brewbuddy '26 Manual

Version 4.88 ยท By Leonard Hamers ยท Bossche Brouwers

๐Ÿ“– Manual
Brewbuddy '26 ยท 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.

1
Download
Download BrouwHulp.html via the download button on the website.
2
Open
Open the file in Chrome, Firefox, Safari or Edge.
3
Done
The app works instantly, even offline. Your data is stored in the browser.

Install as an app (recommended)

You can install Brewbuddy '26 as a real app on your phone or laptop:

โš ๏ธ Important: Your data is stored in the browser, not in the file itself. Make regular backups via Settings โ†’ Export everything (JSON).

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.

  1. Name your recipe and choose a beer style
  2. Set the batch volume and efficiency (default 20L / 75%)
  3. Add malt via the + Add button in the fermentables section
  4. Add hops with timing and use
  5. Select a yeast from the database
  6. Save with ๐Ÿ’พ Save Recipe
๐Ÿ’ก Tip: The calculations on the right (OG, IBU, EBC, ABV) update live as you enter ingredients.

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.

💡 Archive or delete? Archiving is reversible and deleting is not. When in doubt, archive. You lose nothing, and the button to bring it back is in the same place.
Was a dropdown already set to the recipe you are archiving? Then it stays there, so your water calculation or shopping list does not quietly switch to a different beer. Pick something else afterwards and it disappears from that list after all.

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:

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 waterHow hot the water you pour onto the grain must be
Mash waterWhat goes into the mash tun
Sparge waterWhat you rinse through it
Total waterWhat you need in total, losses included
Pre-boil volumeWhat stands in the kettle when you start boiling
Pre-boil gravityWhat 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.

This is a starting point, not a promise. How much heat a vessel swallows depends on the material, the wall thickness and whether you preheated โ€” the app cannot know that. Measure once what you actually get after mashing in, and adjust your grain temperature until it matches. After that it is right for every recipe on that rig.
Which step you strike at. The app uses the temperature of your first mash step โ€” the same step that heads the countdown timers below. If your recipe has no mash schedule of its own, the log falls back on the standard schedule, so you strike at the protein rest. With no grain in the recipe at all, a dash stays there.

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 recipe is left alone. If your primary fermentation runs two days longer than planned, you note it here โ€” that is what happened that time, not a change to your plan. If you want to do it that way from now on, change it in the recipe editor.
If a brew has no schedule yet, the card is there anyway, with a button to start one. That way you can follow the fermentation of a recipe you never set a profile on.

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.

Resetting the boil with โ†ฉ opens all the additions again. Handy if you have to start over because something went wrong.

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.

An other ingredient without a time sits at zero and gets no alarm of its own โ€” fill in the field and it joins in. For any timing other than Boil you see a dash: a moment in the boil has no meaning there.

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 volume field does not scale your ingredients. You type what you actually ended up with, and your grain bill stays as you wrote it. If you do want to scale, that is what the โš–๏ธ Scale button is for, with a preview and a confirmation.

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:

MomentMash waterPre-boil gravityOriginal gravityAlcohol
Mashyesyesyesyes
Kettlenonoyesyes
Fermentationnononoyes
Bottlingnononoyes

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.

Why the difference matters. Pre-boil gravity is a measurement you take on brew day: you read it from the kettle before you light the burner. Leave your candi sugar on Mash while you actually add it at flame-out, and the app expects a higher reading than you will see โ€” sending you off to correct an efficiency that is perfectly fine.

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 kettleSugar on day 3
OGcountsdoes not count
Pre-boil gravitycountsdoes not count
IBUcountsdoes not count
Alcoholcountscounts
FGno 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.

A honey tripel, to make it concrete. 5.5 kg pilsner malt and 0.5 kg sugar in the kettle, 1 kg honey on day 3, 20 litres, 85 % attenuation. You measure OG 1.071 as if there were no honey, you get 10.8 % alcohol as if there were, and your IBU stays that of the recipe without honey.

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
OGdoes not count โ€” you measure that in the fermenter
FGdoes not count โ€” you measure that just before bottling
IBUdoes not count โ€” the sugar never saw the kettle
Alcoholdoes 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.

Why not under Other ingredients? You can โ€” Bottling has been in that list of moments for longer โ€” but other ingredients carry no extract. The app does not know how many gravity points a kilo of coriander holds; for sugar in the malt list it does. So put priming sugar in the malt list and it counts. Under Other it stays a note on your brew sheet, which is exactly right for finings.

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 haveCalculationExample
Fine extract dry basis + moistureextract ร— (100 โˆ’ moisture)/100 ร— 3.8480 % at 4.5 % moisture โ†’ 293 points
PPG (US)PPG ร— 8.3537 PPG โ†’ 309 points
Yield as SG(SG โˆ’ 1) ร— 83501.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.

The app does not make that correction behind your back. Points/kg is always the value as the malt sits in your sack. Fill in the moisture field and you watch the conversion happen; leave it empty and the app takes the extract exactly as you typed it. So with a US PPG figure you leave moisture empty, because there the moisture is already in the number.
Take the fine extract, not the coarse one. A certificate also states a coarse extract, measured on a 0.7 or 1.0 mm grind. The gap between fine and coarse is a loss belonging to your own mill, and that goes into your brewhouse efficiency, which you enter separately in the recipe. Enter the coarse extract and a 75 % efficiency and you subtract the same loss twice.
The default figures in the malt list are ballpark values. They are in the right range for their type, but they are not copied from any particular maltster's analysis certificates โ€” those differ by brand and by harvest year. If you always buy from the same supplier and want it exact, add those malts as custom malts using the figures from their certificate. Each then has its own points, its own price and its own stock.

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.

Your existing recipes keep working. The app converts old malt names once at startup, including your own prices and your stock. A backup you restore later and a BeerXML file you exported earlier are translated too. If you had created your own malt with exactly the name a default malt now carries, yours gets (eigen) added and your recipes follow it โ€” otherwise the app would quietly start using the default malt's figures instead of yours.

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.

The name can be changed too. Type in the name column and click elsewhere. The name is the key your recipes, your recipe versions, your brews, your price and your stock hang on, and all five move along with it โ€” you do not have to re-enter anything, not even in a recipe that happens to be open. An empty name is refused, and so is a name that already exists: two ingredients sharing one name would share one stock line and one price without you noticing. A handful of names is off limits too, because the app uses them itself or they once belonged to a built-in ingredient โ€” you will be told why.

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.

Yeast now asks for Dry or Liquid rather than a beer style. That is the only thing the app uses it for: dry yeast is dosed in grams, liquid yeast in packs. Anyone who added their own yeast earlier always got a dose in grams; those are now set to Dry and can be switched with one click. Nothing changes in your existing calculations until you do so.

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.

If the style you had already chosen falls outside your filter, it stays selected and the app says so. Searching cannot lose it.

The fermentables section contains a database of more than 80 malts and grains, organised in categories:

CategoryExamplesMax. share
Base maltPilsner, Pale Ale, Munich100%
Caramel/CrystalCrystal 40L, Caramunich25%
RoastedChocolate, Black Patent15%
Unmalted grainOats, Wheat, Rye40%
Sugar/ExtractCandi sugar, DME20% (info)
โš ๏ธ Warnings: Brewbuddy '26 automatically warns when specialty malt percentages get too high, based on Palmer's "How to Brew" and BJCP guidelines.

Hops

Add hop additions with weight, alpha acid percentage, use and timing. IBU is calculated with the Tinseth formula.

UseExplanation
BoilStandard bittering hops. IBU depends on boil time.
First wort (FWH)Added before the boil. Mild bitterness, good integration.
WhirlpoolAfter the boil. Enter the stand time under boil time and the temperature under WP ยฐC โ€” bitterness follows from those
Dry hopDuring 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:

TemperatureIBU
70 ยฐC10
80 ยฐC14
90 ยฐC20
99 ยฐC28

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 %.

This remains an estimate. The spread between published whirlpool measurements is wide, and no model agrees with all of them. If you have your own beer analysed and are consistently off, do say so and I will look into it.

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:

FormUtilisationNotes
Pellets T-90100 % (default)By far the most common. The plant material is milled, so alpha acids are released more readily
Whole cones90 %Alpha acids are still locked in the leaf and the hop bed holds back more wort
T-45 / Cryo100 %Lupulin concentrate. No extra factor โ€” see below
T-45 and Cryo must not be counted twice. These products give more bitterness per gram because their alpha acid content is roughly twice as high โ€” that is printed on the packet. Enter that higher percentage under Alpha acid and the IBU works out by itself. Applying another factor of 2 on top would count the concentration twice.

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.

StorageLoss per yearExample: 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%
โš ๏ธ Estimate: actual loss varies strongly by variety (Hop Storage Index ranges from 0.2 to 0.6). If your package states the alpha acid percentage, use that; the database value is only a typical figure.

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.

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.

๐Ÿ’ก Why extract? Useful for adjusting bitterness afterwards, and tetra/rho variants make beer light-stable (no skunky flavour in clear bottles).
๐Ÿ’ก BU:GU ratio: A useful guideline is IBU / ((OG-1)ร—1000). Below 0.5 = malty, 0.5โ€“0.8 = balanced, above 0.8 = bitter-forward.

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:

Magnum: alpha acid changed from 10.7 to 12.0 %.  [ Change weight to 196.0 g ]  keeps this addition at 21.9 IBU — now 24.6

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.

💡 Why not work it out yourself? For an ordinary boil addition you can: 220 ร— 10.7 / 12.0 = 196 g. But that sum no longer holds as soon as the form changes too — pellets to whole cones costs ten percent of the utilisation — or the harvest year, or if it is a whirlpool addition, where utilisation depends on temperature and stand time. The app uses the same formula as your whole recipe, so those factors are included automatically.

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.

A dry hop gets no suggestion and no card. It contributes no bitterness, so there is no IBU figure to derive a weight from. The same goes for a boil addition of zero minutes.

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 ยฐPlatoup to OG 1.061from OG 1.061
Ale (top-fermenting)0.751.0
Lager (bottom-fermenting)1.52.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.

A higher rate does not automatically mean more yeast. It applies per ยฐPlato, and strong beer has more of them. A pilsner at 1.048 (11.9 ยฐP) needs 357 billion cells for 20 litres; a tripel at 1.075 (18.2 ยฐP) needs 364 โ€” almost the same, despite the lower rate. Only a strong lager really pulls away: a doppelbock at 1.080 comes to over 570 billion, and that is a starter, not a packet.

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.

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.

Why the lower bound sits above the cell model. For an ordinary 20-litre ale the cell model lands just over 9 grams and Fermentis on at least 10. That gap is deliberate: a manufacturer keeps its floor generous because it does not want complaints about sluggish fermentation. If you count cells yourself, you may go lower.

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:

Bottling yeast is not a day-7 yeast. CBC-1 does not go in somewhere during fermentation but into the bottling bucket, together with your sugar โ€” and weeks of lagering can sit between the end of fermentation and that moment. Hence the separate Bottling choice, without a day field: a day of fermentation would be both the wrong number and the wrong picture.

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.

F-2 shows a dash instead of a percentage. That is not a missing figure but a deliberate blank: Fermentis publishes no attenuation for this yeast โ€” its data sheet says "n/a". Nor does it ever see wort, only priming sugar. A number here would suggest a specification that does not exist, and that number would then feed into your FG.
A yeast set to Bottling does not count towards your attenuation. It goes in after primary fermentation and sometimes after weeks of lagering; by then it has nothing left to say about your final gravity. So a wheat beer with WB-06 (67%) and CBC-1 (75%) calculates with 67%, not 75%. The exception hangs on the moment and not on the strain: set US-05 to Bottling and it does not count either.

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.

Attenuation is the highest of your yeasts. When co-pitching, the most attenuative strain determines your final gravity in practice; fermentation does not stop halfway because half your yeast gets less far. A weighted average looks more scientific and is worse brewing. The attenuation field stays yours: whatever you enter is kept.

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.

A recipe with one yeast simply has one row. If you read in a recipe that still keeps the yeast as a single field โ€” an old backup, a BeerXML file โ€” it automatically becomes that first row, with the same amount and the same form.

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.

A recipe without a yeast form is read as dry yeast in grams. That is the safe reading: a recipe that only records a number of grams is not suddenly a number of packs.
The yeast form in your recipe overrides the database. The same strain is sometimes sold both as dry granules and as a pack of liquid yeast. What you set in the Form column decides the unit of the advice โ€” even when the database knows that product differently. Buy a strain listed as liquid in dry granules, set the form to Dry, and you get a dose in grams.

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.

Mind the OG. For liquid yeast the app uses the cell model, and cell demand is directly proportional to ยฐPlato. A quadrupel at 1.090 needs almost three times the yeast of a session beer at 1.035 for the same volume.

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.

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:

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.

ButtonScheduleWhat for
๐Ÿฏ Single infusion 67ยฐC67ยฐC ยท 60 minBy 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-out67ยฐC ยท 60 min, then 78ยฐC ยท 10 minSame rest, with an amylase stop. Thins the wort and makes sparging easier
๐Ÿงฌ Classic step mash52 / 62 / 72 / 78ยฐCProtein 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.

โš ๏ธ Replaces the whole schedule: these three buttons discard what is there. If you built a schedule yourself the app asks for confirmation first; switching between the ready-made schedules happens without questions.

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:

SettingMeaningDefault
Boil-off rateLitres evaporating per hour3.0 L/hour
Grain absorptionLiquid retained by the spent grain0.8 L/kg
Mash thicknessWater per kilo of malt in the mash tun; 0 = all at once (BIAB)3.0 L/kg
Fixed mash waterAlways mash with the same volume? Enter it here; 0 = do not use0 L
Kettle/trub lossWhat stays behind after transfer1.5 L
Mash tun dead spaceLiquid below the false bottom0 L
Cooling shrinkageVolume loss from 100 ยฐC to 20 ยฐC4%

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.

โš ๏ธ A fixed mash volume belongs to one kettle. Set 230 L and then brew a 20 L test batch and it will not fit, so the app caps it and tells you. Switch equipment in that case rather than editing the numbers.

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.

Sugar and extract do not count here. Only grain holds water back in the spent grain, so only grain determines your mash water and your grain absorption. In a recipe with 10 kg of candi sugar that is a difference of over 8 litres. In your OG the sugar counts normally, of course.

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.

Dead space is added on top. If you have a false bottom, a pump or a manifold, there is liquid under your grain bed that takes no part in the mash. Enter it under Mash tun dead space and the app adds it to your mash water. A Grainfather G30 with 3.5 L of dead space and 2.7 L/kg therefore gets 5.65 ร— 2.7 + 3.5 = 18.8 L of mash water for 5.65 kg of grain. Leave those 3.5 L out and your grain sits in 11.8 L, a thickness of 2.08 instead of 2.7 โ€” a quarter thicker than you asked for. The total water does not change; water simply moves from sparging to mashing.
Does that dead space stay behind, or carry over? That differs per system, and it makes exactly that many litres of difference to your total water. Hence the selector under the field.

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.

Does your dead space stay behind, or come along? Under the field Mash tun dead space there is a dropdown. With two separate vessels that liquid stays behind and is a loss; with a single vessel and a pump โ€” Grainfather, Braumeister, Klarstein โ€” it simply goes into the boil and is not a loss. With the dropdown set wrong, the app prepares exactly those litres too much. The water balance under your recipe says so as soon as a dead space is being counted as a loss.
This works differently from your mash tun dead space, deliberately so. Water below your false bottom still counts towards mash thickness; water in your hot liquor tank counts towards nothing. So your mash and sparge water do not change โ€” running more over your grain bed than the recipe calls for would be nonsense. What changes is how much you put in that vessel and how much you prepare in total. The water balance under your recipe adds both figures as soon as you enter a loss.

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.

Mash water in an existing recipe does not follow along. It is stored as a number in the recipe. If you later change your equipment profile โ€” a different mash thickness, a dead space you did not have before โ€” older recipes keep their old number. The water tab then shows a line with what your profile would give now, and a button to take those values. The app does not overwrite automatically: some recipes deviate on purpose.

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.

The recipe is left alone. Switching in the log changes that one brew only. The recipe is what you planned, the log is what actually happened, and those two belong apart. Your grain bill, hops, yeast and measured efficiency stay untouched as well: a different kettle changes your water, not your grist.
Delete a profile a recipe or brew still points to and the app falls back on your settings. Not silently: the vanished name stays in the dropdown marked as no longer existing, and a line appears saying your settings are being used instead. Otherwise your water calculation would change without anything warning you.
๐Ÿ’ก Measure it yourself: determine your boil-off by measuring volume before and after the boil: (pre-boil โˆ’ post-boil) รท boil time in hours. Do this once and all your recipes will be accurate.

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.

Why this is more than trivia. Your loss sits in the yeast bed, the tubing and what is left in the fermenter. If it runs consistently above ten percent, your kettle loss or dead space in Settings is set too low โ€” and then your mash and sparge water come out short too. The number from counting bottles is a check on your whole water calculation.

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.

These are typical values. Honey ranges from 78 to 82 percent fermentable, syrups differ by brand and malt extract by manufacturer. If you know the fermentable fraction of your product, work it out yourself: take the grams of table sugar the app gives and divide by your fraction. Molasses is deliberately absent: it ranges from 45 to 60 percent and carries so much flavour that you would not pick it for the carbonation โ€” a figure that can be tens of percent out helps nobody.

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.

An example: 20 litres of 6.0% beer to 2.4 volumes of COโ‚‚ at 20 ยฐC. That needs another 1.55 volumes, good for about 81 mL of alcohol โ€” +0.40%. Dissolve the sugar in 0.3 litres of water and you end up at 20.3 litres and 6.31%. Net +0.31%, then: dilution eats a quarter of the gain.

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.

It is an upper bound. Part of your power leaks away through the wall, the lid and the extraction hood, and that part evaporates nothing. Kettle shape does matter there โ€” through those losses, not through the evaporation itself. On gas, much of the flame's heat never enters the kettle at all. Measuring stays more accurate; this sum is a starting point and a sanity check on a measurement that looks odd.
What this means for scaling. Boil-off is not a percentage of your batch. Twice as much wort under the same element evaporates roughly the same litres per hour, not twice as many. That is why the app recalculates the boil volume from your equipment profile when you change the batch size, instead of scaling it proportionally.

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 water block opens with which water you are using. Not just how many litres of mash and sparge water, but whether that is your tap water, a profile you saved yourself, or diluted water โ€” with the percentage and the number of litres of RO water alongside. If the app has no profile name, the six ion figures appear instead. The sheet only knows this if you clicked ๐Ÿ“‹ Copy into <name> on the water tab; if you never did, the line stays away rather than asserting something.

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.

๐Ÿ’ก BeerXML is something else: that export is meant for exchanging recipes with other brewing software (Brewfather, BeerSmith) and is not readable on paper. Use the print button for that.

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.

Leave the Boiling temperature field empty if you want altitude to be taken into account. A value there always wins, even over an altitude you enter later โ€” type 300 m while 100 ยฐC is still in the field and nothing changes in your IBU. The app now warns about this. The empty field shows, in grey, the temperature that follows from your altitude.
AltitudeBoiling pointIBU for a 60-min boil
0 m (sea level)100.0 ยฐC100%
1000 m96.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.

๐Ÿ’ก Want the same bitterness anyway? Increase your hop charge or extend the boil; the app shows the result immediately.

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 temperatureAdvised minimum time
70โ€“73ยฐC (alpha-amylase optimum)25 min
67โ€“69ยฐC35 min
64โ€“66ยฐC45 min
62โ€“63ยฐC60 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.

โš ๏ธ Note: this is a time-and-temperature guideline. Only an iodine test confirms that the starch has fully converted. Poorly modified malt, a coarse crush or a thick mash require longer times.

Calculations & calc panel

All calculations update live. The calc panel (right side of the recipe editor) shows:

ValueExplanation
OGOriginal gravity
FGFinal gravity (based on attenuation)
ABVAlcohol percentage
IBUBitterness (Tinseth or Rager)
EBCColour (Morey formula)
Pre-boil SGExpected gravity before the boil
BU:GUBitterness/gravity ratio
Pitching rateYeast dose per litre, with advice
CostCalculated 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.

As a home brewer you pay nothing. Beer brewed at home for your own use is exempt from excise duty (Dutch Excise Act, art. 5(3)(c)). The figure is shown purely for information โ€” for instance to see what a recipe would cost in a commercial setting. This is not tax advice, and rates outside the Netherlands differ.

Timers

The timers keep running when your screen locks. They read the clock rather than counting seconds, so a phone going to sleep โ€” or a tab moving to the background โ€” will not make them fall behind. Come back and the correct time is there straight away, and hop additions that came due in the meantime are still announced.

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.

Your water values stay put; there is nothing to link. The water tab is one set of settings for the whole app, not something per recipe or per installation. If you always brew in the same brewery, enter your water once, save it, and you will find it again at every start โ€” including the chosen profile name in the picker. Picking a profile from the list is therefore only for putting the six fields back on those values, not something to repeat each brew day.
โš ๏ธ Saving does not happen by itself. At the bottom of the results panel is ๐Ÿ’พ Save water settings; without that click your values are gone once you close the app. The ๐Ÿ’พ Save as profile button does both at once: it stores the profile and saves your current water settings.

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.

A style the app does not know stays put. Recipes from Brewfather or BeerSmith often carry an English style name such as "Belgian Tripel". It is not in the list, but it is added below it with an asterisk โ€” just like an ingredient that is not in the database. Search the styles and your choice stays selected even when it falls outside the filter; a line underneath says it is hidden.
๐Ÿ’ก Where to find your water values? Most water companies publish an analysis per postcode on their website. Look for calcium, magnesium, sodium, chloride, sulphate and bicarbonate (or "hardness" and "HCOโ‚ƒ"). If in doubt, have your water analysed once.

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:

A profile name that no longer fits is not quoted. The picker stays on "Dublin" even after you adjust an ion field by hand. On screen that is fine, because the figures sit right beside it โ€” on a printed sheet they do not. If anything differs from the profile, the sheet prints the six ion values instead of a name.

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.

Pressing again replaces, it does not stack. Adjust the salt table and click again, and the new state takes the place of the old one. Rows you typed in yourself at the mash or sparge moment go with it; anything at another moment โ€” lactic acid at bottling, oak spirals in secondary โ€” is left alone.

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.

โš ๏ธ Nothing happens on its own. The water settings are stored once and belong to no recipe. Change something about your water later and the copied rows in your recipe do not follow โ€” click the button again.

Which acid should you use?

AcidStrengthWhat else it does
Lactic acid 80%10.5 mEq/mLWhat 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/mLThe American standard, and what most English-language literature assumes. Same acid, 12% stronger per mL
Phosphoric acid 75%12.1 mEq/mLFlavour-neutral โ€” phosphate largely precipitates with calcium in the mash. Same dose in mL as lactic acid
Hydrochloric acid 10%2.88 mEq/mLAdds 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.

โš ๏ธ Check your label: lactic acid is sold in several strengths, and that makes a large difference in dosing. Below the lactic acid row in the salts table, enter your own percentage under strength; the app immediately shows how many mEq per millilitre that works out to. 80% is the norm in the Netherlands and Belgium, while American recipes and literature almost always mean 88%.

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.

โš ๏ธ Dilute by weight, not by volume. A lactic acid percentage is a mass percentage (w/w). To go from 80% to 30%, weigh out 100 grams of 80% lactic acid and make it up to 267 grams with water โ€” not to 267 millilitres. The general sum: new weight = old weight ร— old percentage รท new percentage. Diluting by volume puts you over 10% off, which throws away the very precision you were after.

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.

The six ion fields remain your water report. They do not change because you dilute โ€” that is what your water utility measures. What actually goes into the kettle is on the line below. That way you do not lose your own figures and you cannot dilute twice over.

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.

โš ๏ธ Diluting lowers everything, including what you wanted to keep. Along with the bicarbonate go your calcium and sulphate. Usually that is no obstacle: you top those up with brewing salts, and that is exactly why this order works โ€” dilute until your alkalinity is right, then add salts until your profile is right.

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.

Do not convert by hand. One millilitre of solution holds about 0.65 grams of granules โ€” put a gram figure in the millilitre field and you are 55% too high. What the button fills in is right; if you enter something yourself, check the unit on the row.

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.

โš ๏ธ Salts can only add. If your source water is already above target for an ion โ€” often bicarbonate with hard water โ€” no salt exists that lowers it. The app tells you which ions those are; the only way down is diluting with RO or distilled water. So dilute first, then calculate the salts.

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.

The acids are left alone. Those belong to pH, not to the ion profile. How much lactic acid you need is already stated under the calculated mash pH and beside the sparge water โ€” a separate sum, and it does not change when you press the salt button.

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.

If your sparge water comes out above 6 the app says so and works out how much more lactic acid is needed to reach 5.8, accounting for what you already added. Once all the bicarbonate is gone the pH drops away steeply; that is where this model stops, and the app says so honestly instead of inventing a figure.

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.

Add acid anyway and the pH drops steeply. Nothing holds it back: half a millimole of lactic acid per litre already takes roughly neutral water down to pH 3.6. The app works that out with the weak-acid approximation [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 common mistake: entering millilitres on the granules row. You are then 55% off โ€” the app calculates with more calcium than you actually add. The other way round: 1 mL of liquid โ‰ˆ 0.65 g of granules.

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%.

ProductDoseExtra sulfate
Antioxin SBT0.5 g per 10 Labout 17 ppm
Antioxin SBT1.0 g per 10 Labout 34 ppm
Potassium metabisulfite1.0 g per 10 Labout 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.

โš ๏ธ Only what goes in before or during the mash: leave this empty for an antioxidant you dose after fermentation, such as Antioxin SB. The water tab models your mash water, and such a late addition contributes only 3 to 10 ppm anyway โ€” lost in the noise.

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.

โš ๏ธ Do not double dose: the acidulated malt is already in the calculated pH. If you also enter lactic acid in the acid table, you are acidifying twice.
Share of acidulated maltEffect on mash pH
1% of the gristabout 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.

โš ๏ธ Still an estimate: real values vary by malt batch and water source. Measure your mash pH after 10โ€“15 minutes with a calibrated meter; aim for 5.2โ€“5.6 (measured at room temperature).

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.

Your brewing salts are here too. Since the water tab puts salts into your recipe as ingredients, gypsum, calcium chloride and lactic acid count towards your shopping list. Enter what is in the cupboard here and they drop off the buying list.

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.

This is an aid, not a replacement for your statutory records. What counts as the prescribed registration is set out in your licence, not in this app. Use it to keep and check your own books, and hold the result up against what your supervisory authority asks of you.

The three balances

An inspection comes down to three sums that each have to balance on their own:

BalanceWhat has to add up
Raw materialsopening stocktake + purchases โˆ’ use โˆ’ write-offs = closing stock
Volumelitres brewed = packaged + loss + destroyed
Excise dutylitres 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.

KindWhat it does
Stocktakesets the balance to what you counted; everything before it no longer counts
Purchaseadds, with supplier and amount
Usesubtracts, with the batch number it went to
Write-offsubtracts 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.

Your inventory screen follows the ledger. As long as the module is on, the ledger is the truth and the inventory screen shows the balance that follows from it. Type a figure there and the app writes a stocktake โ€” you are, after all, saying how much is on the shelf. For a raw material nothing has ever been recorded about, the loose number stays, so your store does not look empty on the day you switch the module on.

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 current stock does not change, and that is correct. When you switched the module on, an opening count was written with the stock as it stood in your cupboard at that moment. A count sets the balance; everything in the ledger before it is already accounted for. Enter a brew from 2024 and its grain bill lands neatly in the ledger as a trail for the customs authority, but your current stock does not drop a second time. If it did, you would be deducting the same sack of malt twice.
Do not be alarmed by a negative balance on an old date. Ask for the balance on a day before your opening count and you will find consumption but no purchases yet, so a negative number comes out. That is not an error in your records but a consequence of where you started counting. If you want your old purchases to add up too, record those invoices as well with their own dates โ€” the invoice overview and the raw-material ledger accept any date.

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.

A guess stays a guess. Look it over before you record it. The app would rather guess nothing than something: at least four characters must overlap, matching is on whole words โ€” so citric acid does not become Citra โ€” and if two ingredients fit equally well it picks neither. But it cannot rule it out entirely, and a raw material recorded against the wrong ingredient sits in the ledger the customs authority reads.

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.

Whatever you have already chosen always stays in the list, even when your filter does not match it. Otherwise a filter would throw away your link without you clicking anything. Switch category and the filter is cleared โ€” a search term from the malt list would hide the entire hop list.

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.

The second order goes by itself. Leave the tick box at the bottom on and the app remembers that "Chรขteau Pilsen 2RS 25 kg" belongs to your pilsner malt โ€” regardless of capitals and accents. The next invoice from the same supplier comes out right straight away and you only have to check it.
An invoice is not a delivery. What is on the invoice is what you ordered and paid for; what is on your shelf is what arrived. If the delivery does not match the invoice, adjust the quantity before you record it. And the app never records anything by itself: it proposes lines, you press record.

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:

ModelHow it calculatesUsed by
Per hl per %volrate ร— alcohol percentage, with a minimum per hectolitreNetherlands
Per hl per ยฐPlatorate ร— degrees Plato, with a minimum per hectolitreBelgium
Per litre of pure alcoholrate ร— the alcohol contained in the beer; no minimumUnited Kingdom
Band ratesa fixed amount per hectolitre per strength bandGermany

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.

As a home brewer you pay nothing. Beer brewed at home for your own use is exempt from excise duty. The figure the recipe screen shows next to your cost price is there purely for information โ€” for instance to see what a recipe would cost in a commercial setting. This is not tax advice, and rates outside the Netherlands differ.

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.

No excise duty is calculated on them. Whether loss, sampling or destruction leads to a refund or falls under duty suspension depends on your licence and on the supporting documents you hold. That is a question for you and the inspector, not for this app. The register only records what happened and how many litres it involved.
💡 A batch that was discarded entirely never got a release. Record it as an incident and it appears in the volume balance after all, with a balance that closes โ€” exactly the batch you want to be able to show an inspector.

Tools

ToolUse
SG โ†” Plato/BrixConversion between units
RefractometerCorrect the refractometer reading during fermentation (Sean Terrill)
Hydrometer temperature correctionCorrect a reading taken at non-20ยฐC temperature (Kell/NIST)
Yeast starterCalculate sugar/DME for a given starter volume and gravity
Raise gravityHow much sucrose/dextrose for a higher OG
DilutionWhat 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.

Dilution and raising gravity each work in one direction only. Water dilutes and can only lower gravity; sugar can only raise it. Enter a target the wrong way round and the app tells you which of the two you need.

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.

Yeast counts in sachets, not in grams. The Stock tab asks for your yeast in sachets, so the shopping list uses the same unit. Eleven grams of dry yeast in your recipe is one sachet; with two in the cupboard you need to buy nothing. Liquid yeast counts per pack, and a starter is grown from a single pack โ€” the number of litres of starter says nothing about what to buy.

๐Ÿ–จ๏ธ 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.

The 20 billion per gram is an optimistic assumption. Manufacturers typically guarantee at least 6 billion per gram. The figure matches what other brewing software uses so your results are comparable โ€” but for old or poorly stored yeast it is too high.

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.

Why this is useful. Manufacturers quote a range for a yeast that is sometimes ten percentage points wide, and every brewing program picks a figure out of it. That is why two programs can predict 1.007 and 1.010 for the same recipe: not a different formula, but a different number in the database. If your yeast reached 80.8 % and the recipe assumed 82.4, set it to 81 next time. After a few brews you know what your yeast does in your fermenter.
An impossible result stays away. An FG above the OG, or an attenuation above 105 %, comes from a typo or from two swapped rows. The line then stays away rather than showing a figure that looks credible.

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.

It is about your grain, not your sugar. Sugar, candi and malt extract dissolve completely; your mash makes them neither better nor worse. They are therefore left out of the calculation โ€” their contribution is subtracted from your reading first, and what remains is divided by what your grain could have delivered. Anything set to Fermentation or Bottling does not count at all: it is not in the beer yet when you take the OG reading.
โš ๏ธ An impossible result is not shown. If your reading works out above 120% โ€” almost always a typo in the gravity or the volume โ€” the line stays away rather than showing a figure that means nothing.

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.

โš ๏ธ Mind the difference with Save: the ordinary ๐Ÿ’พ Save recipe button overwrites the recipe you are working in. To keep the original, use Save as new recipe โ€” otherwise the old state is only retrievable through the version history.

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 you can do: only import files from people you trust, and make a backup via Settings โ†’ Export everything before a large import. An import replaces your recipes and batches.
โš ๏ธ If your browser's storage fills up, the app says so. After the import you will see a message that everything was read in but NOT saved: nothing is lost as long as you keep the tab open. Remove old brew days or recipes first โ€” or export them to a file โ€” and try again.

What the app does not do

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.

โš ๏ธ A downloaded file does not check. If you run Brewbuddy as a loose file from your disk, the app cannot find out whether a new version exists: the security policy only allows connections to its own origin, which for a local file is your own folder. Relaxing that would mean the app contacts the server every time it starts, which is exactly what it promises not to do. So check the download page yourself now and then.

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.

โœ… Tip: Always make a JSON backup via Settings โ†’ Export everything before updating. That way you can restore your recipes and batches if anything goes wrong.

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)

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.

Cleaning up. A button appears at the top of the Ingredients tab as soon as there are imported entries you have no use for. It only removes what appears in no recipe, recipe version or brew and that you have no stock of; their price goes with them. Anything you created yourself always stays, and you see the names before anything disappears.

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.

Yeast: packages, grams and litres. BeerXML is messy here: the AMOUNT field is litres or kilograms, and a package count fits neither. Brewfather writes two sachets of dry yeast as AMOUNT 2 โ€” and until version 4.14 the app read that as two kilos. It now looks at DISPLAY_AMOUNT first, which spells out the unit ("2 pkg"). If that is missing the standard applies, with a plausibility limit as a backstop: no homebrewer uses more than half a kilo of yeast, so a small whole number is almost certainly a package count. If anything is adjusted you are told after the import, with the original figure alongside.

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.

โš ๏ธ One thing this does not solve. Whether an ingredient is sugar or malt extract exists only in the original BeerXML file. Older versions treated those as grain and applied the brewhouse efficiency to them, so the calculated OG came out too low โ€” with half a kilo of sugar in 20 litres, some two gravity points. The app deliberately does not guess this from the name. If a recipe you imported before version 3.53 contains sugar, candi or malt extract, import that file again and only then delete the old recipe.

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.