Food-processing gate-to-gate LCI — self-contained & open

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 inventories509 self-contained processing nodes (of 608 mapping entries)
Self-containmentno ecoinvent · no biosphere3 · no EDB — verify_self_contained.py: PASS
Functional unit1 kg processed product, factory gate
Scope split284 gate-to-gate (substrate unbound) · 225 cradle-to-gate proxy (upstream baked in)
Coverage509 / 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
MethodsEF 3.1 (BAFU) 16-cat (recommended) · IPCC 2021 GWP100 · Ecological Scarcity 2021 UBP · GLAM (midpoint only)
IdentityGADM + food-taxonomy sediment terms (FoodOn / FoodEx2 / AGROVOC …); FoodOn crosswalk via zhaw-fcm-bridge
LicenseCode Apache-2.0 · Data CC-BY-4.0
BackgroundBAFU/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.

One worked node (so you can sanity-check us)

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…

How to use it — two routes

Recommended · no code

In Firefly (no-code web app)

  1. Download food_processing_inventory.bw2package
  2. In Firefly: New Project → Import from a .bw2package → choose the file
  3. Open a processing node, pick an impact method (e.g. EF 3.1 (BAFU) — Climate Change)

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.

For LCA practitioners

In your own Brightway / openLCA / SimaPro

  1. Brightway: run load_food_processing.py with the package and the methods_cf.json (Brightway can't carry methods inside a package) — see the snippet below.
  2. openLCA: import food_processing_openlca.zip (inventory + methods, File → Import → JSON-LD) or the ILCD method package.
  3. SimaPro: import food_processing_simapro.csv directly (File → Import → CSV, delimiter ;, cp1252).
  4. Optionally run 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.

Read this before you compute — scope & the double-counting guard

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:

Why 99 entries are excluded — and why that's the point

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.

Nutrients — an impact and a nutrient content on the same food

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:

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.

Semantic identity layer

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.

Methods — what to trust

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.

Downloads

Standalone-Brightway quick start

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.