Beerwright

Recipe studio · local-first · BJCP 2021

Fast enough to think in.
Correct enough to trust.

Beerwright is a brewing recipe editor where every keystroke re-runs the whole engine — gravity, bitterness, colour, volumes, and the mash pH your water actually produces. Nothing waits on a server, because none of the arithmetic happens on one. And when the assistant wants to change your recipe, it hands you a diff.

358 malts145 hops207 yeasts116 BJCP styles30 equipment presets

The Harbour Fog recipe open in the editor: fermentables, hops, yeast and mash schedule on the left, and a vitals rail on the right showing OG 1.066, FG 1.014, IBU 42, EBC 8 and ABV 7.1 per cent, each with its BJCP range bar for style 21C Hazy IPA.
A 20 L hazy IPA, in style on every vital. The rail on the right is sticky; the bars move as you type.

01 — The editor

Type a number,
watch five bars move

The calculation engine is pure TypeScript running in your tab, so the recipe does not have a loading state. Change 30 g to 45 g and the OG, FG, IBU, colour, ABV, BU:GU, the volume waterfall and the predicted mash pH have all already changed by the time your finger leaves the key.

Style fit is not a report you run. Each vital carries its BJCP 2021 range as a band, with your value as a marker on it — calm when it lands inside, amber with a one-click Fix chip when it does not.

  • BitternessTinseth, Rager or Garetz
  • Whirlpooltemperature-corrected mIBU stand
  • ColourMorey, Daniels or Mosher
  • ABVsimple or the 1.775 formula
  • Every figureexpands to its inputs and source

A add an ingredient · ⌘K command palette · ⌘J assistant · ⌘Z undo anything

The vitals rail for a hazy IPA. Five horizontal range bars — OG 1.066, FG 1.014, IBU 42, EBC 8, ABV 7.1 per cent — each showing the BJCP band for style 21C with the value marked inside it, above a beer-colour swatch reading 8 EBC by Morey, a mash pH badge reading 5.40, and tiles for BU:GU, calories, CO2 volumes and pre-boil gravity.
The vitals rail, all five bars in range.

02 — Water & mash pH

A pH model with
every acid in it

Most brewing apps treat water as a side calculator and mash pH as lactic acid with a fudge factor. This one runs a charge-balance model: each malt contributes its own distilled-water pH and buffering capacity, your report contributes its residual alkalinity, and mash thickness is part of the arithmetic rather than an assumption.

It solves in both directions. Predict the pH from what you are adding, or ask for the additions that reach 5.40 — including acidulated malt, which is solved separately because it joins the grist and changes the buffering it is meant to overcome.

  • Acidslactic, phosphoric, citric, acetic, hydrochloric, sulfuric
  • Alsoacidulated malt, solved on grams
  • Saltsgypsum, CaCl₂ ×2, Epsom, MgCl₂, NaCl, soda, chalk, lime
  • Solver≤ 130 salt subsets, previewed before it applies
  • Spargeacidified as a real addition, not a flag
The water and mash pH panel inside the recipe editor: a source water report, an RO dilution slider, a target profile with per-ion targets, a solved salt schedule, a sulfate to chloride readout and a mash pH section reading 5.40, inside the 5.2 to 5.6 band.
Source report, solved salts, and a predicted mash pH of 5.40 — inside the recipe, not in a separate calculator.

03 — The assistant

It proposes.
You accept.

The assistant reads your actual recipe from your actual workspace and runs the same engine the editor runs, so it converges on a number before it suggests one. It cannot invent a malt: every ingredient it names has to resolve to a catalogue entry or the tool call fails.

And it never writes. A suggestion arrives as a card with per-change checkboxes and a live preview of where the vitals bars would land. Accepting dispatches the same commands your keyboard does — which is why the whole proposal reverts with one ⌘Z.

  • Readsrecipe, equipment, water, settings, catalogue
  • Computesthe real engine, server-side, on a hypothetical
  • Writesnothing — proposals only
  • Entry pointschat, a Fix chip, Generate recipe…
The assistant drawer showing its work: chips for reading the recipe, searching the catalogue and running a calculation, then a proposal card titled Add a 30 g whirlpool addition for aroma, with a before-and-after vitals table showing IBU moving from 42 to 44, and Accept all and Reject buttons.
A staged changeset, with the vitals preview computed in your browser.

The engine

What is actually in the box

The catalogue ships with the app as versioned static data, and a recipe snapshots the values it used — so updating the catalogue never quietly changes a beer you already designed.

Catalogue

Fermentables
358
Hops
145
Yeast strains
207
Misc & water agents
42
BJCP 2021 styles
116

Weyermann, Crisp, Simpsons, Briess, Rahr, Great Western, Gladfield and a long tail of craft malthouses; Fermentis, Lallemand, Wyeast, White Labs, Omega, Imperial, Escarpment and more.

Water

Acids modelled
6
Salts & alkaline agents
9
Built-in analyses
7
Target presets
5
Solve for target pH
yes

Poly-protic acids handled properly at mash pH. Kolbach residual alkalinity, ion advisories, sulfate:chloride balance and a charge-balance sanity check on the report you typed in.

Equipment

System presets
30
Volume waterfall
live
Strike & infusion temps
yes
Mash vs brewhouse efficiency
both

Grainfather, Anvil Foundry, BrewZilla, Clawhammer, Spike Solo, Brew Hardware, Ss Brewtech, Blichmann, plus generic cooler, BIAB and 1 bbl nano profiles.

Correctness

Engine dependencies
none
Golden-value fixtures
yes
Scaling invariants
property-tested
Formula sources
cited in code

The pH model is pinned against published worked examples with documented tolerances, because a number you cannot check is a number you cannot use.

Switching

Bring the two hundred
recipes with you

Drop in a BeerXML export from BeerSmith, Brewfather or Brewer's Friend — or BeerJSON from anywhere — and the file is parsed in the tab. There is no upload endpoint, so a library of two hundred recipes never leaves your machine, and you can do it before you have an account.

The preview answers the only question a switcher is really asking: did this program understand my file? It shows the vitals we compute beside the ones the file claimed, and marks every ingredient as matched to the catalogue or kept as a custom one carrying the file's own numbers.

Measured against beerxml.com's four published BeerSmith recipes — a file whose numbers a different program computed.
VitalToleranceAchieved
OG±0.0010 SG±0.0003
FG±0.0030 SG−0.0024 … +0.0002
SRM±0.20±0.02
IBU±3.5 or 12 %5–11 % high
ABV±0.6 %+0.05 … +0.52

Ingredient matching on that corpus: 28 of 32 matched, 0 matched wrongly. The four misses are genuinely absent from the catalogue and import as custom ingredients.

The import preview: a BeerXML file listed with four recipes, each row showing the recipe name, its style, the vitals computed by Beerwright next to the vitals the file claimed, and a badge saying how many ingredients matched the catalogue.
Parsed in the tab. Nothing is uploaded.

Pricing

Ten recipes free.
Three tiers when you outgrow them.

Free

10

recipes, and every feature. No card.

  • The full editor, style bars and calculation engine
  • The whole water and mash-pH toolkit
  • BeerXML and BeerJSON import, BeerJSON export
  • Sync across your devices
  • 10 assistant messages a month

Not a crippled tier: nothing is greyed out. The cap is on how many recipes you keep, and it is enforced when a recipe is created — never by deleting one of yours.

Open the studio

Brewer

$24.99/yr

or $2.99/mo. The cap comes off.

  • Unlimited recipes
  • Unlimited batches, inventory and imports
  • Sync across every device
  • 10 assistant messages a month — the same taste as Free

For the brewer who wants a library, not a chatbot. The assistant allowance is deliberately unchanged: if that is what you are here for, the next column is the one.

What is not built yet

Brewmaster

$39.99/yr

or $4.99/mo. Everything, plus the assistant.

  • Everything in Brewer
  • 200 assistant messages a month
  • Recipe generation, water advice and diffs on tap
  • A fair-use allowance, not a meter you watch

The assistant reads your real workspace and runs the real engine, and every change it wants to make arrives as a diff you accept or reject.

See how it works

Billing is not live yet — these prices are what the tiers will cost at launch, and nothing in the app takes payment today. You can use the whole studio signed out, on one device, without an account at all.

Questions

Worth asking first

Can I get my data out?
Yes, and without asking. Any recipe exports as BeerJSON 1.0 from its own menu, and Settings has a one-click export of the entire workspace — recipes, equipment profiles, water profiles, settings — as a single file this build reads back in. Both are computed on your machine from your local copy. Deleting your account is type-to-confirm and erases the workspace, the sessions and the account row.
What is my password?
You do not have one. Sign-in is a Google account or an emailed magic link, so there is no password to store, leak or reset. Session cookies are HttpOnly and SameSite=Lax, and the server derives which workspace you can reach from the validated session and nothing else — no request ever names a user or workspace id.
Does it work offline?
The editing loop is entirely local: your workspace lives in the browser's own database and every calculation runs in the tab, so with the app open and the network gone you can keep designing. Edits queue in an outbox and replay in order when you reconnect — useful in a garage, which is where a lot of brewing happens. It is not yet an installable app, so a cold start still needs the network.
Do I have to sign in to try it?
No. Signed out you get the whole studio, stored on that one device. Signing in later uploads what you built if the account is empty; if it is not, your local work stays where it is under its own key rather than being merged over.
What is not built yet?
Billing, brew-day mode, batch logging and inventory. They are the next milestone, not a maybe, and the app says so in the places they will appear rather than pretending otherwise. Fermentation-device integrations and shared recipe links are further out.
Why "Beerwright"?
A wright is someone who builds a thing by hand and knows why every part of it is shaped the way it is — shipwright, wheelwright, playwright. That is the job here, applied to beer. It is spelled -wright, not "write" or "right".