Skip to content

Your first run

By the end of this you will have printed a sauce derivation tree, built from a cookbook published in 1907, with nothing installed but Python.

Before you start

You need Python 3.12 or newer and uv. You do not need a GPU, an API key, a database, or a network connection — the source text is committed to the repository.

Get the code

$ git clone https://github.com/Alberto-Codes/saucier
$ cd saucier
$ uv sync

Read the book

$ uv run saucier parse

You should see something like:

source      escoffier-1907
mothers     bechamel, espagnole, hollandaise, tomato, veloute
sauces      124
derived     50 linked to a stated parent
unresolved  74 state no base in their prose

Three things happened.

The five mothers were not supplied by us. Escoffier lists his own base sauces, the parser found that sentence, and read them out of it.

124 sauces were extracted from roughly 3,000 numbered entries. The rest are stocks, garnishes, soups, and dishes. An entry gets in when its heading says "sauce", or when it names a mother inside a chapter Escoffier titles as sauces.

74 unresolved is the honest score, and it is the most interesting number on the screen. A parser cannot read a derivation the author never wrote down.

$ uv run saucier tree espagnole
BROWN SAUCE OR ESPAGNOLE  [espagnole]
├── LENTEN ESPAGNOLE  (fr)
│   └── GENEVOISE SAUCE  (en)
├── ORDINARY POIVRADE SAUCE  (en)
│   └── REFORM SAUCE  (en)
└── POIVRADE SAUCE FOR VENISON  (en)

The tag after each name is the language its title is written in. The tree has depth because a parent may be any catalogued preparation, not only a mother: Genevoise states Lenten Espagnole, and Lenten Espagnole states Espagnole. Try hollandaise or veloute too.

Look one up

$ uv run saucier show bordelaise
SAUCE BORDELAISE
entry 32, line 1680
  term  SAUCE BORDELAISE  [fr]  sauce-bordelaise
  parent  (unresolved)

You asked for bordelaise. Escoffier writes SAUCE BORDELAISE, French word order, and the lookup handled it.

Bordelaise states no base of its own, yet Marrow Sauce states Bordelaise:

$ uv run saucier tree bordelaise
SAUCE BORDELAISE  [bordelaise]
└── MARROW SAUCE  (en)

A tree can root in an unresolved sauce. The record keeps both claims apart: what the source said, and what it never wrote down.

Now check the parser's work. line 1680 is a line in the file on disk:

$ sed -n '1680p' corpus/escoffier-1907.txt
32—SAUCE BORDELAISE

Every claim in the output is traceable that way.

What you have

A JSON catalogue at data/escoffier-1907.json, reproducible from the committed corpus at any time. data/ is not tracked, because anything in it can be regenerated by running parse again.

Next

Read why there is no model in this yet. The 74 unresolved preparations are the reason there will be one.