Rezepte austauschen – das Format brotxml
Wie Rezepte, Sauerteige, Backprotokolle und Vorrat in einer Datei Platz finden, wie Versionen und Herkunft festgehalten werden und wie Duplikate beim Einlesen erkannt werden.
Rezepte wandern: von der Website ins eigene Notizbuch, von der Nachbarin zu dir, vom alten Rechner auf den neuen. brotxml ist ein Dateiformat, mit dem Laibhaftig alles, was beim Backen anfällt, vollständig und verlustfrei weitergeben kann – Rezepte samt Versionsgeschichte, Zutaten, Sauerteige mit Fütterungsprotokoll, Backprotokolle, Backpläne und den Vorrat. Dieses Kapitel erklärt den Aufbau so, dass du eine Datei lesen und notfalls von Hand schreiben kannst.
Warum ein eigenes Format?#
Für Rezepte gibt es bereits das Web-Format schema.org/Recipe. Es reicht, um ein Rezept auf einer Website auszuzeichnen, kennt aber weder Vorstufen mit eigener Reifezeit noch Teigtemperaturen, Bäckerprozente, einen Ofenverlauf mit Schwaden oder ein Fütterungsprotokoll. Wer damit Brotrezepte austauscht, verliert genau die Angaben, auf die es beim Brotbacken ankommt.
brotxml schreibt deshalb alles auf, was ein Brotrezept ausmacht, und bleibt dabei:
- lesbar – XML mit deutschen Inhalten und sprechenden englischen Elementnamen;
- überprüfbar – ein dokumentiertes XML-Schema legt verbindlich fest, was gültig ist;
- erweiterbar – neue Angaben lassen sich ergänzen, ohne ältere Programme zu stören;
- versioniert – jede Datei sagt, nach welcher Fassung des Formats sie geschrieben ist.
Aufbau einer Datei#
Eine brotxml-Datei hat die Endung .brotxml (gepackt auch .brotxml.gz). Das Wurzelelement heißt brot und trägt den Namensraum des Formats, die Formatversion, den Zeitpunkt der Erstellung und das erzeugende Programm. Darunter folgen beliebig viele der folgenden Abschnitte:
| Abschnitt | Inhalt |
|---|---|
meta |
Titel, Beschreibung und Lizenz der Sammlung (optional) |
ingredients |
Zutaten mit Kategorie, Getreide, Typenzahl, Zusammensetzung, Glutenstatus |
recipes |
Rezepte mit allen (oder der aktuellen) Versionen |
starters |
Sauerteige mit Fütterungsschema, Kalibrierung und Fütterungen |
bakes |
Backprotokolle mit Bedingungen, Bewertungen und Fotos |
plans |
Backpläne mit Zeitpunkten der Arbeitsschritte |
pantry |
Vorrat mit Mengen, Mindestbestand und Mindesthaltbarkeit |
Jeder Eintrag trägt dieselben Grundangaben: eine Austausch-ID (uid), die Zeitpunkte created und modified, die Sichtbarkeit und unter provenance die Herkunft – wann, wie und von wem er in eine Datenbank gelangt ist (von Hand angelegt, Startsammlung, von einer Webseite importiert, aus einer Datei eingelesen, abgeleitet …). Diese Kette wächst mit jedem Austausch und zeigt auch nach Jahren noch, woher ein Rezept stammt.
Einheiten#
Damit beim Austausch nichts verrutscht, gelten feste Einheiten: Mengen in Gramm, Temperaturen in Grad Celsius, Dauern als ISO-8601-Dauer (PT12H = 12 Stunden, PT7M30S = 7½ Minuten) und Zeitpunkte als ISO-Datum mit Zeitzone. Dezimalzahlen stehen mit Punkt (66.7). Was sich nicht in Gramm ausdrücken lässt („1 Prise“, „nach Bedarf“), steht als Text in amount-text.
Ein Rezept in brotxml#
Ein Rezept besteht aus Stammdaten (Titel, Kategorie, Triebmittel, Quelle, Schlagwörter) und einer oder mehreren Versionen. Jede Version enthält die Stufen – Vorteige, Sauerteige, Quell- und Brühstücke und den Hauptteig – mit ihren Zutatenzeilen und Arbeitsschritten, dazu den Ofenverlauf und berechnete Kennzahlen. So sieht ein gekürztes Roggenmischbrot aus:
<?xml version="1.0" encoding="UTF-8"?>
<brot xmlns="https://laibhaftig.familie-steinberg.org/ns/brotxml/1"
version="1.0" created="2026-10-19T18:30:09+00:00" generator="Laibhaftig 1.0" lang="de">
<recipes>
<recipe uid="3795da3a-496b-47bf-8970-ece64fc33c18" visibility="private"
created="2026-10-19T18:30:09+00:00" modified="2026-10-19T18:30:09+00:00">
<title>Roggenmischbrot 60/40</title>
<classification category="mixed" leavening="sourdough" origin="own" gluten="contains"/>
<provenance>
<acquired via="manual" at="2026-10-19T18:30:09+00:00" by="beispiel"/>
</provenance>
<versions current="1">
<version number="1" created="2026-10-19T18:30:09+00:00">
<yield pieces="1" piece-weight="860"/>
<stages>
<stage key="s1" type="sourdough">
<name>Roggensauerteig</name>
<ripening duration="PT12H" temp="20" ta="200"/>
<line amount="200" bakers-percent="39.22">
<ingredient ref="laibhaftig:zutat:roggenmehl-1150">Roggenmehl 1150</ingredient>
</line>
<line amount="200" temp="45"><ingredient>Wasser</ingredient></line>
<line amount="20"><ingredient>Roggenanstellgut TA 200</ingredient></line>
<step kind="rest" duration="PT12H" temp="20" scalable="true">12 Stunden reifen lassen</step>
</stage>
<stage key="s2" type="main" main="true">
<name>Hauptteig</name>
<line from-stage="s1"><ingredient>gesamter Sauerteig</ingredient></line>
<line amount="300"><ingredient>Weizenmehl 1050</ingredient></line>
<line amount="130"><ingredient>Wasser</ingredient></line>
<line amount="10"><ingredient>Salz</ingredient></line>
<step kind="action" duration="PT10M">Kneten</step>
<step kind="rest" duration="PT1H" temp="24" scalable="true">Stückgare</step>
<step kind="bake" duration="PT55M">Backen</step>
</stage>
</stages>
<oven>
<phase temp="250" duration="PT10M" steam="true"/>
<phase temp="210" duration="PT45M" vent="true"/>
</oven>
</version>
</versions>
</recipe>
</recipes>
</brot>
Einige Details:
- Jede Stufe hat einen Schlüssel (
key). Überfrom-stageholt der Hauptteig die fertige Vorstufe herein; das Schema prüft, dass es diese Stufe wirklich gibt. refverweist auf eine Zutat im Abschnittingredients(oder im Zutatenkatalog des Empfängers). Der Text im Element bleibt erhalten, so wie er im Rezept steht – auch wenn der Empfänger die Zutat nicht kennt.scalable="true"markiert Ruhezeiten, die der Backplaner verlängern oder verkürzen darf;min-factorundmax-factorbegrenzen das.bakers-percentund die Kennzahlen untermetricssind berechnet und dienen nur zur Kontrolle. Beim Einlesen rechnet Laibhaftig sie aus den Grammangaben neu. Mehl ist dabei per Definition immer 100 % – siehe Bäckerprozente.- Fotos stehen entweder als Verweis (
href) oder eingebettet (Base64) in der Datei.
Versionen des Formats#
Die Hauptversion steckt im Namensraum (…/ns/brotxml/1), die Unterversion im Attribut version („1.0“, „1.1“ …). Das bedeutet:
- Eine neue Unterversion fügt nur hinzu – neue optionale Elemente, Attribute oder Auswahlwerte. Ein Programm für 1.0 liest eine 1.3-Datei und übergeht, was es nicht kennt.
- Eine neue Hauptversion (neuer Namensraum) ist nur nötig, wenn sich die Bedeutung bestehender Angaben ändert. Ältere Programme erkennen dann sofort, dass sie die Datei nicht verstehen, statt sie falsch zu lesen.
Wer eigene Angaben ergänzen möchte, hat zwei Wege, die das Schema ausdrücklich erlaubt: Elemente und Attribute in einem eigenen Namensraum (zum Beispiel <meine:mehlcharge>) an jeder Stelle, an der das Schema „weitere Angaben“ vorsieht – und Auswahlwerte mit dem Präfix x- (etwa category="x-fladen"), wenn die vorgegebenen Werte nicht passen.
Duplikate erkennen#
Beim Einlesen prüft Laibhaftig jeden Eintrag, bevor sich etwas ändert, und zwar in dieser Reihenfolge:
- Gleiche Austausch-ID – derselbe Eintrag, der schon einmal exportiert oder eingelesen wurde.
- Gleiche Quelle – dasselbe Rezept von derselben Webseite.
- Gleicher Titel und mindestens 80 % gleiche Zutatenzeilen – ein Rezept, das auf anderem Weg schon da ist.
Ist der Inhalt identisch, steht der Eintrag als „unverändert vorhanden“ in der Vorschau und wird übersprungen. Weicht er ab, entscheidest du für jeden Eintrag (oder für alle auf einmal):
| Wahl | Was passiert |
|---|---|
| beide behalten | Bei eigenen Rezepten wird der Inhalt aus der Datei eine neue Version – die Geschichte bleibt vollständig. Bei fremden Rezepten entsteht eine eigene Kopie. Andere Einträge werden zusätzlich angelegt. |
| jüngere Version behalten | Was zuletzt bearbeitet wurde, gewinnt: Ist die Datei jünger, wird sie übernommen (bei Rezepten als neue Version), sonst bleibt alles, wie es ist. |
| bestehende behalten | Der Eintrag aus der Datei wird ignoriert. |
Eingelesene Einträge sind zunächst privat. Wer die Sichtbarkeit aus der Datei übernehmen möchte, setzt beim Hochladen das entsprechende Häkchen.
Sicherheit#
Eine Datei aus fremder Hand darf nichts anrichten. Laibhaftig lehnt deshalb DOCTYPE- und ENTITY-Deklarationen ab, lädt nie etwas aus dem Netz nach, begrenzt die Dateigröße (auch entpackt) und prüft jede Datei gegen das Schema, bevor sie gelesen wird. Hochgeladene Dateien liegen bis zur Entscheidung außerhalb des öffentlichen Bereichs und werden nach dem Import gelöscht.
Das Schema#
Das vollständige, kommentierte XML-Schema steht unter /austausch/brotxml-1.0.xsd bereit. Jedes Element und jeder Auswahlwert ist dort auf Deutsch beschrieben. Mit jedem XML-Werkzeug lässt sich eine Datei damit prüfen, zum Beispiel:
xmllint --noout --schema brotxml-1.0.xsd meine-rezepte.brotxml
Sichern und umziehen
Unter Import & Export lädst du alle deine Daten in einer Datei herunter – mit Fotos, Fütterungen und allen Rezeptversionen. Das ist die einfachste Sicherung und der bequemste Weg, deine Rezepte in eine andere Laibhaftig-Installation mitzunehmen.