Portrait of Simon van Lierde

Simon van Lierde

Research software engineer · PhD candidate, Leiden University

At CML, Leiden University, I write open software and collect open data for industrial ecology and the circular economy. Most of my time goes into R9lab, where we take products apart to record what they're made of.

Curriculum vitae, sheet 2

Open any numbered part.

1 CAMERA RIG2 CAPTURE APP3 WEB APP4 API5 DATABASE6 DOCS1 CAMERA RIG2 CAPTURE APP3 WEB APP4 API5 DATABASE6 DOCS
Fig. 1: R9lab, exploded view.

Selected work

Research platform

R9lab

Industrial ecology has little data on what products are made of. R9lab records it by taking durable goods apart, component by component. I designed and built the platform, and CML now uses it. It has a FastAPI backend, a PostgreSQL data model for life-cycle assessment, and an Expo / React Native capture app.

In use at CML since Oct 2025, including two teardown workshops.

Notes A–D · running totals

  1. 93Products documented
  2. 1 779Components catalogued
  3. 4 454Images captured
  4. 135Workshop participants

Products, components and images as counted ; participants at the two pilot workshops.

Usesmonitoringjsonvet

  • FastAPI
  • PostgreSQL
  • Expo
  • React Native
Measure
050100Oct2025NovDecJan2026FebMarAprMayJunJulAugSepOct93

Products: 93 by Oct 2026.

Products, running total by month
PeriodAddedRunning total
Oct 20252626
Nov 20251642
Dec 2025345
Jan 20261358
Feb 20261573
Mar 2026982
Apr 2026890
May 2026292
Jun 2026092
Jul 2026092
Aug 2026092
Sep 2026092
Oct 2026193
Fig. 2: R9lab running totals of products, Oct 2025 to Oct 2026.

web app

credit-matrix

Co-authors fill in who did what on a paper with the CRediT roles and export it as JATS4R XML. A Python tool beside it reads the roles from open-access papers. On 27,874 papers it never trained on, a small fine-tuned model scored higher than my rule-based parser and a large language model given no examples.

Usescitesync

  • TypeScript
  • Next.js 16
  • Python
  • DuckDB
  • machine learning

interactive map

ramascene-explorer

Pick a country and see where in the world its consumption causes greenhouse-gas emissions, jobs and metal-ore extraction, and how 153 RaMa-Scene scenarios would have changed that in EXIOBASE's 2011 economy. The page runs without a server and fetches about 0.98 MB to start. Brightway, pymrio and numpy give the same footprint for a test product.

Usesjsonvetcitesync

  • Svelte
  • D3
  • Parquet
  • EXIOBASE

interactive visual

cv-ie-taxonomy

Reading a product's label with computer vision scores 95.7% on repair photos but 39.7% at the recycler. My upcoming review paper rates what cameras can tell about used products, and on field photos no task reaches the top rating. This interactive page shows it on a desk fan that comes apart as you scroll.

  • React
  • TypeScript
  • SVG
  • computer vision

benchmark suite

brightway-benchmarks

This suite caught Brightway's LCA calculator, bw2calc 3.0.0, running its iterative solver about five times slower when the optional PyPardiso solver is missing. I reported it, and the maintainer's fix shipped in 3.1.0. It tracks speed across Brightway releases and checks each score against an independent calculation, on made-up databases shaped like ecoinvent.

Usesproject-templates

  • Python
  • Brightway
  • LCA
  • asv
  • Docker

provenance library

sourceledger

Publishers sometimes revise a data file without saying so, and results built on it change. sourceledger, a Python library, stamps each row of a dataset with the download it came from (URL, time and SHA-256) and flags a source that has changed since. It writes Frictionless Data Packages and is on PyPI with a Zenodo DOI.

Usesproject-templatescitesyncUsed byproject-templates

  • Python
  • PyPI
  • Frictionless
  • reproducible builds

observability stack

monitoring

A backup container once crash-looped 668 times over 19 hours while every monitor read green. So I redesigned CML's shared monitoring: now a scheduled job that stops checking in raises an alarm. Logs, traces and metrics come in through OpenTelemetry and link up in Grafana, and R9lab sends to it today.

Used byR9lab

  • OpenTelemetry
  • Grafana stack
  • Docker Compose
  • OpenTofu

consistency checker

codemeta-drift

CodeMeta, a standard for describing research software, disagrees with itself. This tool compares its list of fields, its examples and its 46 mappings to other formats. In the development version, every one of the 46 mappings still listed a field the standard had dropped, which I raised with the maintainers.

Usesproject-templatescitesyncUsed bycitesync

  • Python
  • CodeMeta
  • FAIR

thesis + dashboard

msc-thesis-ie

In The Hague, offices have 11% of the floor area but cause 79% of the greenhouse-gas emissions from cooling. I rebuilt the model from my MSc Industrial Ecology thesis (Leiden / TU Delft) as a Snakemake pipeline: an hourly heat balance for 59,381 buildings from the Dutch building register (BAG), followed by LCA.

Usescitesync

  • Python
  • Snakemake
  • LCA
  • Geospatial

Smaller projects

  • AI4IE hub: a proposed resource hub for the AI for industrial ecology working group, with 75 literature entries and in-browser demos. (live)
  • io-notebook: a marimo course on environmentally extended input-output analysis that runs in the browser, with self-checks that rerun as you move the sliders. (live)

When an industrial-ecology library I use gets something wrong or runs slowly, I fix it upstream:

Merged upstream (33 pull requests)

  • lca_algebraic: fixed truncated-normal and lognormal sampling, method lookup and a cache that went stale across time zones; halved the time to expand parameters, and made Sobol analysis about 20× faster when second-order indices are not needed (#106, #107, #108, #109, #110 merged into the dev branch)
  • Brightway (bw2calc): fixed normalized and weighted scores that went stale after a new impact assessment, and a cutoff that broke on negative scores (#167, #168)
  • pymrio: made one step of the account calculation 26× faster with identical results, fixed three small bugs, and got the development test job passing again (#179, #180, #181)
  • Brightway (stats_arrays): stopped loading scipy.stats at import, which makes importing bw2calc and bw2data about 0.3 s faster (#43)
  • flodym: stopped lifetime extension from overwriting the model's parameters, and made it about 9× faster (#198)
  • bw_timex: made building the time-explicit matrices 3 to 4× faster, with identical matrices and scores (#244)
  • premise: fixed two bugs in how external scenarios apply efficiency changes, one of which scaled flows they were meant to leave alone (#316, #317)
  • Activity Browser: kept parameter amounts editable, loaded scenario files with empty keys, and kept a Monte Carlo seed of 0 (#1743, #1744 merged into the major branch)
  • SALib: let ProblemSpec take samples and results as plain lists, and gave a clear error for anything that is not numbers (#700)
  • Brightway (bw2data): upgraded deepdiff past two security advisories without breaking saved project revisions (#295)
  • Boavizta API: made the use phase return values for six impact criteria that said 'not implemented' (#583)
  • CodeMeta: fixed the GitHub crosswalk, which mapped a project's name to its owner/repo path (#505)
  • SchemaStore: added sourceledger's config schema, and fixed a schema that failed its own valid tests under draft-07 (#6522, #6531)
  • pyOpenSci Python package guide: updated the tutorials for project URL labels and PEP 735 dependency groups, and fixed a version pin that does not exist (#823, #824, #827)
  • NLeSC Python template: trimmed the keywords a new package gets and dropped empty ones, and made tox run the generated package's tests (#715, #716)
  • fastapi-mail: improved Redis connection handling and let it reuse an existing connection (#283, #284)
  • cspell-dicts: added the notebook file type and new technical terms (#5339, #5364)
  • sentier_data_tools: improved IRI handling (#2)

Personal projects (5)

multiplayer game

6-second-scribbles

A drawing and guessing game you play live with friends in the browser, built with Vue 3 and FastAPI. In a load test, one server container with one CPU kept about 200 rooms of 6 players going, with 95% of messages arriving within 250 ms.

Usesjsonvet

  • Vue 3
  • FastAPI
  • WebSockets

CLI tool

roadmap-sh-file-integrity-checker

My answer to the roadmap.sh file integrity checker exercise, written three times: in bash, Python and Rust. All three share one signed fingerprint format, and a test checks that they agree on random files. It has a written threat model and refuses an older signed record put back in place.

  • Rust
  • Python
  • bash

web app

tide

A period tracker that keeps every entry on your device and sends nothing anywhere. On the past records of 581 people in an open dataset, its next-period prediction is off by 2.0 days on average after six cycles, against 2.6 days for a fixed 28-day cycle.

Usesproject-templatesjsonvet

  • React
  • TypeScript
  • PWA

web app

bikespot

Remembers where you parked your bike, the way a station bike park labels it (lane, rack level, rack number), with an optional photo and GPS position. It installs from the browser, works offline, keeps everything on your device, and speaks seven languages.

Usesproject-templatesjsonvet

  • Preact
  • TypeScript
  • PWA

web app

scattergories

An unofficial table companion for the Scattergories party game. It draws each letter from the language's own alphabet, weighted by how often that language uses it, in nine languages. It also picks the categories and runs the timer.

Usesproject-templatesjsonvet

  • React
  • i18next
  • PWA