org-mode kombucha

Posted: September 04, 2025
Categories: food, orgmode

I've been making kombucha for some time now. The science is very much non-exact and fascinating. To keep track of experiments, I use a self-contained org-mode file.

Kombucha 101

Kombucha is a fermented drink, made with SCOBY (Symbiotic Culture Of Bacteria and Yeast), tea, sugar and water. The resulting ferment is fizzy, acidic, sweet, and makes for a deliciously refreshing drink.

I've been using variations of this simple state machine recipe:

  • Jar, with breathable cloth cover, 1 week, ambient temperature:
    • SCOBY
    • 0.1 liter of previous batch
    • 1 liter of water
      • 8 grams of black tea, infused
      • 75 grams of sugar, dissolved
  • Bottle, airtight, 1 week, ambient temperature
  • Fridge

State transitions are naturally JarBottleFridge.

The week cycle is convenient if, like me, you have a set time every week for state transition duties, i.e. moving the jar content to a bottle and preparing a new jar.

Adjusting parameters (such as quantity of sugar, fermenting time, temperature) and experimenting with additional ingredients (usually fruits) allows to play with a large number of variations and obtain a different drink for every batch.

Bootstrapping requires obtaining a SCOBY and a bit of kombucha from a friend already brewing – which is ideal because SCOBYs grow and fork after a while, and we don't want to waste anything. Alternatively, starter kits can be purchased in stores or online.

Capturing state and properties

Time for org-mode! Each batch is an org-mode node, with a state, properties, and additional notes if necessary.

* JAR Batch #4...
* BOTTLE Batch #3...
* FRIDGE Batch #2...
* PAST Batch #1...

The state of a batch is captured with the following sequence of todo keywords:

#+TODO: JAR | BOTTLE(!) FRIDGE(!) PAST(!)

A batch starts in a jar, moves to one or more bottles after a week, moves to the fridge after another week, is being consumed (the best part!), and then archived.

A batch has some attributes:

* FRIDGE Batch #2
CLOSED: [2025-08-17 Sun 21:00] DEADLINE: <2025-08-17 Sun>
:PROPERTIES:
:JAR_AT: [2025-08-10 Sun]
:JAR: 1
:SUGAR: 60
:INGREDIENTS: nil
:BOTTLE_AT: [2025-08-17 Sun]
:BOTTLE: 1
:RATING: 8
:END:
:LOGBOOK:
- State "FRIDGE"     from "BOTTLE"     [2025-08-24 Sun 21:00]
- State "BOTTLE"     from "JAR"        [2025-08-17 Sun 21:00]
:END:

The node properties mirror my process of having a couple jars, a few bottles, and playing with sugar, fermentation time and ingredients.

Additionally, a batch has a DEADLINE (to remember to move it from Jar to Bottle) showing up in the agenda, and a log book to keep track of state transitions.

Dashboards

I use 2 columnview to display current and archived batches.

#+COLUMNS: %TODO(State) %ITEM(Item) %JAR_AT(Jarred at) %JAR(J) %SUGAR(Sugar) %INGREDIENTS(Ing) 
%BOTTLE_AT(Bottled at) %BOTTLE(B) %RATING(RTG)

#+BEGIN: columnview :id "file:kombucha.org" :hlines 1 :match "TODO<>{PAST}"
#+CAPTION: Current kombucha ferments
| State  | Item     | Jarred at        | J | Sugar | Ing   | Bottled at       | B | RTG | 
|--------+----------+------------------+---+-------+-------+------------------+---+-----| 
| JAR    | Batch #4 | [2025-08-24 Sun] | 1 |    70 | apple |                  |   |     | 
|--------+----------+------------------+---+-------+-------+------------------+---+-----| 
| BOTTLE | Batch #3 | [2025-08-17 Sun] | 1 |    60 | nil   | [2025-08-24 Sun] | 1 |     | 
|--------+----------+------------------+---+-------+-------+------------------+---+-----| 
| FRIDGE | Batch #2 | [2025-08-10 Sun] | 1 |    60 | nil   | [2025-08-17 Sun] | 1 |   8 | 
#+END:

#+BEGIN: columnview :id "file:kombucha.org" :hlines 1 :match "TODO={PAST}"
#+CAPTION: Past kombucha ferments
| State | Item     | Jarred at        | J | Sugar | Ing | Bottled at       | B | RTG | 
|-------+----------+------------------+---+-------+-----+------------------+---+-----| 
| PAST  | Batch #1 | [2025-08-03 Sun] | 1 |    75 | nil | [2025-08-10 Sun] | 1 |   7 | 
#+END:

This is convenient to quickly figure out what is currently fermenting or ready to drink, and to recall the parameters that led to the best batches.

Putting it together

I really like the self-contained approach of a file containing a capture template, some configuration, raw data, and rendered tables. It makes it easy to share with fellow emacs kombucha brewers: find the template there, and if you think of improvements, don't hesitate to report back.

#+BEGIN: columnview :id "file:kombucha.org" :hlines 1 :match "TODO<>{PAST}"
#+CAPTION: Current kombucha ferments
| State  | Item     | Jarred at        | J | Sugar | Ing   | Bottled at       | B | RTG | 
|--------+----------+------------------+---+-------+-------+------------------+---+-----| 
| JAR    | Batch #4 | [2025-08-24 Sun] | 1 |    70 | apple |                  |   |     | 
|--------+----------+------------------+---+-------+-------+------------------+---+-----| 
| BOTTLE | Batch #3 | [2025-08-17 Sun] | 1 |    60 | nil   | [2025-08-24 Sun] | 1 |     | 
|--------+----------+------------------+---+-------+-------+------------------+---+-----| 
| FRIDGE | Batch #2 | [2025-08-10 Sun] | 1 |    60 | nil   | [2025-08-17 Sun] | 1 |   8 | 
#+END:

#+BEGIN: columnview :id "file:kombucha.org" :hlines 1 :match "TODO={PAST}"...

* JAR Batch #4
DEADLINE: <2025-08-31 Sun>
:PROPERTIES:
:JAR_AT: [2025-08-24 Sun]
:JAR: 1
:SUGAR: 70
:INGREDIENTS: apple
:BOTTLE_AT:
:BOTTLE:
:RATING:
:END:

* BOTTLE Batch #3...
* FRIDGE Batch #2...
* PAST Batch #1...


  8: 0 -kombucha.org                                 Bot :master Org Proj[org] Wrap

React on Mastodon