Open BAFU/UVEK life-cycle inventories for food-processing steps — juice extraction, pulping, pasteurisation, concentration, drying (hot-air / drum / spray / freeze / sundrying), milling, extrusion, oil extraction & refining, plant-drink processing, canning, separation — per kg processed product, characterised with EF 3.1 (BAFU) (16 categories), IPCC 2021 GWP100 and Ecological Scarcity 2021 UBP.
The point: every node imports into a fresh Brightway project with no ecoinvent, no biosphere3, no EDB — nothing licensed. A clean-room verifier proves it, it isn't just asserted. A native-open alternative to a licensed (ecoinvent 3.3 / Agribalyse v1.2) processing background you can actually publish results on.
| Shipped inventories | 509 self-contained processing nodes (of 608 mapping entries) |
| Self-containment | no ecoinvent · no biosphere3 · no EDB — verify_self_contained.py: PASS |
| Functional unit | 1 kg processed product, factory gate |
| Scope split | 284 gate-to-gate (substrate unbound) · 225 cradle-to-gate proxy (upstream baked in) |
| Coverage | 509 / 608 OGD-closeable · 99 excluded on purpose (not relabelled as open) |
| Climate (EF 3.1 BAFU) | median 1.0681 · range 0.0002–30.1536 kg CO₂eq/kg |
| Methods | EF 3.1 (BAFU) 16-cat (recommended) · IPCC 2021 GWP100 · Ecological Scarcity 2021 UBP · GLAM (midpoint only) |
| Identity | GADM + food-taxonomy sediment terms (FoodOn / FoodEx2 / AGROVOC …); FoodOn crosswalk via zhaw-fcm-bridge |
| License | Code Apache-2.0 · Data CC-BY-4.0 |
| Background | BAFU/UVEK 2026 closure · BAFU:2026 method CFs · shared bafu_biosphere |
→ Project status & completeness report — every number above is regenerated from the shipped artifacts (coverage, provenance, node impacts), so this page cannot drift from the dataset.
→ How the cascades are built — full provenance & a worked example — every multi-step chain (juice → concentrate → powder; seed → meal → isolate → textured protein; grain → flour → pasta), the study behind each processing step, and one fully-traced example (1 kg orange juice concentrate ← 14.9 kg oranges). Regenerated from the live code + data.
→ Review register — every distinct process, listed once — for scientific reviewers: the shared processes behind the chains, deduplicated to one row each with a stable review ID and the list of every product that reuses them, plus the PEF-style pedigree (data-quality) rating per unit and an honest, reuse-ranked list of the units that still lack one. Also as CSV and JSON.
→ What to review first — parameter influence — every parameter ranked by how much the final result moves if it is 10 % wrong, across all 85 products, verified against real ±10 % rebuilds. Includes the substrate properties (Brix targets, juice yields, moisture contents) that drive the mass balance, with their sources — and a short list where high influence meets weak provenance. Also as CSV and JSON.
Source repository (public, Apache-2.0 code / CC-BY-4.0 data): gitlab.com/eos-lci/lci-food-processing — generators, tests, and the release pipeline that produced this package.
A single fully-transparent node — loaded live from the shipped node_impacts.json. If this doesn't render, the JSON is still the source of truth.
| loading… |
Firefly registers the EF 3.1 / GLAM / UBP / GWP100 methods automatically and renders each node's sediment identity + inline provenance. No Python, no methods file, nothing else to install.
load_food_processing.py
with the package and the methods_cf.json
(Brightway can't carry methods inside a package) — see the snippet below.;, cp1252).verify_self_contained.py
to prove in a throwaway project that the package is OGD-only, not collapsed, and computable.The methods file + loader are only for the Brightway route — Firefly users never need them. Elementary-flow crosswalk: the openLCA/SimaPro flows carry our own UUIDs and are mapped onto the target tool's reference biosphere by name / category / CAS on import.
Gate-to-gate processing ONLY. This replaces the processing background.
Upstream agriculture is a SEPARATE layer. Each node's scope_marker tells you the
double-counting rule — this is the most important field for getting a correct result:
gate_to_gate (284 nodes) — the substrate flow is left
unbound; add your own farm-gate input. The node's own EF 3.1 climate
is processing energy only, so it can read small / near-zero until you supply the substrate.cradle_to_gate_proxy (225 nodes) — upstream is baked in;
do NOT add an upstream input again or you double-count.99 of 608 mapping entries are deliberately NOT in the package.
65 link their upstream substrate back into ecoinvent / EDB, so they cannot be closed against open
data; 34 are pure pass-through nodes with nothing of their own to ship. We exclude them rather
than fabricate a technosphere anchor or relabel a licensed node as
open — which is exactly why the self-contained verifier passes on the 509 that ship. The
exclusions are recorded with their exact leaf database and reason in
coverage.json (excluded_non_ogd).
Nothing in the package is a placeholder dressed up as a measured inventory.
Each shipped inventory is linked, where a defensible link exists, to a per-100 g energy + macronutrient profile from national food-composition databases (lci-nutrients, FAO/INFOODS tagnames). That is the missing half of a nutrient-density or calorie-allocation calculation: the impact side is per kg of product, the nutrient side is per 100 g of the food. Download: food_processing_nutrients.csv · food_processing_nutrients.json.
The join runs on identity, not on names. Every node already carries its
FoodEx2 / FoodOn / AGROVOC terms in sediment.terms; the nutrient layer
consumes exactly that shape. Where the two vocabularies disagree on which code names a food,
the esfc-glossary term store bridges code → name → code.
Each row records which tier answered:
sediment_direct — the node's own term is known to the nutrient layer. Strongest.glossary_name — the term was unknown; esfc-glossary supplied its name, which resolved. Still term-anchored.embedding — no term path; the food name was embedded and matched semantically. Carries embedding_cosine.Read the cosine correctly — this matters. embedding_cosine is
published because it is useful for ordering a review queue. It is not a
correctness probability, and we will not present it as one: the upstream measured similarity
over 109 labelled links and found it indistinguishable between correct and wrong
picks (0.857 vs 0.869). In this very dataset a cosine of 1.0 matched pizza
dough to “Biscuits”. Threshold on identity_verified first (rare, but ~100% precise),
then the tier, then match_confidence (advisory, ~56% precision against a 41% base
rate) — and use the cosine only to sort what is left.
A withheld number beats a wrong one. Matches are rejected — and ship with their evidence but no nutrients — when the identity check says it is a different food, when the matched label is a bare qualifier (“raw”, “fresh”) that carries no food identity, or when the cosine falls below a credibility floor. That last guard exists because a 50–63% fat spread was being matched to a row labelled “raw” at 34 kcal, a ~20× energy error.
Scope: nutrients describe the FOOD, are taken from published national tables,
and carry no LCA burden — they are metadata beside the inventory, never inside it.
A gate_to_gate and a cradle_to_gate_proxy node for the same food get the
same profile; scope_marker governs the impact side only. Values are a multi-country
weighted-median blend, and national tables genuinely differ in energy conversion factors and
recipe procedure, so the spread in uncertainty is irreducible — reported, not averaged away.
Shipped nodes carry sediment.terms identity — a GADM location term plus
food-taxonomy terms (FoodOn, FoodEx2, AGROVOC, LangUaL, HESTIA) — so a node can
be matched to a product by taxonomy ID, independent of the ecoinvent UUID. Coverage is
per-namespace (GADM on nearly all nodes; the food-taxonomy terms on many, not all — see
status for exact per-namespace counts), not "every node carries every
namespace." A standalone FoodOn ↔ FoodEx2 / HESTIA crosswalk and derived food
footprints are published separately: zhaw-fcm-bridge.
EF 3.1 (BAFU) is the recommended method family and the one we stand behind; IPCC 2021 GWP100 and Ecological Scarcity 2021 (UBP) are shipped alongside. GLAM midpoint Climate Change agrees with EF 3.1 / GWP100 to ~1% (a nice cross-check). GLAM damage / endpoint methods currently read near-zero (~1e-15) on these BAFU-anchored inventories because the agriculture-dominant flows are not yet fully bridged into the GLAM BAFU companion — treat those as an unbridged-flow artifact, not a result. They ship for completeness but are not yet reliable.
Version note: the processing technosphere and the method CFs are both
BAFU:2026 v1 (the source bafu DB was refreshed to the 2026 vintage on 2026-07-24;
11,947 activities, code-identical to bafu_2026). The former 2025-technosphere /
2026-CF drift caveat is resolved; CFs bind by (bafu_biosphere, code).
Stated in full in coverage.json + status.html.
;, cp1252).pip install brightway25
python load_food_processing.py --project my_project \
--package food_processing_inventory.bw2package \
--methods food_processing_methods_cf.json
Code Apache-2.0; data CC-BY-4.0. Built on BAFU/UVEK Open Government Data (Database of the Swiss Federal Administration, BAFU 2026) + Eaternity tributary LCIs. No ecoinvent data included.