Changelog
Versions follow semver with one rule specific to an LCA tool: a MINOR bump means the figures are not comparable with the previous version, because emission factors or the report arithmetic changed. A PATCH means they are comparable. MAJOR is a break in the data model or the methodology.
Production releases are tagged vX.Y.Z by release.yml after the deploy and
listed under GitHub Releases; the running version is in the header of the
application. See DEPLOY.md, "Releasing", for the procedure.
2.11.1 — unreleased
Production release: from 2.5.0 to 2.11.1. Production has run 2.5.0 since 2026-09-29. This release brings everything tested on acceptance since then, 2.6.0 to 2.11.1, in one step. Each version keeps its own section below.
Before the release
- Every administrator sets up a second sign-in step: a six-digit code from an authenticator app, asked once at the first sign-in after the release (a QR code). Until then an administrator's account can do nothing. Hospital staff and researchers sign in as before.
Are the figures comparable with 2.5.0?
No, because of transport. A report published under 2.5.0 keeps its figures; a new version of it can differ.
- Transport is now counted. Under 2.5.0 it almost never was: no hospital had a location. The 15 study hospitals are now located (2.9.0), and a product with only a manufacturer country is estimated from that country's capital, marked "(estimated)" (2.7.0).
- Products from Great Britain, Ireland, Iceland, Malta or Cyprus go by sea to Antwerp, then by road (2.9.0).
- Waste on one basis per project (2.8.0, 2.11.0): the weighed bin when any procedure was weighed, with waste per product and the difference beside it; otherwise waste per product. Never both.
- Process steps weigh nothing (2.10.0): injection moulding, extrusion, rolling and the like no longer add to a product's shipped mass or to the mass it sends to disposal.
Emission factors and the rest of the arithmetic are unchanged.
What is new
- Own domains (2.11.1): the application is at https://clinimpact.app, the test site at https://test.clinimpact.app (marked "Test environment"), the documentation at https://clinimpact.com. The pages.dev addresses keep working for now.
- Reports open the way openLCA's do, with every impact category frozen with the version (2.6.0). "For publication…" gives a journal-style figure, a results table and a methods paragraph, marked as made with ClinImpact (2.8.0). The Standard report is the whole version as a study document: goal and scope, inventory, impact assessment, interpretation and annexes (2.10.1).
- Comparing: pick any projects and see them side by side, with the spread between their procedures. Publish that comparison as a report with PDF, Excel and a public link. A subject row opens to its projects (2.6.0, 2.7.0).
- Recording a project: a "Before you publish" list of what the report would miss, with a way to each fix (2.7.1, 12 checks since 2.9.0). The dose edits in the row (2.7.1). A project can be deleted or archived (2.7.0).
- Products: where a product is made is on its page, and the place lookup works again (2.7.0). The End of life block lists every component with the grams sent to disposal, a set or change per row, a bulk action for the ticked components, and one unit's production beside its end of life (2.10.0). A component can be "disposed as" any of 922 BAFU disposal datasets (2.8.0, 2.9.1, 2.9.2). Up to twelve photos per product and per sterilisation record (2.9.1).
- Security (2.7.3): the administrator second step; only the study team marks a waste route as checked; sterilisation photos stay within their hospital; a withdrawn variant is no longer public; share links hardened.
- Ease of use (2.7.1 to 2.8.0): the application's own confirmation dialogs, an ⓘ that explains each warning on a tap, errors as plain sentences, required fields marked, search boxes on long lists, a log that pages and filters, keyboard and phone-width fixes. The guided tours start only from Help.
- Method on paper: docs/method-review.md and its PDF, with the questions for the clinical team (2.6.0), updated for transport (2.9.0).
This version
Comparable with 2.11.0: yes — no figure changes. Hannes, 2026-10-05: clinimpact.app, test.clinimpact.app and clinimpact.com.
- Own domains. Production at https://clinimpact.app (www redirects), acceptance at https://test.clinimpact.app, the documentation site at https://clinimpact.com. DNS at Cloudflare, registration at Namecheap; DEPLOY.md §7a has the whole arrangement.
- The test site says so. A "Test environment" badge beside the version on acceptance, and the acceptance build asks search engines not to index it. Production shows neither.
- Citations point somewhere. The software citation ends with "Available from: https://clinimpact.app"; the methods paragraph names the application and the documentation site; the place lookup identifies itself as ClinImpact with the documentation site as contact.
- Documentation site. clinimpact.com: what ClinImpact is, the methods, the method review (also as PDF), the changelog, how to cite, data sources and licence, and a transparency page on frozen reports. Built from the repository's own documents on every production release.
2.11.0 — 2026-10-05, acceptance
Comparable with 2.10.2: no for projects that weighed no waste and have products with a disposal set — their headline now counts that end of life; yes otherwise. Jack, 2026-10-05: "it is the full calculation, so it should be added — in openLCA it was too." Hannes: never both, one basis.
- One basis per project. When any procedure was weighed, the headline counts the bin, as before. When none was and the consumed products have components with a disposal, it counts each product's own end of life. The project page, the report, the PDF, the methods paragraph and the comparison say which; each published version records it.
- The difference between the two. Where a project has both, the "Waste — two methods" table, the PDF and the comparison show the per-product waste minus the weighed, in the unit and as a share of the weighed. The study expects weighing to come close to the full calculation at far less effort; this is how close.
- Not weighing is no longer listed under Before you publish when waste is counted per product. The per-procedure figures split the transport to the processor evenly when nothing was weighed.
2.10.2 — 2026-10-05, acceptance
Comparable with 2.10.1: yes — no figure changes. Jack, 2026-10-05: "I stay at 0.063, though it is added." The total with end of life per product (0.110 for the Olympus mouthpiece) was only in the Calculation tab.
- Said where it is looked for. Under the project's headline: "With end of life per product instead of the weighed bin: … — an alternative, not in the total", with a link to the Calculation tab. On the Products tab: an "End of life, per product" tile with the project total that goes with it. The headline itself is unchanged: the weighed bin, never both.
- The product page sums what is there. Production plus the end of life of the components that have a disposal, marked "n of m components"; the full figure once all have one.
- The report page's download buttons wrap on a phone; with the Standard report there are four, and they ran past the edge of the screen.
2.10.1 — 2026-10-05, acceptance
Comparable with 2.10.0: yes — no figure changes. Jack's example report of 2026-10-05, with Hannes's limits: no logo yet, no new input fields, and no statement the data cannot back.
- Standard report. A third download on the report page: the published version as a study document in the order an LCA is read. A cover with the per-procedure figure; document control with a SHA-256 fingerprint of the frozen figures; an executive summary with generated key findings and a doughnut chart; goal and scope with the system boundary as the frozen lines show it; the inventory by section; every impact category per procedure; contribution by section and a Pareto analysis; sensitivity (GWP100, GWP20, without the anaesthetic gases, the other waste method); completeness and limitations; methods text, how to cite and suggested statements; annexes for the sterilisation working and every background dataset with its UUID.
- Left out on purpose: a claim of ISO 14040/14044 conformity (the study team's to make), data quality scores (a judgement the app does not hold), indication, commissioner and clinical lead fields, and the logo.
- The methods paragraph no longer lower-cases the system model: "the Swiss federal rules", "BAFU's own documentation".
2.10.0 — 2026-10-05, acceptance
Comparable with 2.9.3: no for products with a process step entered in grams or kilograms — their transport and per-product end of life get lighter; yes otherwise. Jack, 2026-10-05, on the Olympus Lip Press mouthpiece: "how many grams go to that disposal?", "a button per component", and "I should get about 0.120 and get 0.064".
- Process steps weigh nothing. A processing dataset per kg of product — injection moulding, extrusion, rolling, turning, metal working, glass tempering; 48 in all, checked by name — counts for its impact but no longer adds mass. The mouthpiece's strap, 8.08 g silicone and 8.08 g injection moulding, sent 16.16 g to disposal; now 8.08 g. The component dialog says so under such a line.
- End of life per component. The product page lists each component with a mass: the grams of one unit that go to disposal, the dataset, the result, and set / change / clear on the row. "Set disposal for several components…" applies one dataset to the components you tick.
- One unit, cradle to grave. Once every component with a mass has a disposal, the product page adds one unit's production to its end of life (materials as recorded, without transport). On a project the weighed bin stays the headline and the per-product figure stays beside it.
2.9.3 — 2026-10-05, acceptance
Comparable with 2.9.2: yes — no figure changes. Jack, 2026-10-05: he searched "disposal, plastics, mixture" among a component's materials and found nothing usable.
- A disposal searched among the materials is offered there. Disposal datasets are never a material line; they set the component's "Disposed as". A search like "disposal", "waste" or "afval" in a component's material picker now lists the matching per-kg disposal datasets first, and picking one fills "Disposed as" and says so.
2.9.2 — 2026-10-05, acceptance
Comparable with 2.9.1: yes — existing factors are unchanged. Hannes, 2026-10-05: "add all waste from bafu".
- 101 more disposal datasets. BAFU files some disposal and treatment processes outside its waste categories: electronics for control units, heat pumps, solar panel substructures, rock wool, composting, building foundations. They are now in the disposal pickers with factors for both methods, so all 922 of BAFU's current disposal datasets can be chosen.
- The factors name the openLCA that computed them. These were computed with openLCA 2.7.0; the earlier ones with 2.6.1. A recomputation of two existing waste datasets under 2.7.0 gave the same values to every digit.
2.9.1 — 2026-10-05, acceptance
Comparable with 2.9.0: yes — no figure changes. Hannes, 2026-10-05.
- Every current BAFU waste dataset can be chosen. All 821 were imported in 2.5.0, but 127 — construction, electronics and nuclear waste, landfarming, recycling, underground deposit — could not be picked. They now appear in the hospital's waste route and in a component's "disposed as", like the rest.
- Several photos on a product and on a project's sterilisation record, up to twelve: choose several at once, click one to see it large and step through them. An existing photo stays, as the first.
2.9.0 — 2026-10-04, acceptance
Comparable with previous: no for projects with products from GB, IE, IS, MT or CY, and for any project whose hospital had no location (none had one, so transport now counts where it did not). From the WhatsApp round of 2026-10-04 evening (Jack, Arne).
- Transport counts. Jack's coordinates were right; the hospital end was missing — no hospital had a location, so every transport line said "hospital location not set". The 15 study hospitals are now located (looked up from their addresses, checked by eye); a location a hospital set itself is never overwritten.
- The cause is visible. A hospital without a location is an item under Before you publish (now 12 checks), the project's Transport tile says so with a link, and Hospital settings warns above the location field.
- Islands by sea, through Antwerp. Products from Great Britain, Ireland, Iceland, Malta or Cyprus no longer drive across the sea: they go by ship to the port of Antwerp, then by road — the rule already used for other continents. The catalogue has no ferry dataset; the transoceanic ship stands in, and the line's note says so.
2.8.0 — 2026-10-04, acceptance
Comparable with previous: yes for every headline total. A MINOR because reports gain a second, separately labelled waste figure. From the WhatsApp round of 2026-10-04 (Jack, Arne, Hannes).
- Waste per product, beside the weighed bin. A component can be marked "disposed as" a disposal dataset (in its dialog, or for all remaining components of a product at once). Each product then carries its own end of life — a 7 g glove sends 7 g to disposal — which makes products comparable in a paper. The weighed bin stays the headline: the project page, the report, the public link, the PDF and the Excel show both results side by side, with two totals, and never add them. The product page shows one unit's end of life. The comparison shows, per variant, the per-procedure figure with each method.
- For publication… on the report and the comparison report: a figure (SVG, and PNG at 300 dpi) in a journal style, a results table for the supplementary material, and a methods paragraph with a suggested citation — all marked as made with ClinImpact.
- The guided tours are strictly optional. They have not started on their own since 2.5.0; the leftovers of the old automatic start are removed, and Help (or F1) remains the only way in.
2.7.3 — 2026-10-04, acceptance
Comparable with previous: yes — no figure changes. A full security and usability audit (2026-10-04): no critical or high finding; what it found is fixed here, apart from the settings only an owner can change (listed in docs/open-items.md).
Security
- Administrators sign in with a second step: a six-digit code from an authenticator app. The first sign-in after this release sets it up (a QR code). Without it an administrator's session can do nothing — the database treats it as an account without a role. Other roles are unchanged.
- Only the study team (an administrator) can mark a hospital's waste route as checked; the checker is recorded as whoever ticked it, never chosen, and changing the route clears the mark. Before, any hospital staff member could certify their own route, and the name shown could be set to anyone's — including their e-mail address. The name shown is never an e-mail address.
- Sterilisation photos belong to their hospital: an account without a role, or another hospital's staff, can no longer list, replace or delete them.
- A comparison whose variant report was withdrawn is no longer served on its public link; signed-in readers see the variant marked "withdrawn". A public reader no longer sees the titles of other versions in a series.
- Share links: researchers (read-only) no longer see link tokens; a revoked report link cannot be switched back on; who created a link is recorded, not chosen. Publishing, sharing and withdrawing comparisons are in the log, with link tokens shortened there as report links already were.
- Edge functions answer with plain sentences instead of internal errors; the place lookup queues its calls and limits each account to thirty a minute.
- Releases run only from main and only after the full test suite; deploy tools and GitHub actions are pinned to exact versions; a password change needs a recent sign-in.
Usability
- Required fields are marked with an asterisk.
- A shared link that cannot reach the server says so and offers to try again, instead of claiming the link never existed; public pages, sign-in and password pages name the browser tab.
- The log shows two hundred changes at a time with "Show more", can be filtered by person and date, and names tables as readers know them ("Products", "Prices") rather than by their database names.
- The project page's tabs show the number of procedures and a mark when lines lack a factor; figures that appeared twice on a tab appear once; "Per patient" is "Per procedure", as everywhere else.
- Phone width: report tables and definition lists no longer push the page sideways; long figures wrap.
- Clearer wording in places ("calculated with" instead of "costed against"; the dose is edited in the row, as the products intro now says); empty rooms, accounts, anaesthesia and calculation lists say they are empty.
2.7.2 — 2026-10-04, acceptance
Comparable with previous: yes — no figure changes. A usability pass over every screen (2026-10-04), fixing what a careful reader would trip over.
- The report page of a project without a published report said "Loading…" forever; the Users page did the same when its list failed to load; the audit log showed an error and "Loading…" at once. Each now says what is.
- The waste-route Save button read "Working…" whenever a field was empty; it is simply disabled until both are filled.
- A photo write or a component delete that the database refused looked like a success; both now say "not permitted".
- Errors read as sentences: "Not permitted: your account may not change this", "This already exists", "No connection to the server", instead of the database’s own words; the original stays in the browser console.
- A click beside a dialog no longer closes it and empties the form; Escape and the ✕ still do. Dialogs carry their title as accessible name.
- The browser tab names the page: the project, the product, the report.
- The project list and the Users page get a search box once there are more than five rows; the medication search also matches brand names.
- Copy project, delete medication and delete product cannot be fired twice; the room list and a failed template copy say so when they fail; the list of published comparisons loads, errs and says when it is cut at thirty.
- Keyboard and screen readers: a "Skip to content" link, focus moves to the page on navigation, the project tabs are a tab list, view toggles say their state, the collapse arrows say whether they are open, the withdrawn notice is a status rather than an alert, load errors are alerts.
- Price dates read like every other date; the price table scrolls on a phone; the read-only badge, the exclusion reason of a weighing and a proxy drug’s rationale explain themselves on a tap.
2.7.1 — 2026-10-04, acceptance
Comparable with previous: yes — no figure changes. Hannes, 2026-10-04: "nice additions, without overloading the app; professional and simple; user experience first", for the surgeons and the study team.
- Before you publish. One list on the project Overview of what the report would say is missing or not counted — subject, procedures, room and duration on each, anaesthesia, sterilisation decided, waste route and weights, product origins, content per unit, prices, lines without a factor — with a tick or a count and a way to where it is fixed. Advisory: publishing keeps its one rule. The project list says "n to look at before publishing" or "ready to publish" under each name.
- The dose of a medication edits in the row, with its unit, like the quantity. Changing it used to mean deleting the line and adding it again.
- The application asks its own questions. Delete, archive, revoke, the name of a copied project and the reason for excluding a weighing use one dialog in the application’s own style, with the first line as its title and a button that says what it does, instead of the browser’s box.
- A warning explains itself on a tap. "missing", "no source", "none", "no subject", "incomplete", "no density" and the like carried their reason only in a hover tooltip; an ⓘ beside each opens it, for touch and keyboard.
2.7.0 — 2026-10-04, acceptance
Comparable with previous: no for a project whose products carry a manufacturer country without a place — their transport is now estimated from the country's capital and counted, marked "(estimated)", where 2.6.0 counted nothing; yes otherwise. From Arne's test of 2.6.0 on acceptance (2026-10-03, nine points) and Hannes's two: pick the projects to compare yourself, and publish that comparison.
- Compare the projects you pick. The comparison opens on a list of every project you can see with a checkbox each; the ticked ones go side by side, one row per project, one column per section, the highest in each column in bold, with the mean per procedure, the cost, and — new — the spread between the project's own procedures: standard deviation, median and quartiles. The selection sits in the address, so a link reproduces it. The subject table of 2.5.0 is the second view, with "Compare these" on each subject.
- A comparison report of any selection, under a title, in numbered versions, with PDF, Excel and the public link; each variant's spread between procedures is frozen with it. The subject's own report stays.
- Per-procedure totals in the database: every line of a project is
apportioned to its procedures (products and transport by units, the room by
minutes, waste by weighed kilograms, anaesthesia and sterilisation evenly),
adding up to the project total by construction.
docs/methods.mdand the method review say how. - Place lookup works on the deployed sites again. It failed with "Failed
to fetch" because the site's own security policy blocked OpenStreetMap from
the browser; it now runs through the application's
geocodefunction, which names the application and keeps to one request a second. - Where a product is made is on the product page, with a warning when it is missing, and an Origin column and "Without origin" filter on the list. A country without a place is enough for an estimate from its capital.
- Delete or archive a project. A project that never published a report is deleted, after a confirmation naming what goes; one with a report is archived — out of the lists and comparisons, its reports and links intact — and can be restored. From the ⋯ menu on the list and the project page.
- Deleting a product says what happens. In use, it is refused with the projects named, under the row; otherwise the confirmation lists the components and prices that go. A delete the database silently filtered away now reads as "not permitted".
- The Agent list of Add anaesthesia shows the anaesthetic agents first (sevoflurane, desflurane, nitrous oxide …), the other medication under its own heading; a failed load says so; a general or mixed anaesthesia without an agent is warned about; the materials box says the agent is not chosen there.
- The waste route is said where the kilograms are typed: the dataset, the distance, the source, and who of the study team checked it and when ("Checked by the study team" under Hospital); the report's waste lines carry the check too. Without a route the Procedures tab says the kilograms are not counted.
- The project's edit form belongs to the Overview tab and closes when the tab changes. "missing" in the project list reads "none yet", unalarmed.
2.6.0 — 2026-10-01, acceptance
Comparable with previous: yes — no figure changes. A MINOR nonetheless,
for the changed shape of both reports and of subject_averages (Hannes,
2026-10-01). From Jack's second round of feedback (2026-09-30 and 2026-10-01):
how to compare two techniques, a report in openLCA's shape that a colleague
can read, and the method on paper for review.
- The comparison opens each subject to its projects. A subject row (the operation studied) carries a chevron; open, the projects — the techniques or series recorded for it — follow on the same columns, each linked, with no spread of their own: the ± on the subject row is the spread between them. Open by default when there are two or more. The help texts now say what a subject and a project are, at both levels.
- Every published report opens the way openLCA's does: an Introduction (generated: what, where, how many procedures, under which indicator, when), an "Impact categories and results" table with every indicator that has factors — frozen with the version from now on — then "Where the impact sits": a stacked bar and one card per section with a generated sentence (figure, share, largest contributors) and a fixed explanation of what the section counts, the anaesthesia under Drugs. The contribution tree follows, the line tables are closed by default, Method & sources and What is not counted close the report. The PDF follows the same order; the Excel gains Overview and Indicators sheets. Older versions show the indicator table computed now and say so.
- A comparison report per subject, publishable, with a public link: the subject's projects as variants, the impact categories, a results table of every indicator against every variant per procedure, a bar chart for one indicator, relative results with the largest at 100 %, and where the impact sits in each variant with the same explanations — composed from the projects' published reports, so nothing is recomputed and every project needs a published report first. PDF and Excel.
docs/method-review.md(and its PDF): how every figure is calculated, section by section — what is recorded, the formula, the constants and datasets, a worked example, the assumptions, what is not modelled, and 21 questions for the clinical team. Sterilisation and anaesthesia in the most depth; the appendixmethods.mdgains the sections it lacked.- The monthly mail probe has its address and ran green.
Earlier in this version (2026-09-30), after Hannes: "the ui is messy, for example in comparison ... make drugs and anesthesia have their own overview / stats per tab on top. make it consistent":
- Every tab of the project page opens with its own figures, in the same strip as the overview: Procedures (count, room use, waste), Anaesthesia (its total, the agents, the medication given under it, its materials), Products and drugs (products, drugs, transport, cost), Sterilisation, and the calculation (total, lines counted and not counted). Each tile carries its share of the project total.
- The comparison is laid out like the project page: a strip with how many subjects, projects and procedures went in and the unit, the method and price controls under it, then one table. The counts sit under the subject's name, the per-procedure columns are grouped under one heading, and each mean carries a bar showing what it is made of. A cost that misses prices reads "≥ €" rather than an asterisk.
- The comparison tour no longer points at a subject dropdown and a Total column that went in 2.5.0.
2.5.0 — 2026-09-29
Comparable with previous: no — waste and transport are new sections of every report, and the anaesthetic agents carry their AR6 values. From Arne Van Overschelde's review of 2.4.2, Jack's first live test and Hannes's notes (2026-09-27 to 2026-09-29).
- Waste is costed. Each procedure records the waste weighed after it; the hospital records where its waste goes (one BAFU disposal dataset, chosen from the waste-management datasets now in the catalogue) and how far. The report gains a "Waste" section: disposal of the mean weighed mass, and its transport to the processor. Not weighed and excluded weighings are named on the line.
- Transport is costed. A product records where it is made, the hospital where it is (looked up on OpenStreetMap, or typed); every consumed product gets a "Transport" line by mass — road within the continent, sea to Antwerp plus road from elsewhere. Hand-entered transport components are flagged as a possible double count.
- IPCC 2021 GWP 20 beside GWP 100, for every material and every drug that has one; the four anaesthetic agents carry their AR6 values (sevoflurane 195, isoflurane 539, desflurane 2590, nitrous oxide 273; GWP20 702, 1930, 7020, 273). Sevoflurane was 144 and desflurane 2540.
- A new project can start from an existing one: its products, anaesthesia and sterilisation are copied; its procedures and reports are not. The copy inherits the subject and the subject stays editable.
- The comparison page compares subjects: the mean per procedure pooled over every project of a subject, the spread between those projects, the same per section, and the cost per procedure.
- The project page is in tabs, with a share of the total on every section tile and a cost tile. The calculation and both report pages show a collapsible contribution tree — section, product, component, material — with a percentage on every row.
- Prices: several per product (hospital, online, …), and a cost per procedure on the project and in the comparison.
- Search survives a typo and understands "plastic", "afval", "staal"; the three materials and products you used most recently come first. Electricity datasets say they are costed against the hospital's grid, in the picker and on the component. A note per material line says why that dataset. A photo on the sterilisation record.
- English only. The Dutch interface and the language switch are gone; a browser is told not to translate the page (Jack's "everything in Dutch" was Chrome doing it). Product and component names keep their optional Dutch. The guided tours no longer start on their own; Help and F1 open them.
2.4.2 — 2026-09-06
Comparable with previous: yes — no published figure changes. Everything below follows a hand audit of every calculation in 2.4.1, checked against the 4,341 frozen lines on production, all of which were found arithmetically consistent.
- Nitrous oxide can now be costed. It is recorded as fresh gas flow × its share of the fresh gas × duration, and its mass is that volume × 1.83 g/L (20 °C, 1 atm). Until now the agent arithmetic knew only liquids: a "volume in mL" of a gas would have been costed as a liquid at 1 g/mL, about 550 times too much. A gas entered as a volume is refused with a note.
- An anaesthetic agent with no recorded density produces no figure and says so, where it was silently costed at water density. A vapour ratio of zero yields no figure instead of an error.
- Sevoflurane, isoflurane and desflurane carry a vapour ratio, derived from
each agent's own density and molar mass at 20 °C (181.5, 195.5 and 207.4 mL
of vapour per mL of liquid). Without it the flow × setting × duration method
could never produce a figure. The derivation is recorded beside each value
and in
docs/methods.md. - Every quantity is shown with its unit, and it is the unit the factor multiplies: an entry of 0.001 MJ against a per-kWh dataset shows its total in kWh. The Excel "Unit" column said MJ beside a kWh figure on 740 production lines. The room-use line labels its rate kWh/h, not kWh.
- Line-level figures show four significant figures instead of three fixed decimals; 1,452 frozen lines read "0.000" before. Totals keep three decimals so sections visibly add. Excel cells carry no display format, so a small factor no longer shows as 0.0000.
- A section subtotal with lines that could not be characterised says how many, so a lower bound does not read as complete. Charts keep negative lines.
- The anaesthesia dialog says its duration and agent figures are per operation, and that the report multiplies by the procedures recorded. The comparison table's per-section columns say "per patient" in the header.
- Under the hood: the drug and agent factor guard names the two method/category pairs the GWP100 describes instead of excluding by name; the mean dose in the drug trace is weighted by units opened.
2.4.1 — 2026-09-06
Comparable with previous: yes — a wording change on the catalogue row; no figure moves.
- The system model of BAFU:2026 is now named where 2.4.0 said "not
documented": attributional, cut-off at end-of-waste, per the Swiss federal
LCI rules §9.3 and the ecoinvent v2.2 guidelines, with the same sentence
still saying that BAFU's own documentation names none. The catalogue notes
record that this is an inference and what it rests on. Shown at once on
the Methods & sources sheet, the PDF sources table, the public report page
and About;
docs/methods.mdfollows.
2.4.0 — 2026-09-06
Comparable with previous: no — a medication now costs the whole container opened, not the dose drawn from it. Both entries below follow Alain Kalmar's review of 2.3.0.
- A medication costs the whole container that was opened. An opened ampoule is consumed whether the rest is given or discarded, and one is almost never split across patients. Each medication product now records what one unit holds as sold — 50 mL for a 50 mL vial — and the report multiplies the units opened by that. The dose given stays on the record and is checked against the units opened; a dose larger than the unit is flagged as a probable miscount. A medication whose content per unit is not yet recorded is shown on the report and not counted, with a note saying so, rather than estimated. The vial's own glass, cap and stopper were already costed per unit and are unchanged.
- Where every factor came from, written down where a paper can read it. A new
catalogue record names the database (Life Cycle Inventory database of the
Swiss Federal Administration, BAFU:2026, version 1), its publisher, the
citation its terms of use require, the LCA software and version, when it was
downloaded, and — honestly — that its documentation does not state a system
model. Every frozen report line now carries the edition, the geography of its
dataset and the real date the factor was extracted; that date used to be the
day the migration ran. The Excel export gains a "Methods & sources" sheet and
a citation on every row, the PDF a sources table, the public report page and
the About dialog the same citation.
docs/methods.mdsays it all in one place.
2.3.0 — 2026-09-04
Comparable with previous: no. The drug aggregation, the climate sub-categories, the room lines and the sterilisation electricity all changed, so the same data gives a different figure than 2.2.x did.
Everything here comes from docs/audit-2026-09-04.md, an audit of the
database, the security posture, the report arithmetic, the interface, the
tours, the tests, the deploys and the documents. Nothing already published was
recomputed.
- Privileges: no signed-in role can empty a table any more (TRUNCATE was granted to every role), trigger functions are no longer callable through the API, and an account that has not been given a role yet reads nothing — not the product library, not the drug factors, not the item photos. The role test on the library tables is evaluated once per query, so a catalogue read or a report costs the same as before.
- The audit log now records role and hospital assignments, factor corrections and changes to hospitals, grids, units and subjects; share links are logged by an eight-character prefix instead of the full token.
- The public report link no longer discloses the hospital's cost per sterilisation unit; a product's author is shown by name, never by e-mail.
- Deploys: every push runs the whole test suite before a migration reaches acceptance, the frontend waits for the migration, the Supabase CLI version is pinned, workflow tokens are read-only, and the backup workflow no longer interpolates its label into a shell.
- Assets are cached for a year by content hash; the site sends a content security policy, HSTS and refuses to be framed.
Report arithmetic, which is why the figures are not comparable:
- A medication given in different amounts across operations is now added up operation by operation. It used to be the average dose times the total number given, which is the same number only when every operation used one — three vials in one case came out 10% low. Doses recorded in different units on the same medication are each converted before they are added, instead of all being read as the first unit; that one could be out by a factor of 170, and the line now says when it has seen more than one unit.
- Under the sub-categories of climate change (biogenic, fossil, land use) a medication no longer contributes its full global-warming figure. It has one factor, for climate change itself, and the line says so and counts nothing under the others.
- An operation recorded without a room or without a duration is no longer quietly left out of the room-use figure: it gets a line of its own naming the operations that could not be counted.
- Sterilisation electricity stays on the report when no machine has a consumption figure entered, with the note that the number is a lower bound. It used to disappear entirely, taking a quarter of the total with it.
- The report lines come out in a fixed order, so a very long report cannot page with a line repeated or missed.
- A medication recorded both as an anaesthetic agent and as a used product on the same arm is flagged on both lines. A volume dose of a medication with no density recorded says that is why it has no mass.
And around the figures:
- A report can no longer be published from the standard list: an operation has to be recorded first, because the per-patient figure divides by the number of operations. The ten reports on production that were published this way have been withdrawn, with the reason recorded; their figures stay in the database, their public links no longer answer, and the projects can be published again once their operations are entered.
- Each published version records the method and the category it was computed with, and both are shown in the report header and on the public page. A project could hold versions under EF 3.1, under Climate change (fossil) and under IPCC 2021 with nothing on the page saying which was which.
- The PDF and Excel divide by the number of operations frozen with the version, not by today's count. The two used to disagree with the screen after an operation was added.
- A section none of whose lines could be characterised reads "not characterised" instead of a total of zero.
- The version list on a report page reads the publication record rather than the lines, so a project with many versions stops losing the older ones.
- The sterilisation double-count warning is shown when sterilisation is switched on, which is the only state in which it can happen. It used to appear only when it was switched off.
- Quantities in the PDF are given to four significant figures, so a reader re-multiplying a row gets the row's own number back. Excel is exact, as before.
- A project with a published report cannot be deleted through the interface or the API any more, and deletions of published lines are recorded in the log. A line whose product or component was deleted afterwards says so.
- A material's reference unit cannot be changed while lines that were entered against the old one still exist.
- The sensitivity note now says correctly that every material recorded as electricity moves with the chosen grid, not only sterilisation and room use.
Interface:
- "No profile found" no longer appears for a moment after signing in. The app was treating "the profile has not arrived yet" as "this account has no profile", which is the same screen someone genuinely locked out would see.
- Three screens no longer scroll sideways on a phone: the room list on the operations form, the sterilisation calculation on a report, and the material search box, which used to collapse to a few pixels beside the category list.
- Typing into the sterilisation form is no longer discarded when the page finishes loading underneath it.
- The cursor starts in the e-mail box on the login screen instead of on the language chooser.
- A tour bubble that fits neither above nor below its target is now placed beside it, rather than over the thing it is pointing at.
- The photo chooser on a product has a name for screen readers.
Knowing when something breaks:
- An error in someone's browser is now recorded, and an administrator reads the last hundred at the bottom of the Log page. The message, the screen it happened on and the build — never what was on the screen. Reports are kept for thirty days and pruned by the nightly backup.
- A failure that used to leave a blank page now shows a card in both languages saying to reload, and records itself on the way.
- A monthly workflow asks acceptance for a password link. It proves that mail still leaves the building and keeps the Brevo key from expiring through disuse, which would otherwise stop every invite and every reset silently.
Guided tours:
- A tour that could only show one of its steps, because the rest of the screen was empty, is no longer counted as seen. It comes back when the screen has something to show; skipping it is still remembered.
- A read-only account is no longer told to add, click or change things it cannot: the steps that point at a button fall back to the section and say something a reader can act on.
- The anaesthesia dialog has a tour of its own, which the welcome tour was already promising.
- Four texts corrected: the material search ranks by use across the catalogue and not per hospital, the log shows unknown for a deleted account, the country decides the grid for electricity rather than for every figure, and the share step no longer describes a Revoke button before a link exists.
2.2.3 — 2026-09-03
Comparable with previous: yes. No factor or report arithmetic changed.
- Guided tours. Each screen explains itself once, the first time it is opened:
a short tour that highlights one control at a time, with a welcome tour on the
first sign-in walking the order of work along the tabs. Skip, Skip all, and a
Help button in the header to read a screen's tour again. What has been seen
is remembered on the account, so it follows a person across devices. The
component dialog has its own tour; the record is a new
tutorials_seencolumn onprofile(additive migration). The new-project form has a tour of its own. Texts are short and plain, one reason at most; "theatre" is "operating room" throughout the English interface. - The discipline list in the product dialog now follows the interface language; it was the one list that stayed Dutch. Six other hard-coded Dutch strings on the project screens were translated.
- The project page is grouped into boxes: figures with Publish and the method and grid choices, then procedures, anaesthesia, products, sterilisation and the calculation, each in its own box with the add form above its table so adding a line no longer moves what you are typing in. Sections show their heading while loading instead of appearing late. Publishing shows a banner naming the new version with a button to open the report.
- Save buttons show "Saved ✓" for a moment after saving (hospital settings, sterilisation).
- A products page shortcut "Add material" puts a material straight on a product; it becomes a one-line component named after the material, so the model is unchanged.
- The Users page explains the four roles in one line each, and what happens when someone moves hospital.
2.2.2 — 2026-09-03
Comparable with previous: yes. Text and presentation only.
- The browser tab title follows the interface language instead of a fixed Dutch title.
- The version label in the header hints "About" on hover, so the dialog is findable.
- About states what the figures are: research estimates, traceable to the entered data and a published source, not independently reviewed. The earlier "not a certified tool" sentence is gone.
- Confirmation texts after an invite or a password link point at the junk folder.
2.2.1 — 2026-09-03
Comparable with previous: yes. No factor or report arithmetic changed; every figure is identical to 2.2.0.
- The version is shown in the interface (header, login form, public report) and opens an About dialog naming the software, the factor source and the people behind it. PDF and Excel exports carry the software version, the factor catalogue edition and the method in their footer and metadata.
- Daily encrypted backup of the production database and the item photos to
Cloudflare R2, with a tested local restore. See
docs/backup-restore.md. - Release workflow refuses an already-tagged version and creates the tag and GitHub Release itself.
- Accounts are invited by mail and people choose their own password on a new set-password page, against a policy of 12+ characters with lowercase, uppercase, digit and symbol plus a leaked-password check. "Forgot password?" on the login page and "Send password link" on the Users page replace the generated password that used to be shown on screen; the admin-reset-password function is gone. Bilingual invite and recovery mail templates, sent through Brevo. Confirmation texts point at the junk folder, because an outlook.com sender relayed by Brevo lands there on Outlook.
2.2.0 — 2026-09-01
Comparable with previous: no. Facility use and the anaesthesia agents changed the figures.
Anaesthesia agents with their own materials, all 25 EF 3.1 indicators, facility use (what the theatre draws during the operation), four report types with charts, the sterilisation working shown in full and frozen with the report, comparison of study arms against another electricity grid, product photos, public report links, a rebuilt audit log, and the English report with the EN/NL interface.
2.1.0 — 2026-08-30
Comparable with previous: no. The report arithmetic itself was built here.
The application becomes usable end to end: reports computed and published (materials, drugs, sterilisation), project and report pages, product authoring with the component tree and material picker, operations and doses, hospital settings, anaesthesia records, inviting colleagues from the app, IPCC 2021 factors alongside EF 3.1, acceptance split from production and hosted on Cloudflare Pages, and the browser test suite that found and fixed some twenty defects.
2.0.0 — 2026-08-14
Supabase rebuild of the Base44 application: Postgres schema with row-level security, pgTAP suite, the offline openLCA extraction pipeline, the BAFU:2026 catalogue seeded as 6,630 rows, and the Base44 import with every record it could not carry documented.
1.x
The Base44 predecessor, kept for reference in ../datacollective-lca.