Skip to content

Releases

MApper 0.3.2

Choose a tag to compare

@leofrht-jpg leofrht-jpg released this 24 Oct 14:27
166deec

Install (macOS)

Unsigned build. After dragging to Applications:

xattr -dr com.apple.quarantine /Applications/MApper.app

Install (Windows): download the *-setup.exe, run it and follow the installer. If Windows SmartScreen shows a warning, click "More info", then "Run anyway".

UMFPACK asymmetry: macOS builds link UMFPACK through scikit-umfpack;
Windows builds fall back to SciPy's SuperLU. Results agree to solver tolerance,
but large sparse solves are slower on Windows.

Changes

Changed

  • In-app dialogs replace every native window dialog. The packaged app's
    webview has no dialog handler: window.confirm answered "no", prompt
    returned nothing and alert showed nothing. So guarded deletes never
    happened, a new name could not be typed, and failure messages were lost.
    All 65 calls are now in-app confirmations, name prompts, choices,
    messages and toasts, across AESA, the BOM editor, the parameter manager,
    LCA Architect, the Method Library, pLCA, Archetypes, DSM and subsystems.
    A choice that offered "Cancel" as one of its branches now aborts on Escape
    instead. A test fails on any native dialog call under src.
  • The no-native-dialogs guard is absolute (#190). With every call
    migrated, its allow-list is gone: any native confirm, prompt or alert
    anywhere under src fails the test, and only the dialog module itself is
    exempt.
  • The app page can no longer navigate away. In a 0.3.2 development build
    the window once replaced the whole app with a page it could not leave until
    quit. Links to blob:, data:, file: or another site are now cancelled
    with a short "Navigation blocked" message. Exports still save, through
    one shared download helper. A file dropped outside a drop zone is no longer
    opened in place of the app. The two external links (the premise GitHub page
    in Settings and a method's source in the Method Library) are blocked the
    same way.
  • Identifier fields are not auto-capitalised. Parameter, case, scenario,
    folder, stage and database names, principle ids and dimension names turn
    off macOS auto-capitalisation, autocorrect and spell check, and so do name
    prompts. Auto-capitalisation kept producing a capital letter that the
    snake_case rule then rejected.
  • premise's unlinked.log is capped at warnings. It was written at INFO
    and grew large in the app's workspace. The existing file is left as it is.

Fixed

  • "Add parameter" closed while editing the name. Selecting text in the
    Name field and releasing the mouse over the dimmed background counted as a
    click on the background and closed the window. A window now closes from the
    background only when the press also started there. The same applies to the
    Scenario manager, the Method Library, the bulk learning-rate and rebound
    windows, the AESA principle and layer editors and the Archetypes folder
    picker. Keys and clicks on a dialog shown above one of these windows no
    longer reach the window underneath.
  • AESA export no longer overwrites a file of the same name. A second
    export with the same name is saved as name (1).xlsx, then name (2).xlsx,
    and the page shows the name it was saved under. Log exports keep their
    timestamped names.
  • Renaming an AESA configuration saves. Save was disabled whenever the
    source toggle read System-level and no DSM system was selected, even for a
    configuration that was already saved, and the hint only mentioned Compute.
    A saved configuration now saves without a system, keeping the one it was
    saved for. A new System-level configuration still needs one, and the page
    says so.
  • The AESA radar shows a point's values on hover. Hovering or focusing a
    dot shows the boundary, year, Sustainability Ratio and zone, impact and
    allocated SOS. On a not-specified axis the ratio is shown as a lower bound.
  • "Change it in LCA Architect → Manager" opens LCA Architect. The link on
    the single-product page led to an empty "Select a database" page.
  • Windows CI and the Windows release build pin Miniforge 26.7.2-1.
    Miniforge 26.9.4-0 failed in conda init on the Windows runner. macOS stays
    on the latest Miniforge.

Downloads

File Size SHA-256
MApper_0.3.2_aarch64.dmg (macOS, Apple silicon) 442,322,070 bytes (442.3 MB) 75ac32df61804e76aa369cef8ac3796d3cb21c153a69a27a63217940f034c2ac
MApper_0.3.2_x64-setup.exe (Windows, x64) 414,472,316 bytes (395.3 MiB) 2dd8c532634b1b9edc680aead5d7d7fcb2b267d3e4d3c443c753d096f7e8fde3

MApper 0.3.1

Choose a tag to compare

@leofrht-jpg leofrht-jpg released this 23 Oct 04:38
ce405d9

Downloads

  • macOS (Apple silicon only): MApper_0.3.1_aarch64.dmg, SHA-256 ec0a858d10fe2d0cc8c69752e054481656ce36f3a6be58deffb30dbf95ce67dc
  • Windows: MApper_0.3.1_x64-setup.exe, SHA-256 2e0d9b56f1dede97910c061a832c8e20ea1006de5d81f95474173dff1132dbfa

Install (macOS)

Unsigned build. After dragging to Applications:

xattr -dr com.apple.quarantine /Applications/MApper.app

Install (Windows): download the *-setup.exe, run it and follow the installer. If Windows SmartScreen shows a warning, click "More info", then "Run anyway".

UMFPACK asymmetry: macOS builds link UMFPACK through scikit-umfpack;
Windows builds fall back to SciPy's SuperLU. Results agree to solver tolerance,
but large sparse solves are slower on Windows.

Changes

0.3.0 was prepared but never tagged or released; its entries are included here.

Added

  • Impact-category lists and tables collapse. Every card or table that
    lists impact categories (the indicator picker on every Impact Assessment
    page and the LCA Calculator, the single-product and Multi-item result
    tables, the LCA Calculator result tables, the Monte Carlo distributions
    table, the AESA Detail table) now has a chevron like the Results header,
    through one shared component. Expanded by default; a collapsed block keeps a
    one-line summary ("25 of 25 selected"); the state is remembered per page
    when the browser allows it.

  • AESA sensitivity cases you can see and choose. With "Sharing
    sensitivity" ticked or parameter sensitivity cases in the project, Compute
    first opens a window listing each case and what it changes; only the ticked
    ones are computed (the base always is). Parameter cases, which never reached
    AESA before, are now recomputed through the single-product LCA under each
    case, including every year of a prospective run. A case switcher shows the
    base or any case in Radar, Timeline and Detail, and a new Cases view plots
    each case's SR difference from the base per impact category, with zone
    changes marked. The export's Sensitivity sheet now has one row per impact
    category and a column group per case (SR, difference from the base, zone);
    the case definitions are in the Summary, and the previous long-format sheet
    is kept as "Sensitivity (long)".

  • Authored databases. Create your own Brightway database inside MApper and
    author activities in it from biosphere flows — for a process whose impact is
    its direct emissions, or a supplier's cradle-to-gate figure entered as one
    characterised value. Authored activities link into a Bill of Materials like
    any ecoinvent activity. The definition file is the source of truth and travels
    with a project export, including a modelling-only one; the Brightway copy is
    rebuilt after a project or ecoinvent import. Biosphere-only in v1: an
    authored activity cannot take a technosphere input, because such a link would
    not be translated into a prospective background and would silently keep
    base-year electricity in every future year of a prospective run.

  • Authoring UI in the Database Explorer, with a preview that saving must
    agree with — the preview and the save verdict come from the same function, so
    they cannot disagree. Deleting an authored activity that a BOM row links to is
    refused, and the refusal names the rows.

  • Biosphere-flow compartment picker. Browse biosphere databases grouped by
    substance and see, per compartment, what each method's characterisation factor
    actually is, how many of the family's indicators characterise it, and how
    heavily ecoinvent uses it. Choosing NOx to urban air versus high stacks is a
    decision rather than a guess. No compartment is preselected.

  • Uncertainty discipline on authored exchanges. Every exchange is lognormal
    with all five pedigree scores required. Its basic variance defaults to
    ecoinvent's median for that flow, and a GSD² below ecoinvent's median for the
    same flow is refused unless a written reason is given, which is then stored
    with the number. Each exchange reports its floor status explicitly.

  • Per-exchange uncertainty basis. An amount that is not an emission but
    someone else's characterised result (a supplier PCF, an EPD) can be marked
    supplied, which asks for more than the default — a variance and its source
    — and reports that no floor applies rather than demanding a justification for
    a comparison that was never made. The basis follows the number into every
    result, onto the Coverage sheet of every workbook and onto the Monte Carlo
    pedigree sheet, so a reader comparing two GSD² values is told when they
    describe different quantities.

  • Coverage declaration and "not specified" markers. An authored activity is
    declared complete or partial, and a partial one declares per indicator which
    it is complete for. Any result that used a partial activity marks the
    remaining indicators as unknown rather than reporting a number that would read
    as "no impact" — on every result panel, in the AESA detail table, and on the
    radar, where such an axis is hatched and its Sustainability Ratio reported as
    a lower bound. Scores are unchanged; this is annotation only.

  • A Coverage sheet on every workbook that reports impact or
    sustainability-ratio values, naming each indicator it reports as specified,
    not specified, or not recorded, with a pointer line on the workbook's first
    sheet. A test discovers every workbook builder and fails one that neither
    states coverage nor is exempt with a recorded reason, so a new workbook cannot
    ship silent.

  • CHANGELOG.md — this file.

  • Reveal in Finder for a saved log. In the desktop app, Settings › Logs ›
    Export now shows a "Reveal in Finder" button ("Show in folder" on Windows)
    beside the path it wrote. The backend, which saved the file, asks the system
    to show it, and it refuses any path outside the folders it saves to. "Copy
    all" writes no file, so it has nothing to reveal.

  • A warning when every AESA ratio is below 0.001. A single-product run
    under a downscaling chain that stops at a sector divides one product's impact
    by a whole sector's share of each boundary, and every ratio reads as safe. The
    AESA page now says that the chain probably does not reach a single product.
    No value changes.

Changed

  • Impact-category abbreviations follow one convention: AP, GWP100, ETfw,
    EPf, EPm, EPt, HTPc, HTPnc, IRP, LU, ODP, PM, POCP, ADPf, ADPmm, WU, on screen
    and in the export's Abbreviation column. Eight changed (for example ETP-fw
    became ETfw, ADP-mm became ADPmm). No other place used the old forms.

  • Authored-editor messages use the names on screen. A refusal said
    "basic_variance_reason" or "floor_reason"; it now names the Basic variance
    box, the reason under it, and the Partial inventory note.

  • Settings › Logs is no longer flooded by Brightway. bw2calc wrote "Switching
    LCIA method" and "Redoing LCIA" at INFO on every characterisation, thousands of
    lines per run. Its INFO lines are dropped; its warnings and errors still come
    through.

  • Loading cards, checked against measured times. Every calculation entry
    point was timed on a sidecar against EVS40 and MAp-test. Five take more than
    10 s, and each shows the shared loading card (what is running, elapsed time;
    the page stays usable):

    • AESA with four parameter cases × all sharing, 77 s;
    • Monte Carlo, 1000 iterations, 69 s;
    • system-level Prospective, 63 s;
    • single-product Prospective over four years, 19 s;
    • system-level Static with 25 indicators, 11 s.

    DSM simulation, subsystem compute, material flows and every export finished
    in under a second. The AESA card now says what it is running ("5 cases ×
    6 sharing · 4 LCA reruns"). It also appears on the dashboard when the
    Configuration panel is collapsed, which used to hide it during a minute-long
    case run.

  • AESA cases and sharing as a matrix. The case switcher mixed parameter
    cases (v1g, v2h_credit…) and sharing choices (Equal per Capita, Industrial
    Output…) in one row, so a case could only be seen under the base chain. There
    are now two selectors, Case (Base and the parameter cases) and Sharing (the
    base chain, EpC, IN, AGR, LA, AR), and any case can be read under any sharing.
    A parameter case reruns the LCA once. A sharing choice changes only the SOS,
    so every case is also evaluated under every ticked sharing without another
    LCA. The compute window lists the two groups separately and says which one
    reruns the LCA. The Cases view and the export's Sensitivity sheets take each
    difference against Base under the same sharing. Base's own sharing variants
    are taken against the base chain. Every column and row names its case and its
    sharing, and the Summary lists both axes with their definitions. Results saved
    before this still switch and export.

  • No Lifetime preset; the years are always entered. Stage amounts offered
    "1 year | Lifetime (15yr) | Custom", but not every product lives 15 years.
    The preset is gone from Single item, Multi-item and the LCA Calculator, and
    so is the default of 15. Under Custom a Years box starts empty; entering N
    sets every per-year stage to N and every per-unit stage to 1. It stays locked
    until each stage declares its basis, Manufacturing and End of Life included.
    Editing a stage by hand clears the years, because they no longer describe the
    run. The exports' "Lifetime (yr)" row prints the years entered, or "not used",
    and AESA's per-year functional unit divides by them. A result computed before
    this change, on the Lifetime preset, still exports and still divides. The LCA
    Calculator also stops scaling stages by the scope-derived "annual" hint and
    uses the declared basis, like the other two.

  • Results are addressed by the full method tuple; the indicator label is
    display only.
    An LCIA method's last tuple element is not unique: EF v3.1's
    2...

Read more

MApper v0.2.2

Choose a tag to compare

@leofrht-jpg leofrht-jpg released this 04 Sep 06:17
827537e

Why upgrade

Five ways MApper could destroy or misreport your work. Each is fixed, each was
reproduced first, and each is the reason to upgrade rather than a changelog line.

An upload that resolved nothing overwrote what was there. A cohort-mapping
file whose archetype names no longer matched wiped a real 51-row mapping to
zero — the upload "succeeded" and the data was gone. Uploads now refuse when
every row fails to resolve, and say so. Nine upload routes are covered, and the
guard now discovers them rather than reading a hand-kept list.

A replace-mode archetype import destroyed the library before validating it.
A well-formed workbook whose sheet had zero rows deleted every archetype and
then returned an error. Measured: 3 in, 0 out. The workbook is now parsed
before anything is deleted.

Replace-mode import orphaned every cohort mapping and subsystem link. It
re-minted every archetype id, breaking all references — twice on a real
project. Ids are now preserved by name, so Replace = Merge + delete what is
absent from the file, and nothing else
. Archetypes renamed in the file are
warned about, never silently dropped.

Archetype composition was destroyed on every import, in both modes. The
BOM workbook cannot express a composition reference, and the importer treated
its absence as deletion. It is the one reference with no manual repair path.

Contribution results could be stale after a BOM edit. The cache is keyed by
archetype id, which survives every edit, so a result computed before a relink
could be served after it with nothing on screen saying so. Nine mutation routes
— the BOM editor among them — now evict it.

Download filenames — templates only

One convention for template downloads: {Entity}_{artifact}_template.xlsx.

Your existing data exports keep their names. _LCA.xlsx, _AESA.xlsx and
_MC.xlsx are byte-identical to v0.2.1 — verified against the previous
release, awkward names included.

Scope Template Before After
DSM system Initial stock stock_template_Car Fleet.xlsx Car_Fleet_stock_template.xlsx
DSM system Inflows inflow_template_Car Fleet.xlsx Car_Fleet_inflows_template.xlsx
DSM system Outflows outflow_template_Car Fleet.xlsx Car_Fleet_outflows_template.xlsx
DSM system Stock targets stock_target_template_Car Fleet.xlsx Car_Fleet_stock_targets_template.xlsx
DSM system Stock (aggregate) stock_aggregate_template_Car Fleet.xlsx Car_Fleet_stock_aggregate_template.xlsx
DSM system Cohort mappings Car_Fleet_cohort_mappings_template.xlsx (unchanged)
Subsystem Initial stock initial_stock_template.xlsx Fueling_Infrastructure_initial_stock_template.xlsx
Subsystem Dependency rules dependency_rules_template.xlsx Fueling_Infrastructure_dependency_rules_template.xlsx
Subsystem Cohort mappings cohort_mapping_fueling_infrastructure_template.xlsx Fueling_Infrastructure_cohort_mappings_template.xlsx
Subsystem Manual inflows inflows_template_Fueling_Infrastructure.csv Fueling_Infrastructure_manual_inflows_template.csv
Subsystem Manual outflows outflows_template_Fueling_Infrastructure.csv Fueling_Infrastructure_manual_outflows_template.csv

The two subsystem templates that carried no entity name were overwriting each
other
— every subsystem produced the same filename.

Also in this release

  • Multi-year contribution runs are deterministic. The test picked a random
    activity per run, so its tolerance could only ever be lucky; the activity is
    now pinned and the bound set from the measured solver residual.

Install (macOS)

Unsigned build. After dragging to Applications:

xattr -dr com.apple.quarantine /Applications/MApper.app

UMFPACK asymmetry: macOS builds link UMFPACK through scikit-umfpack;
Windows builds fall back to SciPy's SuperLU. Results agree to solver tolerance,
but large sparse solves are slower on Windows.

Upgrading from v0.1.x: the old version may still show

This affects upgrades from v0.1.x only. A fresh install, or an upgrade from
v0.2.0 or v0.2.1, does not need it.

Builds before v0.2.0 served the app's index.html without a no-cache header,
so the webview may keep reusing the copy it cached then and never ask v0.2.2 for
its own. Settings then reports the old version number. Quit MApper, delete the
webview cache, and relaunch:

  • Windows: %LOCALAPPDATA%\com.leonardoferhati.mapper\EBWebView
  • macOS: ~/Library/Caches/com.leonardoferhati.mapper

The Windows fix was confirmed on a real machine. The macOS path is untested,
inferred from where the app's webview keeps its HTTP cache.

Your projects and databases are stored elsewhere and are not touched. You only
lose remembered view preferences, such as the last open tab.

Verification

Backend suite 1568 passed. Frozen binary asked for its own version (0.2.2),
both Monte Carlo endpoints exercised including a 2×2 multi-item run, and
ICEV-Petrol at stock scope gives 3,195.1648 kg CO2-eq through both the
contribution and single-product paths. Build log:
build-logs/2026-09-03_0.2.2_4c20a93.md.

MApper v0.2.1

Choose a tag to compare

@leofrht-jpg leofrht-jpg released this 03 Sep 18:27
43339e6

v0.2.1 is the first release built for both macOS and Windows. v0.2.0 shipped
macOS-only because nothing in the repo could produce a Windows artifact;
.github/workflows/release-windows.yml closes that, and both installers below
are built from this one tag.

Numbers that change

Contribution analysis was computing against unresolved placeholders, and this
release fixes it. If you have run a contribution analysis on a parameterised
project, re-run it — the previous output was wrong, and not merely by a scale
factor.

A BOM row whose quantity is a parameter expression is stored with
quantity = 1.0 as a placeholder and the formula alongside it. The
contribution-analysis demand builder never resolved those expressions, so every
expression row computed at 1.0 while literal rows kept their true size. On the
Danish passenger-car fleet's ICEV-Petrol that reported 61.51 kg CO2-eq against
a true 3,195.16
— and because only some rows collapsed, it inverted the
ranking
: tyres showed as 70% of the use phase (they are 1.4%) and petrol
combustion as 5.2% (it is 73.3%).

Two further paths had the same defect and are fixed with it: standalone_lca
(computes an LCA; no frontend caller, so nothing hand-tested it) and
flatten_archetype (reported total_mass_kg, which was 1 kg of petrol on a
parameterised BOM).

Fleet and single-product impact results are unaffected — those paths always
resolved.

New: mapper-tailpipe

ecoinvent 3.10 has no operation-style passenger-car dataset. Of its 151
non-market EURO datasets, zero lack a vehicle or road input — the tailpipe
flows exist only inside transport, passenger car, ... leaves, which bundle the
fuel, the vehicle, the road and road maintenance. A model that already accounts
for the vehicle and the fuel separately cannot link one of those without
double-counting.

So a fleet whose use-phase rows link only market for petrol, low-sulfur
carries well-to-tank supply and no combustion at all — the largest CO2 term
in an ICEV lifecycle, silently absent.

scripts/build_tailpipe_db.py derives the missing half from those same
datasets: two activities, per kg of fuel, holding only the eight tailpipe
biosphere exchanges plus a production self-exchange. No fuel input, so each sits
alongside the existing supply row and double-counts nothing.

GWP100 kg CO2-eq/kg well-to-tank sibling tank-to-wheel share
petrol combustion, EURO 5 3.2236 1.0928 74.7%
diesel combustion, EURO 5 3.1549 1.0408 75.2%

Factors are derived at build time, never transcribed — each biosphere amount
divided by that dataset's own fuel input, with the source keys and ecoinvent
version written into the activity's comment. Round-trip closure against the
source leaf is 0.0003%. All 16 exchanges inherit ecoinvent's own lognormal scale
and pedigree, so Monte Carlo does not treat the dominant CO2 term as fixed.

Stated limitation: ecoinvent 3.10 stops at EURO 5 for passenger cars, and
diesel NOx is non-monotonic across the tiers it does have (EURO 5 is 26% above
EURO 4, the DPF trading NOx for particulates). EURO 5 is therefore not a
lower bound on a modern fleet. This is recorded in each generated activity's
comment, not just here.

Nothing is relinked automatically; the database is reference data.

Fixed

  • Prospective link translation. The fleet path rewrote every BOM link's
    database to the premise anchor unconditionally. It worked only because every
    row pointed at base ecoinvent and premise preserves codes — the first row
    linking a generated database took the whole prospective run down. Both
    translators now share one decision: only the base database translates, a
    non-base database is pinned, and a base code that failed to carry over falls
    back with a warning.
  • Test suite writing into real project data. Three test files wrote into the
    user's live projects — one had accumulated 30 phantom DSM systems in a project
    that has none. Storage roots are now redirected to a temp directory by
    default, with an explicit opt-out for the handful of tests that read real data
    on purpose, and a guard that fails at the write.
  • scripts/verify_pins.py. An import check does not detect environment
    drift — a drifted environment imports everything perfectly well. The release
    build now compares installed versions against the pins parsed from
    environment.yml and fails on mismatch.

Citation

CITATION.cff and the Zenodo integration were added in this cycle. The DOI is
minted from this release and will be recorded in CITATION.cff and the README.

Install

Both installers are unsigned. macOS quarantines them:

xattr -dr com.apple.quarantine /Applications/MApper.app

or right-click → Open and confirm once. On Windows, SmartScreen shows
"Windows protected your PC" → More info → Run anyway.

Platform difference worth knowing: scikit-umfpack has no win-64 build on
conda-forge, so the Windows build ships without the UMFPACK factorisation-reuse
path and prospective runs are materially slower there. The numbers are
correct, not degraded
— it is the same computation reaching the same result by
a slower route, so slowness on Windows is not a symptom of anything wrong.

MApper does not bundle ecoinvent — supply your own licensed copy.

Full changelog: v0.2.0...v0.2.1

MApper v0.2.0

MApper v0.2.0 Pre-release
Pre-release

Choose a tag to compare

@leofrht-jpg leofrht-jpg released this 02 Sep 05:59
88dae95

Numbers that change

v0.1.7 was the last tagged release, so this tag carries several months of unreleased work — which is why four methodological changes land together rather than one. Anyone with v0.1.x output should re-run before citing.

AR is now a single-year emissions share. sharing_data.json's layer-1 AR held a cumulative 1850–2020 CO₂ total — a different kind of quantity from the other four principles, not a variant of one. It is now Denmark's total emissions over the world total for one data year (Climate TRACE 2022, GWP100 CO₂e). AR allocates ozone_depletion, particulate_matter and photochemical_ozone_formation, and drives the AR whisker of the sharing-sensitivity box plot for all 16 boundaries. Re-sourcing multiplied those three SRs by 1.4896.

acidification moved EpC → AGR, and exact-match method mapping took boundary coverage 15 → 16. A configuration created before this keeps computing the old way unless reset — see A configuration follows the current defaults in CLAUDE.md.

The CO₂e conversion is refit per temperature target. 1.5 °C now uses AR6 C1+C2, 2 °C uses C3+C4, each carrying its own affine and offset and ensemble on one frozen dataclass. Previously two affines branched while a single C3+C4 offset applied to both, so 1.5 °C budgets were re-baselined against 2 °C scenarios. Every 2 °C factor is byte-identical; 1.5 °C factors move.

Paired multi-item Monte Carlo now samples the foreground (#75). It previously had no foreground RNG at all — demands were built once and never resampled. Measured on a two-item comparison with one scored parameter: GSD² 1.1099 → 1.1938, i.e. 67.7 % of the total log-variance was missing.

What this means for existing results: any uncertainty interval from a paired multi-item comparison in v0.1.x understates the spread, and should be re-run. The understatement is largest where the mode is most useful — archetypes whose rows are entirely expressions have only parametric foreground uncertainty, so a v0.1.x paired run on those reported essentially none of it.

Audit response

An external code audit in August 2026 identified four critical and seven major findings. All four criticals are closed in this release.

Provenance now rides on the result rather than being reconstructed at export time.

  • computed_at + mapper_version on every result (#76). Ten export builders stamped datetime.now() into a row labelled "Calculation date" — the export date. Re-exporting last week's result claimed it was calculated today. An unstamped result now reads "not recorded", never today's date.
  • Two content hashes (#77) — authored BOM and parameter table, separately, so a change is attributable. Survives an export/re-import round trip on all 36 real archetypes.
  • Database and LCIA fingerprint (#79) — modified / number / num_cfs / abbreviation, with its limits stated: regeneration not tampering, count-preserving edits invisible, registration not content.
  • Silent paths fail closed (#67–#69, #71–#72) — unlinked rows, unmapped cohorts, stale filters, unit mismatches at compute, unknown sensitivity-case names, and lci_scenarios counted as an axis.
  • One GSD² definition (#66), exp(2σ), with a separate exact dispersion_95. Pre-2026-08-31 exports convert as reported ^ 1.020408 — always an understatement, and a small one: +0.4 % to +0.8 % across the typical 1.2–1.5 range (+0.19 % at 1.10, +1.42 % at 2.00). Convert rather than re-run; no conclusion changes at that magnitude, which is inside Monte Carlo noise at 1000 iterations.

Features

  • BOM row provenance (#65) — a free-text Description that round-trips through the workbook.
  • Keyframed parameters resolve per simulation year in scaling rules (#74) and subsystem dependency rules (#78).
  • CITATION.cff and a scoped Dependabot config (#81).

Fixes

Variance accumulator keyed by node_id (#63) · e-waste relinks and a unit_mismatch upload warning (#64) · paired CF cache reset (#58) · unregistered method tuples rejected up front (#57) · Cache-Control: no-cache on index.html only (#61) · tour escape hatch (#60) · three user-facing em dashes, including one hidden inside a base64 data URL (#91).

Installing on macOS — Gatekeeper

This build is unsigned and unnotarised, so macOS quarantines it. After moving MApper.app to /Applications:

xattr -dr com.apple.quarantine /Applications/MApper.app

Then open it normally. Without that you'll get "MApper is damaged and can't be opened" — which is Gatekeeper's message for an unsigned app, not a corrupt download. Verify the DMG against the SHA-256 below if you want to be sure.

Windows asset to follow.

Artefact

commit 88dae9553b0b85d0a1c8d814eabc29ac9eb04fa0
DMG MApper_0.2.0_aarch64.dmg (Apple silicon)
bytes 442,163,252
SHA-256 3b0f98dc0cd102dca22b49ebebfff85df6577a1670d5ede5490588fe2777299f

MApper v0.1.7

MApper v0.1.7 Pre-release
Pre-release

Choose a tag to compare

@leofrht-jpg leofrht-jpg released this 14 Aug 06:22
1bf9689

Methodology — changes results

Acquired Rights is now a single-year emissions share. Layer 1 previously held a cumulative 1850–2020 CO2 pair while layers 2 and 3 grandfathered on current-year shares — one principle, two kinds of quantity. The stored pair also matched no published series. Layer 1 is now Denmark ÷ World total GHG for 2022 (Climate TRACE, CO2e GWP100). Sustainability Ratios for ozone depletion, particulate matter and photochemical ozone formation rise by ×1.4896.

Acidification now allocates on AGR, not EpC. Denmark's agricultural output share exceeds its per-capita share, so the allocated safe operating space grows and the Sustainability Ratio falls. Measured on the Danish passenger-car fleet, every acidification SR is ×0.2637 of its previous value (2025: 0.772 → 0.203; 2050: 0.398 → 0.105). Acidification remains below SR = 1 throughout under both principles.

Photochemical ozone formation is now mapped. The boundary set's ef_indicator was missing EF v3.1's ": human health" qualifier, so the boundary silently had no method and was absent from every SR, radar and timeline. Coverage is 16/16.

The CO2→CO2e budget conversion was refitted. Both temperature legs are now fitted over the AR6 category matching their target (C1+C2 for 1.5 °C, C3+C4 for 2 °C), replacing an out-of-domain application of a published 1.5 °C fit. 1.5 °C factors change; 2 °C factors are unchanged. Both scenario sets ship as CSVs that reproduce their own coefficients.

AESA configuration

  • Configurations no longer freeze a copy of the sharing data or method mapping at creation, so they pick up corrected defaults. A one-time migration clears existing frozen copies.
  • The Sharing preset section is gone; the chain, principles and category assignments are directly editable.
  • Method → PB mapping expands to the full table.
  • Template button removed; Export settings serves that purpose.

Charts and copy

  • EF category labels wrap at their own commas instead of truncating mid-word.
  • Glossary behind an info button.
  • DSM Stock composition respects assigned cohort colours.
  • Em dashes removed from user-facing copy.

macOS (Apple silicon). The Windows build follows from this same tag.

MApper_0.1.7_aarch64.dmg · 442,000,121 bytes
SHA-256 7da7db4e3c86d6b7e8716bc7226222e0c5004eb342a36c3c3c9c0bb08070642a

First launch: right-click → Open (unsigned build), and allow 30–60 s while the backend starts.

MApper v0.1.6

MApper v0.1.6 Pre-release
Pre-release

Choose a tag to compare

@leofrht-jpg leofrht-jpg released this 07 Aug 14:56
289ad95

Fixes

  • Carbon budget depletion year was reported one year early in both the sidebar sparkline and the Timeline inset; both now read the engine's value and agree with each other
  • "Load demo project" reported an empty project after building one, and the activity table kept the previous project's contents after a project switch
  • Export settings failed with a 422 on any configuration that had not been saved

AESA

  • Sharing principles can carry year-varying values, with a per-principle step / interpolate mode
  • The chain editor shows which principles carry a series and which are constants
  • The sensitivity toggle is now labelled "Sharing sensitivity" — it varies the sharing principle, not the parameter Sensitivity cases on Impact Assessment

Install (Windows)

Download MApper_0.1.6_x64-setup.exe and run it. The installer is unsigned, so SmartScreen will warn — choose More info → Run anyway.

If you are upgrading from an earlier version and the app fails to start, remove %LOCALAPPDATA%\MApper and reinstall: the installer overlays the previous install and a stale mixed tree can prevent the backend from launching.

ecoinvent is not bundled. Without a licence, use Load demo project on the Database Explorer for a synthetic, fictional dataset that exercises the full DSM → material flows → LCA → AESA workflow.

MApper v0.1.5

MApper v0.1.5 Pre-release
Pre-release

Choose a tag to compare

@leofrht-jpg leofrht-jpg released this 05 Aug 21:06
011a3f4

The whole AESA configuration now round-trips through Excel. Section (2) of the AESA sidebar — renamed simply AESA configuration — gains Template, Export settings and Import settings in its header, covering all seven groups at once:

  • planetary boundary set
  • method → planetary-boundary mapping
  • sharing preset
  • downscaling chain
  • sharing principles
  • category assignments
  • carbon budget (including the SSP depletion pathway and the CO₂/CO₂e basis)

Previously only the sharing preset could be exported, so three of the seven groups could not leave the app.

Template gives you a blank-but-complete workbook with every field present and a locked Reference sheet listing valid values for every constrained field — boundary sets, principles, AR6 budget options, SSP pathways, budget basis — generated from your own installation rather than a static list.

Import settings validates the entire workbook before applying anything. If any field is invalid the whole import is rejected with a per-sheet, per-field list and your current configuration is left untouched; there is no partial application. Applying is confirmed first, and you can optionally save the sharing-preset half as a reusable template at the same time.

Also in this release:

  • Each section of the cohort-mapping modal is named after its own system or subsystem and collapses independently, instead of one generic heading and a single collapsible
  • Excel exports taken from a demo project are DEMO_-prefixed
  • Numbers in exported workbooks are rounded to 12 decimal places, stated on the Instructions sheet — .xlsx cannot carry full float64, so a cell is the canonical value of a setting rather than the exact in-memory figure

Requires macOS on Apple silicon (arm64).

Windows remains at v0.1.3. The Windows build is blocked on a numpy/UMFPACK conflict, not merely pending; v0.1.4 and v0.1.5 are macOS-only.

MApper v0.1.4

MApper v0.1.4 Pre-release
Pre-release

Choose a tag to compare

@leofrht-jpg leofrht-jpg released this 05 Aug 00:26

You no longer need an ecoinvent licence to run MApper. ecoinvent is separately licensed and has never been bundled, which meant a fresh install could not compute anything. v0.1.4 ships a demo project built from synthetic data:

cd mapper-backend
python scripts/load_demo_project.py --verify

or, in the app, open Database Explorer and click "Load demo project (no licence needed)". First run takes about 10 seconds.

It gives you a 31-year (2020–2050) passenger-vehicle fleet with battery-electric and combustion cohorts, and everything downstream of it — cohort-tracked stock and flows in the DSM Modeller, two bills of materials, a real bw2calc solve using real elementary flows and real IPCC characterisation factors, and impact results downscaled against planetary boundaries in AESA. That covers the DSM → material flows → LCA → AESA chain end to end.

Warning

Every number in the demo is fictional. The LCA arithmetic is real; the inventory it consumes is invented. A red banner stays on screen while the demo project is active, every generated name carries a (FICTIONAL DATA) suffix, and Excel exports are DEMO_-prefixed with a warning row on every sheet. Do not cite or publish demo output as an environmental assessment.

The demo lives in its own Brightway2 project and touches nothing else. A real assessment still needs your own ecoinvent database, and prospective (premise) analysis needs both ecoinvent and a premise key.

Also in this release:

  • Cohort-mapping modal: each section is now named after its system or subsystem instead of a generic "Cohort mapping" heading, uses one consistent "N of M mapped" count, and every section collapses independently — the modal was previously an unmanageable scroll with several subsystems
  • Setup is one documented path: environment.yml, the same environment CI installs. setup.sh/setup.bat still work as one-command wrappers and no longer modify an existing map environment
  • Fixed: the dev server now works on any local port — Vite auto-increments off 5173 when it is busy, which previously failed with an unexplained network error
  • Excel exports from a demo project carry an in-workbook fictional-data warning, so a spreadsheet that leaves the app cannot be mistaken for a real assessment

Requires macOS on Apple silicon (arm64). Windows builds follow separately.

MApper v0.1.3

MApper v0.1.3 Pre-release
Pre-release

Choose a tag to compare

@leofrht-jpg leofrht-jpg released this 30 Jul 14:47

v0.1.3 supersedes v0.1.2, which contained a process-leak defect: the frozen backend sidecar spawned an unbounded chain of multiprocessing resource_tracker processes — one every ~8 seconds, 200–450 MB resident each — which starved the backend after roughly an hour of uptime. The app looked healthy at launch and became unresponsive later ("No projects found", "Load failed"). If you are on v0.1.2, upgrade.

Performance: scikits.umfpack and its SuiteSparse dylibs are bundled in the packaged app, restoring factorisation reuse (previously every solve re-factorised). A prospective LCA run on the Danish fleet case — 3 LCI scenarios × 26 years × 25 indicators — completes in under a minute, down from ~54 minutes.

Also in this release:

  • The About card no longer shows dead external links (Tauri's WKWebView cannot open them without an opener plugin); the contact address is selectable text and the MPL 2.0 notice is preserved
  • Unified Excel export filenames: {system}+{subsystems}_{LCA|pLCA|AESA|DSM}.xlsx
  • Subsystem results in the Impact Assessment exports (By subsystem sheet)
  • New per-subsystem DSM export with a scope selector
  • Comparison tab can pick one LCI scenario from a multi-scenario run
  • Cohort colours propagate across DSM and Impact Assessment charts
  • Collapsible sections in the subsystem panel
  • Raw UUIDs removed from cohort and material labels

Requires macOS on Apple silicon (arm64).