diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 42d999fbe3b6f906bb7993f8df3a0ebcc009a42b..878db6a46da906b2779e815501a9c0be23e4f358 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -203,7 +203,7 @@ check python dependencies:
   before_script:
     - scripts/check_elastic.sh
     - uv pip install -e ".[dev]"
-    - uv pip install -r default_plugins.txt -c requirements-dev.txt # required until all legacy tests are removed
+    - uv pip install -r requirements-plugins.txt -c requirements-dev.txt # remove this after moving to distro
 
 generate pytest timings:
   extends: .base_test
@@ -314,7 +314,7 @@ check gui artifacts:
     GIT_SUBMODULE_PATHS: dependencies/*
   script:
     - uv pip install ".[dev,parsing,infrastructure]"
-    - uv pip install -r default_plugins.txt # remove this after moving to distro
+    - uv pip install -r requirements-plugins.txt -c requirements-dev.txt # remove this after moving to distro
     - scripts/check_gui_artifacts.sh
   after_script:
     - >
diff --git a/Dockerfile b/Dockerfile
index d5a5deb5e81237b4b377c1f9be7cdafb69da0ff8..9b1b0398bd75f54e42049fb1f7f64f017cc336e0 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -196,8 +196,8 @@ RUN pip install nomad-lab-*.tar.gz
 
 # Install default plugins. TODO: This can be removed once we have a proper
 # distribution project.
-COPY default_plugins.txt .
-RUN uv pip install -r default_plugins.txt -c requirements.txt
+COPY requirements-plugins.txt .
+RUN uv pip install -r requirements-plugins.txt -c requirements.txt
 
 
 # ================================================================================
diff --git a/default_plugins.txt b/default_plugins.txt
index 6710e198a6b4f9d1d90a9208e4ed3f495842cb79..aa8012f975deb976b180e9c6abbe4cffb38168a7 100644
--- a/default_plugins.txt
+++ b/default_plugins.txt
@@ -3,11 +3,11 @@ git+https://github.com/FAIRmat-NFDI/nomad-porous-materials.git@522f4a3208077f534
 git+https://github.com/FAIRmat-NFDI/nomad-aitoolkit.git@b203f8eb28dc4b6771a39d5c5b7ad3d9d8583ac8
 nomad-simulations==0.0.1
 pynxtools[convert]==0.5.0
-git+https://github.com/nomad-coe/nomad-schema-plugin-run.git@92d120d
-git+https://github.com/nomad-coe/nomad-schema-plugin-simulation-workflow.git@c9bd20c
-git+https://github.com/nomad-coe/nomad-normalizer-plugin-bandstructure.git@6521a2b
-git+https://github.com/nomad-coe/nomad-normalizer-plugin-dos.git@dad7e2b
-git+https://github.com/nomad-coe/nomad-normalizer-plugin-soap.git@1b0e60e
-git+https://github.com/nomad-coe/nomad-normalizer-plugin-spectra.git@ec14732
-git+https://github.com/nomad-coe/nomad-normalizer-plugin-system.git@01523dd
-git+https://github.com/nomad-coe/nomad-normalizer-plugin-simulation-workflow.git@22af484
+git+https://github.com/nomad-coe/nomad-schema-plugin-run.git@develop
+git+https://github.com/nomad-coe/nomad-schema-plugin-simulation-workflow.git@develop
+git+https://github.com/nomad-coe/nomad-normalizer-plugin-bandstructure.git@develop
+git+https://github.com/nomad-coe/nomad-normalizer-plugin-dos.git@develop
+git+https://github.com/nomad-coe/nomad-normalizer-plugin-soap.git@develop
+git+https://github.com/nomad-coe/nomad-normalizer-plugin-spectra.git@develop
+git+https://github.com/nomad-coe/nomad-normalizer-plugin-system.git@develop
+git+https://github.com/nomad-coe/nomad-normalizer-plugin-simulation-workflow.git@develop
diff --git a/pyproject.toml b/pyproject.toml
index b5032f2d753fa3563f02cccc193e21e7b771137e..3998bb214c399c0091fa7e0fcd40f7ed16153208 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -211,3 +211,6 @@ disable_error_code = "import, annotation-unchecked"
 
 
 [tool.setuptools_scm]
+
+[tool.uv]
+index-url = "https://gitlab.mpcdf.mpg.de/api/v4/projects/2187/packages/pypi/simple"
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 481e6c62324e5ededca319d22c79014949d67540..fa789cee63e837037b0c763d2b6e432486324d95 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -110,7 +110,7 @@ m2r==0.2.1                # via -r requirements.txt, nomad-lab (pyproject.toml)
 mako==1.3.5               # via alembic, -r requirements.txt
 markdown==3.7             # via mkdocs, mkdocs-click, mkdocs-material, pymdown-extensions
 markupsafe==2.1.5         # via jinja2, mako, mkdocs, werkzeug, -r requirements.txt, nomad-lab (pyproject.toml)
-matid==2.1.0              # via -r requirements.txt, nomad-lab (pyproject.toml)
+matid==2.1.1              # via -r requirements.txt, nomad-lab (pyproject.toml)
 matplotlib==3.9.2         # via ase, asr, mdanalysis, phonopy, pymatgen, -r requirements.txt
 mda-xdrlib==0.2.0         # via mdanalysis, pyedr, -r requirements.txt
 mdanalysis==2.7.0         # via -r requirements.txt, nomad-lab (pyproject.toml)
@@ -215,10 +215,10 @@ rfc3987==1.3.8            # via jsonschema, -r requirements.txt
 rope==0.21.0              # via nomad-lab (pyproject.toml)
 ruamel-yaml==0.18.6       # via jupyter-telemetry, oauthenticator, pymatgen, -r requirements.txt, nomad-lab (pyproject.toml)
 ruamel-yaml-clib==0.2.8 ; python_full_version < '3.13' and platform_python_implementation == 'CPython'  # via ruamel-yaml, -r requirements.txt
-ruff==0.6.1               # via nomad-lab (pyproject.toml)
+ruff==0.6.2               # via nomad-lab (pyproject.toml)
 runstats==2.0.0           # via -r requirements.txt, nomad-lab (pyproject.toml)
 scikit-learn==1.5.1       # via matid, -r requirements.txt, nomad-lab (pyproject.toml)
-scipy==1.14.0             # via ase, griddataformats, matid, mdanalysis, pymatgen, scikit-learn, -r requirements.txt, nomad-lab (pyproject.toml)
+scipy==1.14.1             # via ase, griddataformats, matid, mdanalysis, pymatgen, scikit-learn, -r requirements.txt, nomad-lab (pyproject.toml)
 secretstorage==3.3.3 ; sys_platform == 'linux'  # via keyring
 sentinels==1.0.0          # via mongomock, -r requirements.txt
 six==1.16.0               # via asttokens, basicauth, elasticsearch-dsl, html5lib, isodate, pybtex, python-dateutil, rdflib, rfc3339-validator, validators, -r requirements.txt
@@ -251,7 +251,7 @@ tqdm==4.66.5              # via mdanalysis, pyedr, pymatgen, twine, -r requireme
 traitlets==5.14.3         # via jupyter-telemetry, jupyterhub, -r requirements.txt
 twine==3.4.2              # via nomad-lab (pyproject.toml)
 typed-ast==1.5.5          # via nomad-lab (pyproject.toml)
-types-python-dateutil==2.9.0.20240316  # via arrow, -r requirements.txt
+types-python-dateutil==2.9.0.20240821  # via arrow, -r requirements.txt
 typing-extensions==4.12.2  # via alembic, fastapi, jwcrypto, mypy, pydantic, sqlalchemy, -r requirements.txt
 typish==1.9.3             # via nptyping, -r requirements.txt
 tzdata==2024.1            # via celery, pandas, -r requirements.txt
@@ -259,7 +259,7 @@ uncertainties==3.2.2      # via pymatgen, -r requirements.txt
 unidecode==1.3.2          # via -r requirements.txt, nomad-lab (pyproject.toml)
 uri-template==1.3.0       # via jsonschema, -r requirements.txt
 urllib3==1.26.19          # via docker, elasticsearch, nomad-openbis, requests, -r requirements.txt
-uv==0.3.0                 # via nomad-lab (pyproject.toml)
+uv==0.3.1                 # via nomad-lab (pyproject.toml)
 uvicorn==0.30.6           # via h5grove, -r requirements.txt, nomad-lab (pyproject.toml)
 uvloop==0.20.0 ; platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'  # via uvicorn, -r requirements.txt
 validators==0.18.2        # via -r requirements.txt, nomad-lab (pyproject.toml)
@@ -270,7 +270,7 @@ wcwidth==0.2.13           # via prompt-toolkit, -r requirements.txt
 webcolors==24.8.0         # via jsonschema, -r requirements.txt
 webencodings==0.5.1       # via html5lib, -r requirements.txt
 websockets==13.0          # via uvicorn, -r requirements.txt
-werkzeug==3.0.3           # via flask, -r requirements.txt
+werkzeug==3.0.4           # via flask, -r requirements.txt
 wrapt==1.16.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
 xarray==2024.7.0          # via -r requirements.txt, nomad-lab (pyproject.toml)
 zipp==3.20.0              # via importlib-metadata, -r requirements.txt
diff --git a/requirements-plugins.txt b/requirements-plugins.txt
new file mode 100644
index 0000000000000000000000000000000000000000..22de0003740a334fbb661c7da7a62134c9be4147
--- /dev/null
+++ b/requirements-plugins.txt
@@ -0,0 +1,272 @@
+# This file was autogenerated by uv via the following command:
+#    uv pip compile --universal -p 3.11 --annotation-style=line --output-file=requirements-plugins.txt --unsafe-package nomad-lab -c requirements-dev.txt default_plugins.txt
+aniso8601==9.0.1          # via nomad-lab, -c requirements-dev.txt
+anyio==4.4.0              # via httpx, jupyter-server, -c requirements-dev.txt
+anytree==2.12.1           # via pynxtools
+appnope==0.1.4 ; platform_system == 'Darwin'  # via ipykernel
+argon2-cffi==23.1.0       # via jupyter-server
+argon2-cffi-bindings==21.2.0  # via argon2-cffi
+arrow==1.3.0              # via isoduration, -c requirements-dev.txt
+asciitree==0.3.3 ; platform_machine == 'AMD64' or platform_machine == 'x86_64'  # via zarr
+ase==3.22.1               # via ifes-apt-tc-data-modeling, matid, nomad-lab, nomad-porous-materials, pynxtools, -c requirements-dev.txt
+asteval==1.0.2            # via lmfit
+asttokens==2.4.1          # via stack-data, -c requirements-dev.txt
+async-lru==2.0.4          # via jupyterlab
+async-property==0.2.2     # via python-keycloak, -c requirements-dev.txt
+attrs==24.2.0             # via jsonschema, -c requirements-dev.txt
+babel==2.16.0             # via jupyterlab-server, -c requirements-dev.txt
+beautifulsoup4==4.12.3    # via nbconvert, -c requirements-dev.txt
+bitarray==2.9.2           # via nomad-lab, -c requirements-dev.txt
+bleach==6.1.0             # via nbconvert
+blosc2==2.7.1             # via tables
+cachetools==5.5.0         # via nomad-lab, -c requirements-dev.txt
+certifi==2024.7.4         # via elasticsearch, httpcore, httpx, requests, -c requirements-dev.txt
+cffi==1.17.0              # via argon2-cffi-bindings, cryptography, pyzmq, -c requirements-dev.txt
+charset-normalizer==3.3.2  # via requests, -c requirements-dev.txt
+click==8.1.7              # via click-default-group, dask, nomad-lab, pynxtools, -c requirements-dev.txt
+click-default-group==1.2.4  # via pynxtools
+cloudpickle==3.0.0        # via dask
+colorama==0.4.6 ; sys_platform == 'win32' or platform_system == 'Windows'  # via click, ipython, tqdm, -c requirements-dev.txt
+comm==0.2.2               # via ipykernel, ipywidgets
+contourpy==1.2.1          # via matplotlib, -c requirements-dev.txt
+cryptography==43.0.0      # via jwcrypto, rfc3161ng, -c requirements-dev.txt
+cycler==0.12.1            # via matplotlib, -c requirements-dev.txt
+dask==2024.8.1            # via hyperspy, kikuchipy, orix, pyxem, rosettasciio
+debugpy==1.8.5            # via ipykernel
+decorator==5.1.1          # via ipyparallel, ipython, -c requirements-dev.txt
+defusedxml==0.7.1         # via nbconvert
+deprecation==2.1.0        # via python-keycloak, -c requirements-dev.txt
+diffpy-structure==3.2.0   # via diffsims, kikuchipy, orix
+diffsims==0.6.0           # via kikuchipy, pyxem
+dill==0.3.8               # via hyperspy, lmfit
+docstring-parser==0.16    # via nomad-lab, -c requirements-dev.txt
+elasticsearch==7.17.1     # via elasticsearch-dsl, -c requirements-dev.txt
+elasticsearch-dsl==7.4.0  # via nomad-lab, -c requirements-dev.txt
+entrypoints==0.4          # via ipyparallel
+et-xmlfile==1.1.0         # via openpyxl, -c requirements-dev.txt
+executing==2.0.1          # via stack-data, -c requirements-dev.txt
+fabio==2024.4.0           # via pyfai, silx
+fairmat-readers-xrd==0.0.6  # via pynxtools-xrd
+fasteners==0.19           # via mdanalysis, zarr, -c requirements-dev.txt
+fastjsonschema==2.20.0    # via nbformat
+findiff==0.10.0           # via pynxtools-stm
+flatdict==4.0.1           # via ifes-apt-tc-data-modeling, pynxtools-em
+fonttools==4.53.1         # via matplotlib, -c requirements-dev.txt
+fqdn==1.5.1               # via jsonschema, -c requirements-dev.txt
+fsspec==2024.6.1          # via dask, hyperspy
+greenlet==3.0.3 ; (python_full_version < '3.13' and platform_machine == 'AMD64') or (python_full_version < '3.13' and platform_machine == 'WIN32') or (python_full_version < '3.13' and platform_machine == 'aarch64') or (python_full_version < '3.13' and platform_machine == 'amd64') or (python_full_version < '3.13' and platform_machine == 'ppc64le') or (python_full_version < '3.13' and platform_machine == 'win32') or (python_full_version < '3.13' and platform_machine == 'x86_64')  # via sqlalchemy, -c requirements-dev.txt
+griddataformats==1.0.2    # via mdanalysis, -c requirements-dev.txt
+h11==0.14.0               # via httpcore, -c requirements-dev.txt
+h5grove==1.3.0            # via jupyterlab-h5web, -c requirements-dev.txt
+h5py==3.11.0              # via fabio, h5grove, hdf5plugin, hyperspy, ifes-apt-tc-data-modeling, jupyterlab-h5web, kikuchipy, nionswift, nomad-lab, orix, pyfai, pynxtools, pynxtools-mpes, pynxtools-xps, pyxem, silx, -c requirements-dev.txt
+hdf5plugin==4.4.0         # via fabio
+hjson==3.1.0              # via nomad-lab, -c requirements-dev.txt
+httpcore==1.0.5           # via httpx, -c requirements-dev.txt
+httpx==0.27.0             # via jupyterlab, nomad-lab, python-keycloak, -c requirements-dev.txt
+hyperspy==1.7.5           # via kikuchipy, pyxem
+idna==3.7                 # via anyio, httpx, jsonschema, requests, -c requirements-dev.txt
+ifes-apt-tc-data-modeling==0.2.2  # via pynxtools-apm
+igor2==0.5.8              # via pynxtools-xps
+imageio==2.27.0           # via hyperspy, kikuchipy, nionswift, nionswift-io, nionui, scikit-image
+importlib-metadata==7.1.0  # via dask, hyperspy, nomad-lab, pynxtools, -c requirements-dev.txt
+ipykernel==6.29.5         # via ipyparallel, jupyter, jupyter-console, jupyterlab, qtconsole
+ipyparallel==8.8.0        # via hyperspy
+ipython==8.26.0           # via hyperspy, ipykernel, ipyparallel, ipywidgets, jupyter-console
+ipywidgets==8.1.5         # via jupyter
+isoduration==20.11.0      # via jsonschema, -c requirements-dev.txt
+jedi==0.19.1              # via ipython
+jinja2==3.1.4             # via hyperspy, jupyter-server, jupyterlab, jupyterlab-server, nbconvert, -c requirements-dev.txt
+jmespath==1.0.1           # via nomad-lab, -c requirements-dev.txt
+joblib==1.4.2             # via mdanalysis, pymatgen, scikit-learn, -c requirements-dev.txt
+json5==0.9.25             # via jupyterlab-server
+jsonpointer==3.0.0        # via jsonschema, -c requirements-dev.txt
+jsonschema==4.17.3        # via jupyter-events, jupyterlab-server, nbformat, -c requirements-dev.txt
+jupyter==1.0.0            # via ifes-apt-tc-data-modeling
+jupyter-client==8.6.2     # via ipykernel, ipyparallel, jupyter-console, jupyter-server, nbclient, qtconsole
+jupyter-console==6.6.3    # via jupyter
+jupyter-core==5.7.2       # via ipykernel, jupyter-client, jupyter-console, jupyter-server, jupyterlab, nbclient, nbconvert, nbformat, qtconsole
+jupyter-events==0.5.0     # via jupyter-server
+jupyter-lsp==2.2.5        # via jupyterlab
+jupyter-server==2.5.0     # via jupyter-lsp, jupyterlab, jupyterlab-h5web, jupyterlab-server, notebook, notebook-shim
+jupyter-server-terminals==0.5.3  # via jupyter-server
+jupyterlab==4.1.6         # via ifes-apt-tc-data-modeling, notebook
+jupyterlab-h5web==11.1.0  # via ifes-apt-tc-data-modeling
+jupyterlab-pygments==0.3.0  # via nbconvert
+jupyterlab-server==2.24.0  # via jupyterlab, notebook
+jupyterlab-widgets==3.0.13  # via ipywidgets
+jwcrypto==1.5.6           # via python-keycloak, -c requirements-dev.txt
+kaleido==0.2.1            # via nomad-lab, -c requirements-dev.txt
+kikuchipy==0.9.0          # via pynxtools-em
+kiwisolver==1.4.5         # via matplotlib, -c requirements-dev.txt
+latexcodec==3.0.0         # via pybtex, -c requirements-dev.txt
+lazy-loader==0.4          # via scikit-image
+llvmlite==0.43.0          # via numba
+lmfit==1.3.2              # via pyxem
+locket==1.0.0             # via partd
+lxml==5.3.0               # via fabio, lxml-html-clean, nomad-lab, pynxtools, -c requirements-dev.txt
+lxml-html-clean==0.2.0    # via nomad-lab, perovskite-solar-cell-database, -c requirements-dev.txt
+markupsafe==2.1.5         # via jinja2, nbconvert, -c requirements-dev.txt
+matid==2.1.1              # via nomad-lab, nomad-simulations, -c requirements-dev.txt
+matplotlib==3.9.2         # via ase, diffsims, hyperspy, kikuchipy, matplotlib-scalebar, mdanalysis, orix, pyfai, pymatgen, pyxem, radioactivedecay, -c requirements-dev.txt
+matplotlib-inline==0.1.7  # via ipykernel, ipython
+matplotlib-scalebar==0.8.1  # via orix
+mda-xdrlib==0.2.0         # via mdanalysis, pyedr, -c requirements-dev.txt
+mdanalysis==2.7.0         # via nomad-lab, -c requirements-dev.txt
+mergedeep==1.3.4          # via pynxtools, -c requirements-dev.txt
+mistune==3.0.2            # via nbconvert, -c requirements-dev.txt
+mmtf-python==1.1.3        # via mdanalysis, -c requirements-dev.txt
+monty==2024.7.30          # via pymatgen, -c requirements-dev.txt
+mpmath==1.3.0             # via sympy, -c requirements-dev.txt
+mrcfile==1.5.3            # via griddataformats, -c requirements-dev.txt
+msgpack==1.0.8            # via blosc2, mmtf-python, -c requirements-dev.txt
+natsort==8.4.0            # via hyperspy
+nbclient==0.10.0          # via nbconvert
+nbconvert==7.16.4         # via jupyter, jupyter-server
+nbformat==5.10.4          # via jupyter-server, nbclient, nbconvert
+ndindex==1.8              # via blosc2
+nest-asyncio==1.6.0       # via ipykernel
+networkx==3.3             # via matid, nomad-lab, pymatgen, radioactivedecay, scikit-image, -c requirements-dev.txt
+niondata==15.6.3          # via nionswift, nionswift-io
+nionswift==16.11.0        # via pynxtools-em
+nionswift-io==15.2.1      # via nionswift
+nionui==7.1.1             # via nionswift
+nionutils==4.11.0         # via niondata, nionswift, nionswift-io, nionui
+nomad-aitoolkit @ git+https://github.com/FAIRmat-NFDI/nomad-aitoolkit.git@b203f8eb28dc4b6771a39d5c5b7ad3d9d8583ac8  # via -r default_plugins.txt
+nomad-normalizer-plugin-bandstructure @ git+https://github.com/nomad-coe/nomad-normalizer-plugin-bandstructure.git@6521a2bba848db8891a02576262eba8dcd4d9374  # via -r default_plugins.txt
+nomad-normalizer-plugin-dos @ git+https://github.com/nomad-coe/nomad-normalizer-plugin-dos.git@dad7e2b6e74bcedc73a4d86604e4beafd336c8b8  # via -r default_plugins.txt
+nomad-normalizer-plugin-simulation-workflow @ git+https://github.com/nomad-coe/nomad-normalizer-plugin-simulation-workflow.git@22af484c9ff6ff0d6c26be0bac9c66fa64200235  # via -r default_plugins.txt
+nomad-normalizer-plugin-soap @ git+https://github.com/nomad-coe/nomad-normalizer-plugin-soap.git@1b0e60e6bb7a75b9d7b53d6b077adf5aec7ec952  # via -r default_plugins.txt
+nomad-normalizer-plugin-spectra @ git+https://github.com/nomad-coe/nomad-normalizer-plugin-spectra.git@ec147326b3485ca9c324aca8a8dea520eb01e7dc  # via -r default_plugins.txt
+nomad-normalizer-plugin-system @ git+https://github.com/nomad-coe/nomad-normalizer-plugin-system.git@01523ddbc85676a40af40f4747f5f13676f34c0f  # via -r default_plugins.txt
+nomad-porous-materials @ git+https://github.com/FAIRmat-NFDI/nomad-porous-materials.git@522f4a3208077f534f1c5e886527ee2104283d0b  # via -r default_plugins.txt
+nomad-schema-plugin-run @ git+https://github.com/nomad-coe/nomad-schema-plugin-run.git@92d120dc4c5f7f4bcd94990ed009f8ac0019acec  # via nomad-schema-plugin-simulation-workflow, -r default_plugins.txt
+nomad-schema-plugin-simulation-workflow @ git+https://github.com/nomad-coe/nomad-schema-plugin-simulation-workflow.git@c9bd20c0447aaf22a6477cb39bdf03dea4c597f8  # via nomad-normalizer-plugin-simulation-workflow, -r default_plugins.txt
+nomad-simulations==0.0.1  # via -r default_plugins.txt
+notebook==7.1.3           # via jupyter
+notebook-shim==0.2.4      # via jupyterlab, notebook
+nptyping==1.4.4           # via nomad-lab, -c requirements-dev.txt
+numba==0.60.0             # via diffsims, hyperspy, kikuchipy, orix, pyxem, sparse
+numcodecs==0.13.0 ; platform_machine == 'AMD64' or platform_machine == 'x86_64'  # via zarr
+numexpr==2.10.1           # via blosc2, hyperspy, pyfai, pyxem, tables
+numpy==1.26.4             # via ase, blosc2, contourpy, dask, diffsims, fabio, fairmat-readers-xrd, findiff, griddataformats, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, igor2, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, mrcfile, niondata, nionswift, nionswift-io, nionui, nomad-lab, nptyping, numba, numcodecs, numexpr, numpy-quaternion, orix, pandas, pyedr, pyfai, pymatgen, pynxtools, pynxtools-xps, pyxem, radioactivedecay, rdkit, rosettasciio, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tables, tifffile, transforms3d, xarray, xraydb, zarr, -c requirements-dev.txt
+numpy-quaternion==2023.0.4  # via orix
+openpyxl==3.1.5           # via nomad-lab, perovskite-solar-cell-database, -c requirements-dev.txt
+orix==0.12.1.post0        # via diffsims, kikuchipy, pyxem
+orjson==3.10.7            # via h5grove, nomad-lab, -c requirements-dev.txt
+packaging==24.1           # via dask, deprecation, hyperspy, ipykernel, jupyter-server, jupyterlab, jupyterlab-server, lazy-loader, matplotlib, mdanalysis, nbconvert, pint, plotly, pooch, qtconsole, qtpy, scikit-image, silx, tables, xarray, xraydb, -c requirements-dev.txt
+palettable==3.3.3         # via pymatgen, -c requirements-dev.txt
+pandas==2.2.2             # via ifes-apt-tc-data-modeling, nomad-lab, panedr, pymatgen, pynxtools, radioactivedecay, xarray, -c requirements-dev.txt
+pandocfilters==1.5.1      # via nbconvert
+panedr==0.8.0             # via nomad-lab, -c requirements-dev.txt
+parmed==4.2.2             # via nomad-lab, -c requirements-dev.txt
+parso==0.8.4              # via jedi
+partd==1.4.2              # via dask
+perovskite-solar-cell-database @ git+https://github.com/FAIRmat-NFDI/nomad-perovskite-solar-cells-database.git@f394d21abafeb659729af0c94e5f90949fce01c1  # via -r default_plugins.txt
+pexpect==4.9.0 ; sys_platform != 'emscripten' and sys_platform != 'win32'  # via ipython
+pillow==10.4.0            # via fabio, imageio, matplotlib, nionswift, rdkit, scikit-image, -c requirements-dev.txt
+pint==0.17                # via fairmat-readers-xrd, hyperspy, nomad-lab, pynxtools-xps, pynxtools-xrd, rosettasciio, -c requirements-dev.txt
+platformdirs==4.2.2       # via jupyter-core, pooch, xraydb, -c requirements-dev.txt
+plotly==5.23.0            # via pymatgen, -c requirements-dev.txt
+pooch==1.8.2              # via kikuchipy, orix
+prettytable==3.11.0       # via hyperspy
+prometheus-client==0.20.0  # via jupyter-server, -c requirements-dev.txt
+prompt-toolkit==3.0.47    # via ipython, jupyter-console, -c requirements-dev.txt
+psutil==6.0.0             # via diffsims, ipykernel, ipyparallel, pyxem, -c requirements-dev.txt
+ptyprocess==0.7.0 ; os_name != 'nt' or (sys_platform != 'emscripten' and sys_platform != 'win32')  # via pexpect, terminado
+pure-eval==0.2.3          # via stack-data
+py-cpuinfo==9.0.0         # via blosc2, tables
+pyasn1==0.6.0             # via pyasn1-modules, rfc3161ng, -c requirements-dev.txt
+pyasn1-modules==0.4.0     # via rfc3161ng, -c requirements-dev.txt
+pybtex==0.24.0            # via pymatgen, -c requirements-dev.txt
+pycparser==2.22           # via cffi, -c requirements-dev.txt
+pydantic==1.10.17         # via nomad-lab, nomad-porous-materials, -c requirements-dev.txt
+pyedr==0.8.0              # via panedr, -c requirements-dev.txt
+pyfai==2024.5.0           # via pyxem
+pygments==2.18.0          # via ipython, jupyter-console, nbconvert, qtconsole, -c requirements-dev.txt
+pymatgen==2024.5.1        # via nomad-lab, nomad-porous-materials, -c requirements-dev.txt
+pynxtools==0.5.0          # via pynxtools-apm, pynxtools-ellips, pynxtools-em, pynxtools-mpes, pynxtools-raman, pynxtools-stm, pynxtools-xps, pynxtools-xrd, -r default_plugins.txt
+pynxtools-apm==0.2        # via pynxtools
+pynxtools-ellips==0.0.4   # via pynxtools
+pynxtools-em==0.2         # via pynxtools
+pynxtools-mpes==0.1.1     # via pynxtools
+pynxtools-raman==0.0.1    # via pynxtools
+pynxtools-stm==1.0.5      # via pynxtools
+pynxtools-xps==0.2.5      # via pynxtools
+pynxtools-xrd==0.0.2      # via pynxtools
+pyparsing==3.1.2          # via matplotlib, -c requirements-dev.txt
+pyrsistent==0.20.0        # via jsonschema, -c requirements-dev.txt
+python-box==7.2.0         # via rosettasciio
+python-dateutil==2.9.0.post0  # via arrow, elasticsearch-dsl, hyperspy, ipyparallel, jupyter-client, matplotlib, pandas, rfc3161ng, rosettasciio, -c requirements-dev.txt
+python-json-logger==2.0.2  # via jupyter-events, -c requirements-dev.txt
+python-keycloak==4.3.0    # via nomad-lab, -c requirements-dev.txt
+python-magic==0.4.24      # via nomad-lab, -c requirements-dev.txt
+pytz==2024.1              # via nionswift, nomad-lab, pandas, -c requirements-dev.txt
+pywin32==306 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32'  # via jupyter-core, -c requirements-dev.txt
+pywinpty==2.0.13 ; os_name == 'nt'  # via jupyter-server, jupyter-server-terminals, terminado
+pyxem==0.16.0             # via pynxtools-em
+pyyaml==6.0.2             # via dask, hyperspy, jupyter-events, kikuchipy, nomad-lab, pybtex, pynxtools, pynxtools-mpes, rosettasciio, -c requirements-dev.txt
+pyzeo==0.1.6              # via nomad-porous-materials
+pyzmq==26.2.0             # via ipykernel, ipyparallel, jupyter-client, jupyter-console, jupyter-server, qtconsole
+qtconsole==5.5.2          # via jupyter
+qtpy==2.4.1               # via qtconsole
+radioactivedecay==0.5.1   # via ifes-apt-tc-data-modeling
+rdkit==2023.9.5           # via perovskite-solar-cell-database, -c requirements-dev.txt
+requests==2.31.0          # via hyperspy, jupyterlab-server, nomad-lab, pooch, pymatgen, python-keycloak, requests-toolbelt, rfc3161ng, -c requirements-dev.txt
+requests-toolbelt==1.0.0  # via python-keycloak, -c requirements-dev.txt
+rfc3161ng==2.1.3          # via nomad-lab, -c requirements-dev.txt
+rfc3339-validator==0.1.4  # via jsonschema, -c requirements-dev.txt
+rfc3986-validator==0.1.1  # via jsonschema
+rosettasciio==0.6         # via pynxtools-em
+ruamel-yaml==0.18.6       # via pymatgen, -c requirements-dev.txt
+ruamel-yaml-clib==0.2.8 ; python_full_version < '3.13' and platform_python_implementation == 'CPython'  # via ruamel-yaml, -c requirements-dev.txt
+scikit-image==0.22.0      # via hyperspy, kikuchipy, pyxem
+scikit-learn==1.5.1       # via kikuchipy, matid, nomad-lab, pyxem, -c requirements-dev.txt
+scipy==1.14.1             # via ase, diffsims, findiff, griddataformats, hyperspy, kikuchipy, lmfit, matid, mdanalysis, niondata, nionswift, nomad-lab, orix, pyfai, pymatgen, pyxem, radioactivedecay, scikit-image, scikit-learn, sparse, xraydb, -c requirements-dev.txt
+send2trash==1.8.3         # via jupyter-server
+setuptools==73.0.1        # via pynxtools-xps, radioactivedecay
+silx==2.1.1               # via pyfai
+six==1.16.0               # via anytree, asttokens, bleach, elasticsearch-dsl, pybtex, python-dateutil, rfc3339-validator, -c requirements-dev.txt
+sniffio==1.3.1            # via anyio, httpx, -c requirements-dev.txt
+soupsieve==2.6            # via beautifulsoup4, -c requirements-dev.txt
+sparse==0.15.4            # via hyperspy
+spglib==2.5.0             # via matid, pymatgen, -c requirements-dev.txt
+sqlalchemy==2.0.32        # via xraydb, -c requirements-dev.txt
+stack-data==0.6.3         # via ipython
+sympy==1.13.2             # via findiff, hyperspy, pymatgen, radioactivedecay, -c requirements-dev.txt
+tables==3.10.1            # via ifes-apt-tc-data-modeling
+tabulate==0.8.9           # via pymatgen, -c requirements-dev.txt
+tenacity==9.0.0           # via plotly, -c requirements-dev.txt
+terminado==0.18.1         # via jupyter-server, jupyter-server-terminals
+threadpoolctl==3.5.0      # via mdanalysis, scikit-learn, -c requirements-dev.txt
+tifffile==2024.8.10       # via h5grove, hyperspy, scikit-image, -c requirements-dev.txt
+tinycss2==1.3.0           # via nbconvert
+toolz==0.12.1             # via dask, hyperspy, partd
+toposort==1.10            # via nomad-lab, -c requirements-dev.txt
+tornado==6.4.1            # via ipykernel, ipyparallel, jupyter-client, jupyter-server, jupyterlab, notebook, terminado, -c requirements-dev.txt
+tqdm==4.66.5              # via diffsims, hyperspy, ipyparallel, kikuchipy, mdanalysis, orix, pyedr, pymatgen, pyxem, -c requirements-dev.txt
+traitlets==5.14.3         # via comm, ipykernel, ipyparallel, ipython, ipywidgets, jupyter-client, jupyter-console, jupyter-core, jupyter-events, jupyter-server, jupyterlab, matplotlib-inline, nbclient, nbconvert, nbformat, qtconsole, -c requirements-dev.txt
+traits==6.4.3             # via hyperspy, pyxem
+transforms3d==0.4.2       # via diffsims, pyxem
+types-python-dateutil==2.9.0.20240821  # via arrow, -c requirements-dev.txt
+typing-extensions==4.12.2  # via ipython, jwcrypto, pydantic, sqlalchemy, tables, -c requirements-dev.txt
+typish==1.9.3             # via nptyping, -c requirements-dev.txt
+tzdata==2024.1            # via pandas, tzlocal, -c requirements-dev.txt
+tzlocal==5.2              # via nionswift, pynxtools-em
+uncertainties==3.2.2      # via lmfit, pymatgen, -c requirements-dev.txt
+unidecode==1.3.2          # via nomad-lab, -c requirements-dev.txt
+uri-template==1.3.0       # via jsonschema, -c requirements-dev.txt
+urllib3==1.26.19          # via elasticsearch, requests, -c requirements-dev.txt
+wcwidth==0.2.13           # via prettytable, prompt-toolkit, -c requirements-dev.txt
+webcolors==24.8.0         # via jsonschema, -c requirements-dev.txt
+webencodings==0.5.1       # via bleach, tinycss2, -c requirements-dev.txt
+websocket-client==1.8.0   # via jupyter-server
+widgetsnbextension==4.0.13  # via ipywidgets
+wrapt==1.16.0             # via nomad-lab, -c requirements-dev.txt
+xarray==2024.7.0          # via nomad-lab, pynxtools, pynxtools-mpes, pynxtools-xps, -c requirements-dev.txt
+xmltodict==0.13.0         # via fairmat-readers-xrd, ifes-apt-tc-data-modeling, pynxtools-em, pynxtools-xrd
+xraydb==4.5.4             # via pynxtools-em
+zarr==2.18.2 ; platform_machine == 'AMD64' or platform_machine == 'x86_64'  # via hyperspy
+zipp==3.20.0              # via importlib-metadata, -c requirements-dev.txt
+
+# The following packages were excluded from the output:
+# nomad-lab
diff --git a/requirements.txt b/requirements.txt
index c960f435ae96ca8d341c58e1558c66d6e225314e..42f08956dfd3a0efca41d7e6e5d809ddb354d636 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -91,7 +91,7 @@ lxml-html-clean==0.2.0    # via nomad-lab (pyproject.toml)
 m2r==0.2.1                # via nomad-lab (pyproject.toml)
 mako==1.3.5               # via alembic
 markupsafe==2.1.5         # via jinja2, mako, werkzeug
-matid==2.1.0              # via nomad-lab (pyproject.toml)
+matid==2.1.1              # via nomad-lab (pyproject.toml)
 matplotlib==3.9.2         # via ase, asr, mdanalysis, phonopy, pymatgen
 mda-xdrlib==0.2.0         # via mdanalysis, pyedr
 mdanalysis==2.7.0         # via nomad-lab (pyproject.toml)
@@ -162,7 +162,7 @@ ruamel-yaml==0.18.6       # via jupyter-telemetry, oauthenticator, pymatgen
 ruamel-yaml-clib==0.2.8 ; python_full_version < '3.13' and platform_python_implementation == 'CPython'  # via ruamel-yaml
 runstats==2.0.0           # via nomad-lab (pyproject.toml)
 scikit-learn==1.5.1       # via matid, nomad-lab (pyproject.toml)
-scipy==1.14.0             # via ase, griddataformats, matid, mdanalysis, pymatgen, scikit-learn, nomad-lab (pyproject.toml)
+scipy==1.14.1             # via ase, griddataformats, matid, mdanalysis, pymatgen, scikit-learn, nomad-lab (pyproject.toml)
 sentinels==1.0.0          # via mongomock
 six==1.16.0               # via basicauth, elasticsearch-dsl, html5lib, isodate, pybtex, python-dateutil, rdflib, rfc3339-validator, validators
 smmap==5.0.1              # via gitdb
@@ -190,7 +190,7 @@ toposort==1.10            # via nomad-lab (pyproject.toml)
 tornado==6.4.1            # via jupyterhub
 tqdm==4.66.5              # via mdanalysis, pyedr, pymatgen
 traitlets==5.14.3         # via jupyter-telemetry, jupyterhub
-types-python-dateutil==2.9.0.20240316  # via arrow
+types-python-dateutil==2.9.0.20240821  # via arrow
 typing-extensions==4.12.2  # via alembic, fastapi, jwcrypto, pydantic, sqlalchemy
 typish==1.9.3             # via nptyping
 tzdata==2024.1            # via celery, pandas
@@ -207,7 +207,7 @@ wcwidth==0.2.13           # via prompt-toolkit
 webcolors==24.8.0         # via jsonschema
 webencodings==0.5.1       # via html5lib
 websockets==13.0          # via uvicorn
-werkzeug==3.0.3           # via flask
+werkzeug==3.0.4           # via flask
 wrapt==1.16.0             # via nomad-lab (pyproject.toml)
 xarray==2024.7.0          # via nomad-lab (pyproject.toml)
 zipp==3.20.0              # via importlib-metadata
diff --git a/scripts/generate_python_dependencies.sh b/scripts/generate_python_dependencies.sh
index 2378fcfae6c6dc41d54cd36ae853020cddebbc9d..6d49c132f1aca4ad401c2c1bf2e7d69d37175d89 100755
--- a/scripts/generate_python_dependencies.sh
+++ b/scripts/generate_python_dependencies.sh
@@ -28,3 +28,9 @@ uv pip compile -U --universal -p 3.11 --annotation-style=line \
     requirements.txt \
     pyproject.toml
 
+uv pip compile --universal -p 3.11 --annotation-style=line \
+    --output-file=requirements-plugins.txt \
+    --unsafe-package nomad-lab \
+    -c requirements-dev.txt \
+    default_plugins.txt
+
diff --git a/scripts/setup_dev_env.sh b/scripts/setup_dev_env.sh
index 0fe7c9dcbca6a55ef27b74ee1dbf00d0c9d54680..49f63bf6db05894364503e399e21bb114f734bee 100755
--- a/scripts/setup_dev_env.sh
+++ b/scripts/setup_dev_env.sh
@@ -25,7 +25,7 @@ uv pip install -e ".[infrastructure,parsing,dev]" -c requirements-dev.txt
 
 # Install "default" plugins. TODO: This can be removed once we have proper
 # distributions projects.
-uv pip install -r default_plugins.txt -c requirements-dev.txt
+uv pip install -r requirements-plugins.txt # remove this after moving to distro
 
 # Build documentation
 sh scripts/generate_docs_artifacts.sh