Image

Everything You Need to Know About BeerXML

Published: December 13, 2022

Let’s not kid ourselves, following a beer recipe can be a lot more involved than going through a recipe for a new dish. Brewing beer is an incredibly complex and scientific task, with most beer recipes involving a variety of ingredients such as hops, grains, and fermentables along with different techniques like boil times, hop utilization rates, and much more.

Sure, you can write your recipes down with some good old-fashioned pen and paper or use a digital format like a spreadsheet. But what happens when you want to share a recipe? What if you discover a recipe you’d like to try from another brewer?

Imagine how complicated and inefficient it could get if every beer recipe was compiled and organized differently. More than likely, you may miss a step or a key ingredient and the batch could end up down the drain.

This is where BeerXML files can be incredibly valuable.

From organization to automation, our guide will help you get started on understanding BeerXML and what you can do with it.

(Above photo: Jacob Lund | Adobe Stock)

What Is a BeerXML File?

BeerXML is a digital file format that enables brewers to create, maintain, and share beer recipes in a standardized digital format.

Diving deeper into the technical side of things, a BeerXML file is a branch of XML, which stands for Extensible Markup Language. The XML language allows the data they contain to follow a certain format and organizational structure by using defined objects and tags to ensure the content is easily readable by software applications – while also being easy for any user to interpret.

The main goal of a BeerXML file, or any XML file for that matter, is to accelerate and reduce the time a developer needs to spend in order to integrate their data with software, apps, websites, or whatever project is being created.

Return to top

Why Should I Use BeerXML?

In any type of workflow, including brewing beer, creating a set of standard rules and processes helps streamline tasks, creates more efficient operations, and enables opportunities for automation.

Think of BeerXML recipes as those sets of rules.

While each BeerXML recipe will produce a different style and flavor of beer, the methods of storing those instructions to get to the finished product is the same across the board. From ingredients, equipment, and boil times—every step is cataloged in a BeerXML file, allowing software engineers to easily create integrations into the applications they are creating.

As an example, Ollie allows brewers to effortlessly import BeerXML recipes directly into their dashboard, saving time and prepwork when compared to manually entering ingredients. Request a demo today and our team can walk you through how easy it is to work with BeerXML files within Ollie.

Other apps and brewing hardware manufacturers have taken notice of how many professionals and homebrewers use BeerXML and are now developing their systems to integrate with the platform. From creating and maintaining raw material databases to allowing machine control through process automation, BeerXML recipes can allow your brewery to operate at maximum efficiency.

Return to top

How Do I Create a BeerXML Recipe?

While it may seem daunting at first, formatting a recipe in the BeerXML format is quite simple once you understand how the formatting works.

First, we’re going to break down the basics of formatting the file then we’ll provide an example of one full recipe as a boilerplate.

You can create your BeerXML files using any basic text editor, such as Notepad or Microsoft Word. With a text editor, simply use the “Save As” option and be sure to either save your document as an “XML” file or add “.xml” to the end of the file name.

Alternatively, there are many online XML editors that can provide increased visualization to help you understand and see the BeerXML structure better. One of those is provided by Tutorials Point and is located here.

Step 1: The BeerXML Header

Per XML file standards, every BeerXML file needs to contain the following header as the first line:

<!-- BeerXML Header - Needs to be first line of file --> 
<?xml version="1.0" encoding="ISO-8859-1"?>

Step 2: Understanding Records and Record Sets

After the initial header, you begin to build your recipe using a combination of records and record sets as your objects.

The difference between a record and an individual record set is quite simple:

A record set is your main category tag and a record is an individual object assigned and found within the aforementioned record set.

Think of it like a parent-to-child relationship.

The following are the available objects available in BeerXML files:

Recipes

Note: The recipe record will be your primary data object when compiling a complete BeerXML file as it will contain all available record sets to properly describe the ingredients, equipment, and other necessary components required to properly brew the recipe.

<RECIPES> <!-- START - Main record set --> 
  <RECIPE> <!-- START - Individual record -->
  <!-- Build your individual record between the tags -->
  </RECIPE><!-- END - Individual record -->
</RECIPES><!-- END - Main record set -->

Hops

Note: Defines all varieties of hops including boil time and form – pellet, plug, or leaf.

<HOPS> <!-- START - Main record set --> 
  <HOP> <!-- START - Individual record -->
  <!-- Build your individual record between the tags -->
  </HOP> <!-- END - Individual record -->
</HOPS> <!-- END - Main record set -->

Fermentables

Note: Contains all fermentable items including extracts, grains, sugars, honey, and fruits as well as timing on when to add them to the boil.

<FERMENTABLES> <!-- START - Main record set -->
  <FERMENTABLE> <!-- START - Individual record -->
  <!-- Build your individual record between the tags -->
  </FERMENTABLE> <!-- END - Individual record -->
</FERMENTABLES> <!-- END - Main record set -->

Yeasts

Note: Defines all yeasts including dry yeast, liquid yeast, and yeast starters.

<YEASTS> <!-- START - Main record set -->  
  <YEAST> <!-- START - Individual record -->
  <!-- Build your individual record between the tags -->
  </YEAST> <!-- END - Individual record -->  
</YEASTS> <!-- END - Main record set -->

Waters

Note: Used to create a water profile with the ability to define the amount of calcium, bicarbonate, sulfate, chloride, sodium, magnesium, and the PH level.

<WATERS> <!-- START - Main record set --> 
  <WATER> <!-- START - Individual record -->
  <!-- Build your individual record between the tags -->
  </WATER> <!-- END - Individual record -->
</WATERS> <!-- END - Main record set -->

Styles

Note: Allows you to designate the style of beer for the BeerXML recipe.

<STYLES> <!-- START - Main record set --> 
  <STYLE> <!-- START - Individual record -->
  <!-- Build your individual record between the tags -->
  </STYLE> <!-- END - Individual record -->
</STYLES> <!-- END - Main record set -->

Miscs

Note: Encompasses all non-fermentable ingredients like spices and water treatments.

<MISCS> <!-- START - Main record set --> 
  <MISC> <!-- START - Individual record -->
  <!-- Build your individual record between the tags -->
  </MISC> <!-- END - Individual record -->
</MISCS> <!-- END - Main record set -->

Mashs

Note: Used to create a mash profile. Can be used within a recipe data record or outside of one to specify the mash method to be used. The mash profile can also include the mash steps data record.

<MASHS> <!-- START - Main record set --> 
  <MASH> <!-- START - Individual record -->
  <!-- Build your individual record between the tags -->
  </MASHS> <!-- END - Individual record -->
</MASHS> <!-- END - Main record set -->

Mash Steps

Note: A record specifically used to denote a separate step in a multi-step mash. This is not intended to be used outside of a standard mash profile.

<MASH_STEPS> <!-- START - Main record set --> 
  <MASH_STEP> <!-- START - Individual record -->
  <!-- Build your individual record between the tags -->
  </MASH_STEP> <!-- END - Individual record -->
</MASH_STEPS> <!-- END - Main record set -->

Equipments

Note: An optional data record that provided detail needed to calculate total water usage and thermal parameters and utilization factors for large hop batches.

<EQUIPMENTS> <!-- START - Main record set --> 
  <EQUIPMENT> <!-- START - Individual record -->
  <!-- Build your individual record between the tags -->
  </EQUIPMENT> <!-- END - Individual record -->
</EQUIPMENTS> <!-- END - Main record set -->

Step 3: Putting It All Together

Here is an example of how a record set consisting of two hop records would look in a recipe:

<HOPS> 
  <HOP> 
  <!--  BUILD FIRST HOP HERE  -->
  </HOP> 
  <HOP> 
  <!--  BUILD SECOND HOP HERE  --> 
  </HOP> 
</HOPS>

Let’s break this down:

  1. First, we created the Hops record set using the opening <HOPS> tag
  2. Next, we added our first Hop using the opening <HOP> record tag
  3. After the opening tag, we would include all of the tags that help identify the hop
  4. Once we complete the first hop variety, we use the </HOP> closing tag
  5. To add our next Hop record, we repeat steps 2 through 4
  6. To wrap it all up, we close our Hops record set using the </HOPS> closing tag

This is a very simple overview of how to create the core structure of a BeerXML file. One thing to keep in mind: each record type has its own set of tags and formatting. All of that information and more can be found on the official BeerXML documentation.

Return to top

One Complete BeerXML Recipe Example

We’ve covered the basics of creating a BeerXML, now let’s take a look at a complete BeerXML recipe from start to finish.

The example below is a Dry Stout recipe provided by the BeerXML team. This example utilizes all of the data record sets and nearly every tag for each associated record.

<?xml version="1.0" encoding="ISO-8859-1"?>
<RECIPES>
  <RECIPE>
  <NAME>Dry Stout</NAME>
  <VERSION>1</VERSION>
   <TYPE>All Grain</TYPE>
   <BREWER>Brad Smith</BREWER>
   <BATCH_SIZE>18.93</BATCH_SIZE>
    <BOIL_SIZE>20.82</BOIL_SIZE>
    <BOIL_TIME>60.0</BOIL_TIME>
    <EFFICIENCY>72.0</EFFICIENCY>
   <TASTE_NOTES>Nice dry Irish stout with a warm body but low starting gravity much like the famous drafts.</TASTE_NOTES>
   <RATING>41</RATING>
    <DATE>3 Jan 04</DATE>
    <OG>1.036</OG>
    <FG>1.012</FG>
    <CARBONATION>2.1</CARBONATION>
    <CARBONATION_USED>Kegged</CARBONATION_USED>
    <AGE>24.0</AGE>
    <AGE_TEMP>17.0</AGE_TEMP>
    <FERMENTATION_STAGES>2</FERMENTATION_STAGES>
   <STYLE>
 <NAME>Dry Stout</NAME>
 <CATEGORY>Stout</CATEGORY>
 <CATEGORY_NUMBER>16</CATEGORY_NUMBER>
 <STYLE_LETTER>A</STYLE_LETTER>
 <STYLE_GUIDE>BJCP</STYLE_GUIDE>
 <VERSION>1</VERSION>
 <TYPE>Ale</TYPE>
 <OG_MIN>1.035</OG_MIN>
 <OG_MAX>1.050</OG_MAX>
 <FG_MIN>1.007</FG_MIN>
 <FG_MAX>1.011</FG_MAX>
 <IBU_MIN>30.0</IBU_MIN>
 <IBU_MAX>50.0</IBU_MAX>
 <COLOR_MIN>35.0</COLOR_MIN>
 <COLOR_MAX>200.0</COLOR_MAX>
 <ABV_MIN>3.2</ABV_MIN>
 <ABV_MAX>5.5</ABV_MAX>
 <CARB_MIN>1.6</CARB_MIN>
 <CARB_MAX>2.1</CARB_MAX>
              <NOTES>Famous Irish Stout.  Dry, roasted, almost coffee like flavor.  Often soured with pasteurized sour beer.  Full body perception due to flaked barley, though starting gravity may be low.  Dry roasted flavor.</NOTES>
  </STYLE>
  <HOPS>
  <HOP>
 <NAME>Goldings, East Kent</NAME>
 <VERSION>1</VERSION>
 <ALPHA>5.0</ALPHA>
 <AMOUNT>0.0638</AMOUNT>
<USE>Boil</USE>
 <TIME>60.0</TIME>
 <NOTES>Great all purpose UK hop for ales, stouts, porters</NOTES>
</HOP>
    </HOPS>
    <FERMENTABLES>
<FERMENTABLE>
 <NAME>Pale Malt (2 row) UK</NAME>
 <VERSION>1</VERSION>
 <AMOUNT>2.27</AMOUNT>
 <TYPE>Grain</TYPE>
<YIELD>78.0</YIELD>
 <COLOR>3.0</COLOR>
 <ORIGIN>United Kingdom</ORIGIN>
 <SUPPLIER>Fussybrewer Malting</SUPPLIER>
 <NOTES>All purpose base malt for English styles</NOTES>
 <COARSE_FINE_DIFF>1.5</COARSE_FINE_DIFF>
 <MOISTURE>4.0</MOISTURE>
 <DIASTATIC_POWER>45.0</DISASTATIC_POWER>
 <PROTEIN>10.2</PROTEIN>
 <MAX_IN_BATCH>100.0</MAX_IN_BATCH>
</FERMENTABLE>
<FERMENTABLE>
 <NAME>Barley, Flaked</NAME>
 <VERSION>1</VERSION>
 <AMOUNT>0.91</AMOUNT>
 <TYPE>Grain</TYPE>
<YIELD>70.0</YIELD>
 <COLOR>2.0</COLOR>
 <ORIGIN>United Kingdom</ORIGIN>
 <SUPPLIER>Fussybrewer Malting</SUPPLIER>
 <NOTES>Adds body to porters and stouts, must be mashed</NOTES>
 <COARSE_FINE_DIFF>1.5</COARSE_FINE_DIFF>
 <MOISTURE>9.0</MOISTURE>
 <DIASTATIC_POWER>0.0</DISASTATIC_POWER>
 <PROTEIN>13.2</PROTEIN>
 <MAX_IN_BATCH>20.0</MAX_IN_BATCH>
 <RECOMMEND_MASH>TRUE</RECOMMEND_MASH>
</FERMENTABLE>
<FERMENTABLE>
 <NAME>Black Barley</NAME>
 <VERSION>1</VERSION>
 <AMOUNT>0.45</AMOUNT>
 <TYPE>Grain</TYPE>
<YIELD>78.0</YIELD>
 <COLOR>500.0</COLOR>
 <ORIGIN>United Kingdom</ORIGIN>
 <SUPPLIER>Fussybrewer Malting</SUPPLIER>
 <NOTES>Unmalted roasted barley for stouts, porters</NOTES>
 <COARSE_FINE_DIFF>1.5</COARSE_FINE_DIFF>
 <MOISTURE>5.0</MOISTURE>
 <DIASTATIC_POWER>0.0</DISASTATIC_POWER>
 <PROTEIN>13.2</PROTEIN>
 <MAX_IN_BATCH>10.0</MAX_IN_BATCH>
</FERMENTABLE>
 </FERMENTABLES>
 <MISCS>
 <MISC>
 <NAME>Irish Moss</NAME>
 <VERSION>1</VERSION>
 <TYPE>Fining</TYPE>
 <USE>Boil</USE>
 <TIME>15.0</TIME>
 <AMOUNT>0.010</AMOUNT>
 <NOTES>Used as a clarifying agent during the last few minutes of the boil</NOTES>
</MISC>
 </MISCS>
 <WATERS>
<WATER>
 <NAME>Burton on Trent, UK</NAME>
 <VERSION>1</VERSION>
 <AMOUNT>20.0</AMOUNT>
 <CALCIUM>295.0</CALCIUM>
 <MAGNESIUM>45.0</MAGNESIUM>
 <SODIUM>55.0</SODIUM>
 <SULFATE>725.0</SULFATE>
 <CHLORIDE>25.0</CHLORIDE>
 <BICARBONATE>300.0</BICARBONATE>
 <PH>8.0</PH>
 <NOTES> Use for distinctive pale ales strongly hopped.  Very hard water accentuates the hops flavor. Example: Bass Ale
</NOTES>
</WATER>
  </WATERS>
 <YEASTS>
<YEAST>
 <NAME>Irish Ale</NAME>
 <TYPE>Ale</TYPE>
<VERSION>1</VERSION>
 <FORM>Liquid</FORM>
 <AMOUNT>0.250</AMOUNT>
<LABORATORY>Wyeast Labs</LABORATORY>
 <PRODUCT_ID>1084</PRODUCT_ID>
 <MIN_TEMPERATURE>16.7</MIN_TEMPERATURE>
<MAX_TEMPERATURE>22.2</MAX_TEMPERATURE>
<ATTENUATION>73.0</ATTENUATION>
<NOTES>Dry, fruity flavor characteristic of stouts.  Full bodied, dry, clean flavor. </NOTES>
 <BEST_FOR>Irish Dry Stouts</BEST_FOR>
 <FLOCCULATION>Medium</FLOCCULATION>
</YEAST>
 </YEASTS>
<MASH>
 <NAME>Single Step Infusion, 68 C</NAME>
 <VERSION>1</VERSION>
 <GRAIN_TEMP>22.0</GRAIN_TEMP>
<MASH_STEPS>
    <MASH_STEP>
            <NAME>Conversion Step, 68C </NAME>
            <VERSION>1</VERSION>
            <TYPE>Infusion</TYPE>
            <STEP_TEMP>68.0</STEP_TEMP>
            <STEP_TIME>60.0</STEP_TIME>
<INFUSE_AMOUNT>10.0</INFUSE_AMOUNT>
      </MASH_STEP>
 </MASH_STEPS>
</MASH>
</RECIPE>
</RECIPES>

Click here to download

Return to top

The Official BeerXML Documentation

To ensure the preservation of BeerXML our team has created mirrors for all of the official documentation and examples provided by the BeerXML team:

Official BeerXML Documentation

Click Here to Download

Official BeerXML Examples

Return to top

The 6 Best Practices for BeerXML

Since the main goal of BeerXML is to create a standardized data structure, certain requirements and suggested best practices should be followed to ensure consistency and compatibility.

1. Weight Measurements and Units

When inputting weights into your data records ensure all weights are measured in Kilograms (kg).

2. Volume Measurements and Units

When creating a BeerXML file, all volumes must be entered in as Liters (l).

3. Temperature Units

Celsius is the primary temperature measuring unit for BeerXML files.

4. Time Measurements

All times will be measured in minutes – unless specifically requested by a specific tag.

5. Pressure Measurements and Units

Kilopascals (kPa) is the primary measurement for pressure when creating BeerXML recipes.

6. Use Comments

You can use the XML comment syntax to add notes to your BeerXML files. These will be ignored by any importing applications and can provide guidance for your team or anyone with whom you share your recipes.

To insert a comment, use the following template:

<!-- This is an example of a comment in XML format -->

Return to top

Where Can I Find BeerXML Recipes?

A flight of beers created from BeerXML recipes

Sydney | Adobe Stock

The beauty of BeerXML is that you can easily find and share recipes with other brewers online with ease. There are many websites and online communities that allow you to download BeerXML recipes for your own use. Here are a few:

Note: It’s always in your best interest to manually review any recipe prior to brewing to ensure all formatting is correct.

BeerSmith Recipe Cloud

https://beersmithrecipes.com/

Brew-Monkey

http://brew-monkey.com/recipes/recipes.php

Brew Dog Recipes

https://brewdogrecipes.com/

Return to top

What Is the Future of BeerXML?

A male and female brewer take a break after creating a new batch using BeerXML recipes

Seventyfour | Adobe Stock

BeerXML is the most popular way of digitally archiving beer recipes and is especially useful in software development for brewery related applications.

However, a look at the official BeerXML website shows a dormant development cycle with no hints to when BeerXML 2 is going to drop, if ever.

Outside of the brewery world, XML is dropping out of favor and many software developers now use JSON as their primary object notation of choice. There are a few open source projects with the goal to bring beer recipes into the JSON format, and while actively in development, many haven’t been widely adopted yet.

It sounds like we’re painting a grim picture, but sometimes the saying “if it ain’t broke, dont’ fix it” applies – and it certainly does to BeerXML. For the time being, BeerXML isn’t going anywhere, so it makes sense that it remains a useful tool in your brewing arsenal.

Plus, given the flexible nature of XML, if a new standard does start to appear, you can rest assured that there will be an effortless method of converting all of your existing BeerXML recipes into that new format.

Ready to Organize and Import Beer Recipes Into Ollie?

Get started with Ollie, a brewery management software built by brewers, for brewers. Ollie allows you to import existing BeerXML recipes for easy material management and brew day logging.

Contact our team today for more information and a free demo.

Return to top

Image

About The Author

Kyle Kensrue

Kyle Kensrue is a Brewery Solutions - Account Executive at Next Glass.

He worked in the hospitality industry for 10 years before moving over to the brewing world. As Director of Operations at Randolph Beer (Brooklyn, NY) he was in charge of developing their brewing program, to go along with their established bar and restaurant group. He also spent time as the Director of Operations at the award-winning Gun Hill Brewing (Bronx, NY).

Kyle is a Certified Cicerone® and former President of the NYC Brewers Guild.

More From Kyle

Don't miss any of our posts! Sign-up for the Ollie newsletter