diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 267a67c332a3d9fdce1a5340cd835ec49554eda1..d53cf660fdefa320b6119dfb662ac37451d847b7 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -375,7 +375,10 @@ build final image:
 
 install tests:
   stage: test
-  image: python:3.9
+  parallel:
+    matrix:
+      - PYTHON_VERSION: ["3.9", "3.10", "3.11"]
+  image: python:${PYTHON_VERSION}
   needs: ["build python package"]
   variables:
     UV_SYSTEM_PYTHON: true
diff --git a/Dockerfile b/Dockerfile
index 79f1d21ad59635308b317d621f45df38b63e55f2..a59347f2a3b294aec3fc197cc147648128511eaa 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -21,7 +21,7 @@
 # https://docs.docker.com/engine/reference/builder/
 
 FROM node:16.15 AS base_node
-FROM python:3.9-slim AS base_python
+FROM python:3.11-slim AS base_python
 # Keeps Python from buffering stdout and stderr to avoid situations where
 # the application crashes without emitting any logs due to buffering.
 ENV PYTHONUNBUFFERED 1
@@ -200,9 +200,9 @@ COPY default_plugins.txt .
 RUN uv pip install -r default_plugins.txt -c requirements.txt
 
 # Reduce the size of the packages
-RUN find /usr/local/lib/python3.9/ -type d -name 'tests' ! -path '*/networkx/*' -exec rm -r '{}' + \
- && find /usr/local/lib/python3.9/ -type d -name 'test' -exec rm -r '{}' + \
- && find /usr/local/lib/python3.9/site-packages/ -name '*.so' ! -path '*/h5py/*' ! -path '*/quippy*/*' -print -exec sh -c 'file "{}" | grep -q "not stripped" && strip -s "{}"' \;
+RUN find /usr/local/lib/python3.11/ -type d -name 'tests' ! -path '*/networkx/*' -exec rm -r '{}' + \
+ && find /usr/local/lib/python3.11/ -type d -name 'test' -exec rm -r '{}' + \
+ && find /usr/local/lib/python3.11/site-packages/ -name '*.so' ! -path '*/h5py/*' ! -path '*/quippy*/*' -print -exec sh -c 'file "{}" | grep -q "not stripped" && strip -s "{}"' \;
 
 
 # ================================================================================
@@ -221,7 +221,7 @@ COPY --chown=nomad:1000 scripts/run-worker.sh .
 COPY --chown=nomad:1000 nomad/jupyterhub_config.py ./nomad/jupyterhub_config.py
 
 COPY --chown=nomad:1000 --from=dev_package /app/examples/data/uploads /app/examples/data/uploads
-COPY --chown=nomad:1000 --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
+COPY --chown=nomad:1000 --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
 COPY --chown=nomad:1000 --from=builder /usr/local/share/jupyterhub /usr/local/share/jupyterhub
 COPY --chown=nomad:1000 --from=builder /usr/local/share/jupyter /usr/local/share/jupyter
 COPY --chown=nomad:1000 --from=builder /usr/local/bin/nomad /usr/local/bin/nomad
@@ -229,7 +229,7 @@ COPY --chown=nomad:1000 --from=builder /usr/local/bin/jupyter* /usr/local/bin/
 
 RUN mkdir -p /app/.volumes/fs \
  && chown -R nomad:1000 /app \
- && chown -R nomad:1000 /usr/local/lib/python3.9/site-packages/nomad
+ && chown -R nomad:1000 /usr/local/lib/python3.11/site-packages/nomad
 
 USER nomad
 
diff --git a/docs/howto/plugins/normalizers.md b/docs/howto/plugins/normalizers.md
index 890ea6a91902d9ae872e199e938ef92ecd121c12..43c897bafde06719a594e0fe0c34a74d5acd2a23 100644
--- a/docs/howto/plugins/normalizers.md
+++ b/docs/howto/plugins/normalizers.md
@@ -178,7 +178,7 @@ cd <normalizer-dir>
 Either remove the installed normalizer and `pip install` the cloned version:
 
 ```shell
-rm -rf <path-to-your-python-env>/lib/python3.9/site-packages/<normalizer-module-name>
+rm -rf <path-to-your-python-env>/lib/python3.11/site-packages/<normalizer-module-name>
 pip install -e .
 ```
 
@@ -189,4 +189,4 @@ PYTHONPATH=. nomad parse <path-to-example-file>
 ```
 
 Alternatively, you can also do a full [developer setup](../develop/setup.md) of the NOMAD infrastructure and
-enhance the normalizer there.
\ No newline at end of file
+enhance the normalizer there.
diff --git a/docs/howto/plugins/parsers.md b/docs/howto/plugins/parsers.md
index 67a9d5c738291751e10dd05cd21ac9afbe0a866b..7bb3196230d685d3643d970e246a02b9344402b9 100644
--- a/docs/howto/plugins/parsers.md
+++ b/docs/howto/plugins/parsers.md
@@ -424,7 +424,7 @@ cd <parser-dir>
 Either remove the installed parser and `pip install` the cloned version:
 
 ```shell
-rm -rf <path-to-your-python-env>/lib/python3.9/site-packages/<parser-module-name>
+rm -rf <path-to-your-python-env>/lib/python3.11/site-packages/<parser-module-name>
 pip install -e .
 ```
 
diff --git a/docs/tutorial/develop_plugin.md b/docs/tutorial/develop_plugin.md
index 0026471de6bb32fdba6e02baf870157a701dff22..f60077d022d4e8ab55381d6edc2b571d8880d7bb 100644
--- a/docs/tutorial/develop_plugin.md
+++ b/docs/tutorial/develop_plugin.md
@@ -172,7 +172,7 @@ and the "Allow GitHub Actions to create and approve pull requests" options and c
 Before we can start developing we recommend to create a virtual environment using Python 3.9
 
 ```sh
-python3.9 -m venv .pyenv
+python3.11 -m venv .pyenv
 source .pyenv/bin/activate
 ```
 
diff --git a/nomad/app/v1/routers/systems.py b/nomad/app/v1/routers/systems.py
index ce0cf3957eba6a443848f9830ff4158b2f6b00db..36748041d27430c43d74e9282662dcbcd449a1be 100644
--- a/nomad/app/v1/routers/systems.py
+++ b/nomad/app/v1/routers/systems.py
@@ -17,6 +17,7 @@
 #
 from typing import Dict, List, Union
 from io import StringIO, BytesIO
+import sys
 from collections import OrderedDict
 from enum import Enum
 
@@ -210,9 +211,15 @@ for format in format_map.values():
     )
 format_features = '\n'.join(format_features_list)
 
+if sys.version_info < (3, 11):
 
-class TempFormatEnum(str, Enum):
-    pass
+    class TempFormatEnum(str, Enum):
+        pass
+else:
+    from enum import StrEnum
+
+    class TempFormatEnum(StrEnum):
+        pass
 
 
 FormatEnum = TempFormatEnum(
@@ -239,8 +246,15 @@ wrap_mode_map: Dict[str, dict] = OrderedDict(
 )
 
 
-class TempWrapModeEnum(str, Enum):
-    pass
+if sys.version_info < (3, 11):
+
+    class TempWrapModeEnum(str, Enum):
+        pass
+else:
+    from enum import StrEnum
+
+    class TempWrapModeEnum(StrEnum):
+        pass
 
 
 WrapModeEnum = TempWrapModeEnum(
@@ -334,7 +348,7 @@ Here is a brief rundown of the different features each format supports:
 {format_features}""",
     ),
     wrap_mode: WrapModeEnum = Query(  # type: ignore
-        default=WrapModeEnum.original,
+        default=WrapModeEnum.original,  # type: ignore
         description=f"""Determines how to handle atomic positions for the requested system. The available options are:
 
 {wrap_mode_description}
@@ -437,13 +451,13 @@ Here is a brief rundown of the different features each format supports:
             pass
 
         # Handle wrap mode
-        if wrap_mode == WrapModeEnum.wrap:
+        if wrap_mode == WrapModeEnum.wrap:  # type: ignore
             atoms.positions = wrap_positions(
                 atoms.positions.magnitude,
                 atoms.lattice_vectors.magnitude,
                 atoms.periodic,
             )
-        elif wrap_mode == WrapModeEnum.unwrap:
+        elif wrap_mode == WrapModeEnum.unwrap:  # type: ignore
             atoms.positions = unwrap_positions(
                 atoms.positions.magnitude,
                 atoms.lattice_vectors.magnitude,
diff --git a/requirements-dev.txt b/requirements-dev.txt
index d1fda4dd9940238632919ab11c4577ebc7890781..87ea1aa64ee33c75f125d7d183d13e6f7ffb0f68 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,5 +1,5 @@
 # This file was autogenerated by uv via the following command:
-#    uv pip compile -p 3.9 --annotation-style=line --extra=dev --extra=infrastructure --extra=parsing --output-file=requirements-dev.txt requirements.txt pyproject.toml
+#    uv pip compile --universal --annotation-style=line --extra=dev --extra=infrastructure --extra=parsing --output-file=requirements-dev.txt requirements.txt pyproject.toml
 aiosmtpd==1.4.6           # via nomad-lab (pyproject.toml)
 alabaster==0.7.16         # via sphinx, -r requirements.txt
 alembic==1.13.2           # via jupyterhub, -r requirements.txt
@@ -10,14 +10,14 @@ arrow==1.3.0              # via isoduration, -r requirements.txt
 ase==3.22.1               # via asr, matid, quippy-ase, -r requirements.txt, nomad-lab (pyproject.toml)
 asgiref==3.8.1            # via -r requirements.txt, nomad-lab (pyproject.toml)
 asr==0.4.1                # via -r requirements.txt, nomad-lab (pyproject.toml)
-astroid==3.2.2            # via nomad-lab (pyproject.toml)
+astroid==3.2.4            # via nomad-lab (pyproject.toml)
 asttokens==2.4.1          # via devtools
 async-generator==1.10     # via jupyterhub, -r requirements.txt
 async-property==0.2.2     # via python-keycloak, -r requirements.txt
-atpublic==4.1.0           # via aiosmtpd
+atpublic==5.0             # via aiosmtpd
 attrs==23.2.0             # via aiosmtpd, jsonschema, -r requirements.txt
 babel==2.15.0             # via mkdocs-git-revision-date-localized-plugin, mkdocs-material, sphinx, -r requirements.txt
-backports-tarfile==1.2.0  # via jaraco-context
+backports-tarfile==1.2.0 ; python_version < '3.12'  # via jaraco-context
 bagit==1.8.1              # via -r requirements.txt, nomad-lab (pyproject.toml)
 basicauth==0.4.1          # via -r requirements.txt, nomad-lab (pyproject.toml)
 beautifulsoup4==4.12.3    # via -r requirements.txt, nomad-lab (pyproject.toml)
@@ -26,22 +26,22 @@ biopython==1.84           # via mdanalysis, -r requirements.txt
 bitarray==2.9.2           # via -r requirements.txt, nomad-lab (pyproject.toml)
 blinker==1.8.2            # via flask, -r requirements.txt
 build==1.2.1              # via nomad-lab (pyproject.toml)
-cachetools==5.3.3         # via -r requirements.txt, nomad-lab (pyproject.toml)
+cachetools==5.4.0         # via -r requirements.txt, nomad-lab (pyproject.toml)
 celery==5.4.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
 certifi==2024.7.4         # via elasticsearch, httpcore, httpx, netcdf4, requests, -r requirements.txt
 certipy==0.1.3            # via jupyterhub, -r requirements.txt
-cffi==1.16.0              # via cryptography, -r requirements.txt
+cffi==1.16.0 ; platform_python_implementation != 'PyPy'  # via cryptography, -r requirements.txt
 cftime==1.6.4             # via netcdf4, -r requirements.txt
 charset-normalizer==3.3.2  # via requests, -r requirements.txt
 click==8.1.7              # via asr, celery, click-didyoumean, click-plugins, click-repl, flask, mkdocs, mkdocs-click, uvicorn, -r requirements.txt, nomad-lab (pyproject.toml)
 click-didyoumean==0.3.1   # via celery, -r requirements.txt
 click-plugins==1.1.1      # via celery, -r requirements.txt
 click-repl==0.3.0         # via celery, -r requirements.txt
-colorama==0.4.6           # via mkdocs-material, twine
+colorama==0.4.6           # via build, click, mkdocs, mkdocs-material, pytest, sphinx, tqdm, twine, uvicorn, -r requirements.txt
 commonmark==0.9.1         # via recommonmark, -r requirements.txt
 contourpy==1.2.1          # via matplotlib, -r requirements.txt
-coverage==7.5.4           # via pytest-cov
-cryptography==42.0.8      # via jwcrypto, pyjwt, pyopenssl, rfc3161ng, -r requirements.txt
+coverage==7.6.0           # via pytest-cov
+cryptography==43.0.0      # via jwcrypto, pyjwt, pyopenssl, rfc3161ng, secretstorage, -r requirements.txt
 cycler==0.12.1            # via matplotlib, -r requirements.txt
 decorator==5.1.1          # via validators, -r requirements.txt
 deprecation==2.1.0        # via python-keycloak, -r requirements.txt
@@ -57,7 +57,7 @@ email-validator==1.3.1    # via optimade, -r requirements.txt
 escapism==1.0.1           # via dockerspawner, -r requirements.txt
 essential-generators==1.0  # via nomad-lab (pyproject.toml)
 et-xmlfile==1.1.0         # via openpyxl, -r requirements.txt
-exceptiongroup==1.2.1     # via anyio, pytest, -r requirements.txt
+exceptiongroup==1.2.2 ; python_version < '3.11'  # via anyio, pytest, -r requirements.txt
 execnet==2.1.1            # via pytest-xdist
 executing==2.0.1          # via devtools
 f90wrap==0.2.15           # via quippy-ase, -r requirements.txt
@@ -65,12 +65,12 @@ fastapi==0.99.1           # via h5grove, -r requirements.txt, nomad-lab (pyproje
 fasteners==0.19           # via mdanalysis, -r requirements.txt
 filelock==3.3.1           # via -r requirements.txt, nomad-lab (pyproject.toml)
 flask==3.0.3              # via asr, -r requirements.txt
-fonttools==4.53.0         # via matplotlib, -r requirements.txt
+fonttools==4.53.1         # via matplotlib, -r requirements.txt
 fqdn==1.5.1               # via jsonschema, -r requirements.txt
 ghp-import==2.1.0         # via mkdocs
 gitdb==4.0.11             # via gitpython, -r requirements.txt
 gitpython==3.1.43         # via mkdocs-git-revision-date-localized-plugin, -r requirements.txt, nomad-lab (pyproject.toml)
-greenlet==3.0.3           # via sqlalchemy, -r requirements.txt
+greenlet==3.0.3 ; python_version < '3.13' and (platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64')  # via sqlalchemy, -r requirements.txt
 griddataformats==1.0.2    # via mdanalysis, -r requirements.txt
 gsd==3.3.0                # via mdanalysis, -r requirements.txt
 gunicorn==21.2.0          # via -r requirements.txt, nomad-lab (pyproject.toml)
@@ -85,7 +85,7 @@ httpx==0.27.0             # via python-keycloak, -r requirements.txt, nomad-lab
 idna==3.7                 # via anyio, email-validator, httpx, jsonschema, requests, -r requirements.txt
 imagesize==1.4.1          # via sphinx, -r requirements.txt
 importlib-metadata==7.1.0  # via build, flask, jupyterhub, keyring, markdown, mkdocs, mkdocs-get-deps, sphinx, twine, -r requirements.txt, nomad-lab (pyproject.toml)
-importlib-resources==6.4.0  # via matplotlib, spglib, -r requirements.txt
+importlib-resources==6.4.0 ; python_version < '3.10'  # via matplotlib, spglib, -r requirements.txt
 inflection==0.5.1         # via -r requirements.txt, nomad-lab (pyproject.toml)
 iniconfig==2.0.0          # via pytest
 isodate==0.6.1            # via rdflib, -r requirements.txt
@@ -94,6 +94,7 @@ itsdangerous==2.2.0       # via flask, -r requirements.txt, nomad-lab (pyproject
 jaraco-classes==3.4.0     # via keyring
 jaraco-context==5.3.0     # via keyring
 jaraco-functools==4.0.1   # via keyring
+jeepney==0.8.0 ; sys_platform == 'linux'  # via keyring, secretstorage
 jinja2==3.1.4             # via flask, jupyterhub, mkdocs, mkdocs-macros-plugin, mkdocs-material, sphinx, -r requirements.txt
 jmespath==1.0.1           # via -r requirements.txt, nomad-lab (pyproject.toml)
 joblib==1.4.2             # via mdanalysis, pymatgen, scikit-learn, -r requirements.txt
@@ -114,7 +115,7 @@ mako==1.3.5               # via alembic, -r requirements.txt
 markdown==3.6             # 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.0.1              # via -r requirements.txt, nomad-lab (pyproject.toml)
-matplotlib==3.9.0         # via ase, asr, mdanalysis, phonopy, pymatgen, -r requirements.txt
+matplotlib==3.9.1         # via ase, asr, mdanalysis, phonopy, pymatgen, -r requirements.txt
 mda-xdrlib==0.2.0         # via pyedr, -r requirements.txt
 mdanalysis==2.5.0         # via -r requirements.txt, nomad-lab (pyproject.toml)
 mergedeep==1.3.4          # via mkdocs, mkdocs-get-deps
@@ -125,23 +126,23 @@ mkdocs-get-deps==0.2.0    # via mkdocs
 mkdocs-git-revision-date-localized-plugin==1.2.6  # via nomad-lab (pyproject.toml)
 mkdocs-glightbox==0.4.0   # via nomad-lab (pyproject.toml)
 mkdocs-macros-plugin==1.0.5  # via nomad-lab (pyproject.toml)
-mkdocs-material==9.5.28   # via nomad-lab (pyproject.toml)
+mkdocs-material==9.5.30   # via nomad-lab (pyproject.toml)
 mkdocs-material-extensions==1.3.1  # via mkdocs-material, nomad-lab (pyproject.toml)
 mkdocs-redirects==1.2.1   # via nomad-lab (pyproject.toml)
 mmtf-python==1.1.3        # via mdanalysis, -r requirements.txt
 mongoengine==0.28.2       # via -r requirements.txt, nomad-lab (pyproject.toml)
 mongomock==4.1.2          # via optimade, -r requirements.txt
-monty==2024.5.24          # via pymatgen, -r requirements.txt
+monty==2024.7.12          # via pymatgen, -r requirements.txt
 more-itertools==10.3.0    # via jaraco-classes, jaraco-functools
 mpmath==1.3.0             # via sympy, -r requirements.txt
-mrcfile==1.5.0            # via griddataformats, -r requirements.txt
+mrcfile==1.5.3            # via griddataformats, -r requirements.txt
 msgpack==1.0.8            # via mmtf-python, -r requirements.txt, nomad-lab (pyproject.toml)
 mypy==1.0.1               # via nomad-lab (pyproject.toml)
 mypy-extensions==1.0.0    # via mypy
 names==0.3.0              # via nomad-lab (pyproject.toml)
 netcdf4==1.6.5            # via -r requirements.txt, nomad-lab (pyproject.toml)
 networkx==2.6.3           # via matid, mdanalysis, pymatgen, -r requirements.txt, nomad-lab (pyproject.toml)
-nh3==0.2.17               # via readme-renderer
+nh3==0.2.18               # via readme-renderer
 nomad-openbis==1.0.0      # via -r requirements.txt, nomad-lab (pyproject.toml)
 nptyping==1.4.4           # via -r requirements.txt, nomad-lab (pyproject.toml)
 numpy==1.26.4             # via ase, biopython, cftime, contourpy, f90wrap, griddataformats, gsd, h5grove, h5py, matid, matplotlib, mdanalysis, mrcfile, netcdf4, nptyping, pandas, phonopy, pyedr, pymatgen, quippy-ase, rdkit, scikit-learn, scipy, spglib, tifffile, xarray, -r requirements.txt, nomad-lab (pyproject.toml)
@@ -153,38 +154,40 @@ orjson==3.10.6            # via h5grove, -r requirements.txt, nomad-lab (pyproje
 packaging==24.1           # via build, deprecation, f90wrap, gunicorn, jupyterhub, matplotlib, mdanalysis, mkdocs, mongomock, pint, plotly, pytest, sphinx, xarray, -r requirements.txt
 paginate==0.5.6           # via mkdocs-material
 palettable==3.3.3         # via pymatgen, -r requirements.txt
-pamela==1.1.0             # via jupyterhub, -r requirements.txt
+pamela==1.1.0 ; sys_platform != 'win32'  # via jupyterhub, -r requirements.txt
 pandas==1.5.3             # via nomad-openbis, panedr, pymatgen, xarray, -r requirements.txt, nomad-lab (pyproject.toml)
 panedr==0.8.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
 parmed==4.2.2             # via -r requirements.txt, nomad-lab (pyproject.toml)
 pathspec==0.12.1          # via mkdocs
-phonopy==2.25.0           # via asr, -r requirements.txt
+phonopy==2.26.6           # via asr, -r requirements.txt
 pillow==10.4.0            # via matplotlib, rdkit, -r requirements.txt
 pint==0.17                # via -r requirements.txt, nomad-lab (pyproject.toml)
 pkginfo==1.11.1           # via twine
 platformdirs==4.2.2       # via mkdocs-get-deps
-plotly==5.22.0            # via asr, pymatgen, -r requirements.txt
+plotly==5.23.0            # via asr, pymatgen, -r requirements.txt
 pluggy==1.5.0             # via pytest
 prometheus-client==0.20.0  # via jupyterhub, -r requirements.txt
 prompt-toolkit==3.0.47    # via click-repl, -r requirements.txt
+psutil==6.0.0 ; sys_platform == 'win32'  # via jupyterhub, -r requirements.txt
 pyasn1==0.6.0             # via pyasn1-modules, rfc3161ng, -r requirements.txt
 pyasn1-modules==0.4.0     # via rfc3161ng, -r requirements.txt
 pybtex==0.24.0            # via pymatgen, -r requirements.txt
 pycodestyle==2.12.0       # via nomad-lab (pyproject.toml)
-pycparser==2.22           # via cffi, -r requirements.txt
+pycparser==2.22 ; platform_python_implementation != 'PyPy'  # via cffi, -r requirements.txt
 pydantic==1.10.17         # via fastapi, optimade, -r requirements.txt, nomad-lab (pyproject.toml)
 pyedr==0.8.0              # via panedr, -r requirements.txt
 pygments==2.18.0          # via devtools, mkdocs-material, readme-renderer, sphinx, -r requirements.txt
 pyjwt==2.6.0              # via -r requirements.txt, nomad-lab (pyproject.toml)
+pylibmagic==0.5.0 ; sys_platform == 'darwin'  # via -r requirements.txt, nomad-lab (pyproject.toml)
 pymatgen==2024.5.1        # via asr, -r requirements.txt, nomad-lab (pyproject.toml)
 pymdown-extensions==10.8.1  # via mkdocs-material
 pymongo==4.6.3            # via mongoengine, optimade, -r requirements.txt, nomad-lab (pyproject.toml)
-pyopenssl==24.1.0         # via certipy, -r requirements.txt
+pyopenssl==24.2.1         # via certipy, -r requirements.txt
 pyparsing==3.1.2          # via matplotlib, rdflib, -r requirements.txt
 pyproject-hooks==1.1.0    # via build
 pyrsistent==0.20.0        # via jsonschema, -r requirements.txt
 pytest==7.4.4             # via pytest-asyncio, pytest-cov, pytest-split, pytest-timeout, pytest-xdist, nomad-lab (pyproject.toml)
-pytest-asyncio==0.23.7    # via nomad-lab (pyproject.toml)
+pytest-asyncio==0.23.8    # via nomad-lab (pyproject.toml)
 pytest-cov==5.0.0         # via nomad-lab (pyproject.toml)
 pytest-split==0.9.0       # via nomad-lab (pyproject.toml)
 pytest-timeout==2.3.1     # via nomad-lab (pyproject.toml)
@@ -193,19 +196,22 @@ python-dateutil==2.9.0.post0  # via arrow, celery, elasticsearch-dsl, ghp-import
 python-dotenv==1.0.1      # via uvicorn, -r requirements.txt
 python-gitlab==2.10.1     # via nomad-lab (pyproject.toml)
 python-json-logger==2.0.2  # via jupyter-telemetry, -r requirements.txt, nomad-lab (pyproject.toml)
-python-keycloak==4.2.0    # via -r requirements.txt, nomad-lab (pyproject.toml)
+python-keycloak==4.2.3    # via -r requirements.txt, nomad-lab (pyproject.toml)
 python-logstash==0.4.6    # via -r requirements.txt, nomad-lab (pyproject.toml)
 python-magic==0.4.24      # via -r requirements.txt, nomad-lab (pyproject.toml)
+python-magic-bin==0.4.14 ; sys_platform == 'win32'  # via -r requirements.txt, nomad-lab (pyproject.toml)
 python-multipart==0.0.9   # via -r requirements.txt, nomad-lab (pyproject.toml)
 pytz==2024.1              # via mkdocs-git-revision-date-localized-plugin, pandas, -r requirements.txt, nomad-lab (pyproject.toml)
+pywin32==306 ; sys_platform == 'win32'  # via docker, -r requirements.txt
+pywin32-ctypes==0.2.2 ; sys_platform == 'win32'  # via keyring
 pyyaml==6.0.1             # via mkdocs, mkdocs-get-deps, mkdocs-macros-plugin, phonopy, pybtex, pymdown-extensions, pyyaml-env-tag, uvicorn, -r requirements.txt, nomad-lab (pyproject.toml)
 pyyaml-env-tag==0.1       # via mkdocs
 quippy-ase==0.9.14        # via -r requirements.txt, nomad-lab (pyproject.toml)
 rdflib==5.0.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
 rdkit==2023.9.5           # via -r requirements.txt, nomad-lab (pyproject.toml)
-readme-renderer==43.0     # via twine
+readme-renderer==44.0     # via twine
 recommonmark==0.7.1       # via -r requirements.txt, nomad-lab (pyproject.toml)
-regex==2024.5.15          # via mkdocs-material
+regex==2024.7.24          # via mkdocs-material
 requests==2.31.0          # via docker, jupyterhub, mkdocs-material, nomad-openbis, oauthenticator, optimade, pymatgen, python-gitlab, python-keycloak, requests-toolbelt, rfc3161ng, sphinx, twine, -r requirements.txt, nomad-lab (pyproject.toml)
 requests-toolbelt==1.0.0  # via python-gitlab, python-keycloak, twine, -r requirements.txt
 rfc3161ng==2.1.3          # via -r requirements.txt, nomad-lab (pyproject.toml)
@@ -214,36 +220,37 @@ rfc3986==2.0.0            # via twine
 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   # via ruamel-yaml, -r requirements.txt
-ruff==0.5.4               # via nomad-lab (pyproject.toml)
+ruamel-yaml-clib==0.2.8 ; python_version < '3.13' and platform_python_implementation == 'CPython'  # via ruamel-yaml, -r requirements.txt
+ruff==0.5.5               # 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.13.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
 smmap==5.0.1              # via gitdb, -r requirements.txt
 sniffio==1.3.1            # via anyio, httpx, -r requirements.txt
 snowballstemmer==2.2.0    # via sphinx, -r requirements.txt
 soupsieve==2.5            # via beautifulsoup4, -r requirements.txt
-spglib==2.4.0             # via asr, matid, phonopy, pymatgen, -r requirements.txt
-sphinx==7.3.7             # via recommonmark, -r requirements.txt
+spglib==2.5.0             # via asr, matid, phonopy, pymatgen, -r requirements.txt
+sphinx==7.4.7             # via recommonmark, -r requirements.txt
 sphinxcontrib-applehelp==1.0.8  # via sphinx, -r requirements.txt
 sphinxcontrib-devhelp==1.0.6  # via sphinx, -r requirements.txt
-sphinxcontrib-htmlhelp==2.0.5  # via sphinx, -r requirements.txt
+sphinxcontrib-htmlhelp==2.0.6  # via sphinx, -r requirements.txt
 sphinxcontrib-jsmath==1.0.1  # via sphinx, -r requirements.txt
-sphinxcontrib-qthelp==1.0.7  # via sphinx, -r requirements.txt
+sphinxcontrib-qthelp==1.0.8  # via sphinx, -r requirements.txt
 sphinxcontrib-serializinghtml==1.1.10  # via sphinx, -r requirements.txt
 sqlalchemy==2.0.31        # via alembic, jupyterhub, -r requirements.txt
 starlette==0.27.0         # via fastapi, -r requirements.txt
-structlog==24.2.0         # via -r requirements.txt, nomad-lab (pyproject.toml)
-sympy==1.12.1             # via pymatgen, -r requirements.txt
+structlog==24.4.0         # via -r requirements.txt, nomad-lab (pyproject.toml)
+sympy==1.13.1             # via pymatgen, -r requirements.txt
 tabulate==0.8.9           # via nomad-openbis, pymatgen, -r requirements.txt, nomad-lab (pyproject.toml)
-tenacity==8.4.2           # via plotly, -r requirements.txt
+tenacity==8.5.0           # via plotly, -r requirements.txt
 termcolor==2.4.0          # via mkdocs-macros-plugin
 texttable==1.7.0          # via nomad-openbis, -r requirements.txt
 threadpoolctl==3.5.0      # via mdanalysis, scikit-learn, -r requirements.txt
-tifffile==2024.7.2        # via h5grove, -r requirements.txt
-tomli==2.0.1              # via build, coverage, mypy, pytest, sphinx, -r requirements.txt
+tifffile==2024.7.24       # via h5grove, -r requirements.txt
+tomli==2.0.1 ; python_full_version <= '3.11.0a6' or python_version < '3.11'  # via build, coverage, mypy, pytest, sphinx, -r requirements.txt
 toposort==1.10            # via -r requirements.txt, nomad-lab (pyproject.toml)
 tornado==6.4.1            # via jupyterhub, -r requirements.txt
 tqdm==4.66.4              # via mdanalysis, pyedr, pymatgen, twine, -r requirements.txt
@@ -251,16 +258,16 @@ traitlets==5.14.3         # via jupyter-telemetry, jupyterhub, -r requirements.t
 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
-typing-extensions==4.12.2  # via alembic, anyio, asgiref, astroid, fastapi, jwcrypto, kombu, mypy, pydantic, sqlalchemy, starlette, uvicorn, -r requirements.txt
+typing-extensions==4.12.2  # via alembic, anyio, asgiref, astroid, fastapi, jwcrypto, kombu, mypy, pydantic, spglib, sqlalchemy, starlette, uvicorn, -r requirements.txt
 typish==1.9.3             # via nptyping, -r requirements.txt
 tzdata==2024.1            # via celery, -r requirements.txt
-uncertainties==3.2.1      # via pymatgen, -r requirements.txt
+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.2.21                # via nomad-lab (pyproject.toml)
-uvicorn==0.30.1           # via h5grove, -r requirements.txt, nomad-lab (pyproject.toml)
-uvloop==0.19.0            # via uvicorn, -r requirements.txt
+uv==0.2.29                # via nomad-lab (pyproject.toml)
+uvicorn==0.30.3           # via h5grove, -r requirements.txt, nomad-lab (pyproject.toml)
+uvloop==0.19.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)
 vine==5.1.0               # via amqp, celery, kombu, -r requirements.txt
 watchdog==4.0.1           # via mkdocs
diff --git a/requirements.txt b/requirements.txt
index 08656b154fc81be075d2b775d5f8eb479a7284db..2d9edb09161772a8c15e430796751d9067765a2d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
 # This file was autogenerated by uv via the following command:
-#    uv pip compile -p 3.9 --annotation-style=line --extra=infrastructure --extra=parsing --output-file=requirements.txt dependencies/nomad-dos-fingerprints/pyproject.toml dependencies/parsers/eelsdb/pyproject.toml pyproject.toml
+#    uv pip compile --universal --annotation-style=line --extra=infrastructure --extra=parsing --output-file=requirements.txt dependencies/nomad-dos-fingerprints/pyproject.toml dependencies/parsers/eelsdb/pyproject.toml pyproject.toml
 alabaster==0.7.16         # via sphinx
 alembic==1.13.2           # via jupyterhub
 amqp==5.2.0               # via kombu
@@ -20,20 +20,21 @@ billiard==4.2.0           # via celery
 biopython==1.84           # via mdanalysis
 bitarray==2.9.2           # via nomad-dos-fingerprints (dependencies/nomad-dos-fingerprints/pyproject.toml), nomad-lab (pyproject.toml)
 blinker==1.8.2            # via flask
-cachetools==5.3.3         # via nomad-lab (pyproject.toml)
+cachetools==5.4.0         # via nomad-lab (pyproject.toml)
 celery==5.4.0             # via nomad-lab (pyproject.toml)
 certifi==2024.7.4         # via elasticsearch, httpcore, httpx, netcdf4, requests
 certipy==0.1.3            # via jupyterhub
-cffi==1.16.0              # via cryptography
+cffi==1.16.0 ; platform_python_implementation != 'PyPy'  # via cryptography
 cftime==1.6.4             # via netcdf4
 charset-normalizer==3.3.2  # via requests
 click==8.1.7              # via asr, celery, click-didyoumean, click-plugins, click-repl, flask, uvicorn, nomad-lab (pyproject.toml)
 click-didyoumean==0.3.1   # via celery
 click-plugins==1.1.1      # via celery
 click-repl==0.3.0         # via celery
+colorama==0.4.6 ; platform_system == 'Windows' or sys_platform == 'win32'  # via click, sphinx, tqdm, uvicorn
 commonmark==0.9.1         # via recommonmark
 contourpy==1.2.1          # via matplotlib
-cryptography==42.0.8      # via jwcrypto, pyjwt, pyopenssl, rfc3161ng
+cryptography==43.0.0      # via jwcrypto, pyjwt, pyopenssl, rfc3161ng
 cycler==0.12.1            # via matplotlib
 decorator==5.1.1          # via validators
 deprecation==2.1.0        # via python-keycloak
@@ -47,17 +48,17 @@ elasticsearch-dsl==7.4.0  # via nomad-lab (pyproject.toml)
 email-validator==1.3.1    # via optimade
 escapism==1.0.1           # via dockerspawner
 et-xmlfile==1.1.0         # via openpyxl
-exceptiongroup==1.2.1     # via anyio
+exceptiongroup==1.2.2 ; python_version < '3.11'  # via anyio
 f90wrap==0.2.15           # via quippy-ase
 fastapi==0.99.1           # via h5grove, nomad-lab (pyproject.toml)
 fasteners==0.19           # via mdanalysis
 filelock==3.3.1           # via nomad-lab (pyproject.toml)
 flask==3.0.3              # via asr
-fonttools==4.53.0         # via matplotlib
+fonttools==4.53.1         # via matplotlib
 fqdn==1.5.1               # via jsonschema
 gitdb==4.0.11             # via gitpython
 gitpython==3.1.43         # via nomad-lab (pyproject.toml)
-greenlet==3.0.3           # via sqlalchemy
+greenlet==3.0.3 ; python_version < '3.13' and (platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64')  # via sqlalchemy
 griddataformats==1.0.2    # via mdanalysis
 gsd==3.3.0                # via mdanalysis
 gunicorn==21.2.0          # via nomad-lab (pyproject.toml)
@@ -72,7 +73,7 @@ httpx==0.27.0             # via python-keycloak, nomad-lab (pyproject.toml)
 idna==3.7                 # via anyio, email-validator, httpx, jsonschema, requests
 imagesize==1.4.1          # via sphinx
 importlib-metadata==7.1.0  # via flask, jupyterhub, sphinx, nomad-lab (pyproject.toml)
-importlib-resources==6.4.0  # via matplotlib, spglib
+importlib-resources==6.4.0 ; python_version < '3.10'  # via matplotlib, spglib
 inflection==0.5.1         # via nomad-lab (pyproject.toml)
 isodate==0.6.1            # via rdflib
 isoduration==20.11.0      # via jsonschema
@@ -95,16 +96,16 @@ 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.0.1              # via nomad-lab (pyproject.toml)
-matplotlib==3.9.0         # via ase, asr, mdanalysis, phonopy, pymatgen
+matplotlib==3.9.1         # via ase, asr, mdanalysis, phonopy, pymatgen
 mda-xdrlib==0.2.0         # via pyedr
 mdanalysis==2.5.0         # via nomad-lab (pyproject.toml)
 mistune==3.0.2            # via m2r
 mmtf-python==1.1.3        # via mdanalysis
 mongoengine==0.28.2       # via nomad-lab (pyproject.toml)
 mongomock==4.1.2          # via optimade
-monty==2024.5.24          # via pymatgen
+monty==2024.7.12          # via pymatgen
 mpmath==1.3.0             # via sympy
-mrcfile==1.5.0            # via griddataformats
+mrcfile==1.5.3            # via griddataformats
 msgpack==1.0.8            # via mmtf-python, nomad-lab (pyproject.toml)
 netcdf4==1.6.5            # via nomad-lab (pyproject.toml)
 networkx==2.6.3           # via matid, mdanalysis, pymatgen, nomad-lab (pyproject.toml)
@@ -118,37 +119,41 @@ optimade==0.22.1          # via nomad-lab (pyproject.toml)
 orjson==3.10.6            # via h5grove, nomad-lab (pyproject.toml)
 packaging==24.1           # via deprecation, f90wrap, gunicorn, jupyterhub, matplotlib, mdanalysis, mongomock, pint, plotly, sphinx, xarray
 palettable==3.3.3         # via pymatgen
-pamela==1.1.0             # via jupyterhub
+pamela==1.1.0 ; sys_platform != 'win32'  # via jupyterhub
 pandas==1.5.3             # via nomad-openbis, panedr, pymatgen, xarray, eelsdbconverter (dependencies/parsers/eelsdb/pyproject.toml), nomad-lab (pyproject.toml)
 panedr==0.8.0             # via nomad-lab (pyproject.toml)
 parmed==4.2.2             # via nomad-lab (pyproject.toml)
-phonopy==2.25.0           # via asr
+phonopy==2.26.6           # via asr
 pillow==10.4.0            # via matplotlib, rdkit
 pint==0.17                # via nomad-lab (pyproject.toml)
-plotly==5.22.0            # via asr, pymatgen
+plotly==5.23.0            # via asr, pymatgen
 prometheus-client==0.20.0  # via jupyterhub
 prompt-toolkit==3.0.47    # via click-repl
+psutil==6.0.0 ; sys_platform == 'win32'  # via jupyterhub
 pyasn1==0.6.0             # via pyasn1-modules, rfc3161ng
 pyasn1-modules==0.4.0     # via rfc3161ng
 pybtex==0.24.0            # via pymatgen
-pycparser==2.22           # via cffi
+pycparser==2.22 ; platform_python_implementation != 'PyPy'  # via cffi
 pydantic==1.10.17         # via fastapi, optimade, nomad-lab (pyproject.toml)
 pyedr==0.8.0              # via panedr
 pygments==2.18.0          # via sphinx
 pyjwt==2.6.0              # via nomad-lab (pyproject.toml)
+pylibmagic==0.5.0 ; sys_platform == 'darwin'  # via nomad-lab (pyproject.toml)
 pymatgen==2024.5.1        # via asr, nomad-lab (pyproject.toml)
 pymongo==4.6.3            # via mongoengine, optimade, nomad-lab (pyproject.toml)
-pyopenssl==24.1.0         # via certipy
+pyopenssl==24.2.1         # via certipy
 pyparsing==3.1.2          # via matplotlib, rdflib
 pyrsistent==0.20.0        # via jsonschema
 python-dateutil==2.9.0.post0  # via arrow, celery, elasticsearch-dsl, jupyterhub, matplotlib, nomad-openbis, pandas, rfc3161ng
 python-dotenv==1.0.1      # via uvicorn
 python-json-logger==2.0.2  # via jupyter-telemetry, nomad-lab (pyproject.toml)
-python-keycloak==4.2.0    # via nomad-lab (pyproject.toml)
+python-keycloak==4.2.3    # via nomad-lab (pyproject.toml)
 python-logstash==0.4.6    # via nomad-lab (pyproject.toml)
 python-magic==0.4.24      # via nomad-lab (pyproject.toml)
+python-magic-bin==0.4.14 ; sys_platform == 'win32'  # via nomad-lab (pyproject.toml)
 python-multipart==0.0.9   # via nomad-lab (pyproject.toml)
 pytz==2024.1              # via pandas, nomad-lab (pyproject.toml)
+pywin32==306 ; sys_platform == 'win32'  # via docker
 pyyaml==6.0.1             # via phonopy, pybtex, uvicorn, nomad-lab (pyproject.toml)
 quippy-ase==0.9.14        # via nomad-lab (pyproject.toml)
 rdflib==5.0.0             # via nomad-lab (pyproject.toml)
@@ -160,7 +165,7 @@ rfc3161ng==2.1.3          # via nomad-lab (pyproject.toml)
 rfc3339-validator==0.1.4  # via jsonschema
 rfc3987==1.3.8            # via jsonschema
 ruamel-yaml==0.18.6       # via jupyter-telemetry, oauthenticator, pymatgen
-ruamel-yaml-clib==0.2.8   # via ruamel-yaml
+ruamel-yaml-clib==0.2.8 ; python_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.13.1             # via ase, griddataformats, matid, mdanalysis, pymatgen, scikit-learn, nomad-lab (pyproject.toml)
@@ -170,38 +175,38 @@ smmap==5.0.1              # via gitdb
 sniffio==1.3.1            # via anyio, httpx
 snowballstemmer==2.2.0    # via sphinx
 soupsieve==2.5            # via beautifulsoup4
-spglib==2.4.0             # via asr, matid, phonopy, pymatgen
-sphinx==7.3.7             # via recommonmark
+spglib==2.5.0             # via asr, matid, phonopy, pymatgen
+sphinx==7.4.7             # via recommonmark
 sphinxcontrib-applehelp==1.0.8  # via sphinx
 sphinxcontrib-devhelp==1.0.6  # via sphinx
-sphinxcontrib-htmlhelp==2.0.5  # via sphinx
+sphinxcontrib-htmlhelp==2.0.6  # via sphinx
 sphinxcontrib-jsmath==1.0.1  # via sphinx
-sphinxcontrib-qthelp==1.0.7  # via sphinx
+sphinxcontrib-qthelp==1.0.8  # via sphinx
 sphinxcontrib-serializinghtml==1.1.10  # via sphinx
 sqlalchemy==2.0.31        # via alembic, jupyterhub
 starlette==0.27.0         # via fastapi
-structlog==24.2.0         # via nomad-lab (pyproject.toml)
-sympy==1.12.1             # via pymatgen
+structlog==24.4.0         # via nomad-lab (pyproject.toml)
+sympy==1.13.1             # via pymatgen
 tabulate==0.8.9           # via nomad-openbis, pymatgen, nomad-lab (pyproject.toml)
-tenacity==8.4.2           # via plotly
+tenacity==8.5.0           # via plotly
 texttable==1.7.0          # via nomad-openbis
 threadpoolctl==3.5.0      # via mdanalysis, scikit-learn
-tifffile==2024.7.2        # via h5grove
-tomli==2.0.1              # via sphinx
+tifffile==2024.7.24       # via h5grove
+tomli==2.0.1 ; python_version < '3.11'  # via sphinx
 toposort==1.10            # via nomad-lab (pyproject.toml)
 tornado==6.4.1            # via jupyterhub
 tqdm==4.66.4              # via mdanalysis, pyedr, pymatgen
 traitlets==5.14.3         # via jupyter-telemetry, jupyterhub
 types-python-dateutil==2.9.0.20240316  # via arrow
-typing-extensions==4.12.2  # via alembic, anyio, asgiref, fastapi, jwcrypto, kombu, pydantic, sqlalchemy, starlette, uvicorn
+typing-extensions==4.12.2  # via alembic, anyio, asgiref, fastapi, jwcrypto, kombu, pydantic, spglib, sqlalchemy, starlette, uvicorn
 typish==1.9.3             # via nptyping
 tzdata==2024.1            # via celery
-uncertainties==3.2.1      # via pymatgen
+uncertainties==3.2.2      # via pymatgen
 unidecode==1.3.2          # via nomad-lab (pyproject.toml)
 uri-template==1.3.0       # via jsonschema
 urllib3==1.26.19          # via docker, elasticsearch, nomad-openbis, requests
-uvicorn==0.30.1           # via h5grove, nomad-lab (pyproject.toml)
-uvloop==0.19.0            # via uvicorn
+uvicorn==0.30.3           # via h5grove, nomad-lab (pyproject.toml)
+uvloop==0.19.0 ; platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'  # via uvicorn
 validators==0.18.2        # via nomad-lab (pyproject.toml)
 vine==5.1.0               # via amqp, celery, kombu
 watchfiles==0.22.0        # via uvicorn
diff --git a/scripts/check_python_dependencies.sh b/scripts/check_python_dependencies.sh
index 5c8c80fd5ffcea4a661074aa627a8dba64e0ebb4..c9412f00f1aeda908da8db07781bd76fe25b2d1f 100755
--- a/scripts/check_python_dependencies.sh
+++ b/scripts/check_python_dependencies.sh
@@ -21,7 +21,7 @@ grep pynxtools scripts/install_default_plugins.sh | grep "@git+" 1>&2
 cp requirements.txt requirements.txt.tmp
 cp requirements-dev.txt requirements-dev.txt.tmp
 
-uv pip compile -q -U --annotation-style=line \
+uv pip compile -q -U --universal --annotation-style=line \
     --extra=infrastructure --extra=parsing \
     --output-file=requirements.txt \
     dependencies/nomad-dos-fingerprints/pyproject.toml \
@@ -30,7 +30,7 @@ uv pip compile -q -U --annotation-style=line \
 
 diff requirements.txt.tmp requirements.txt
 
-uv pip compile -q -U --annotation-style=line \
+uv pip compile -q -U --universal --annotation-style=line \
     --extra=dev --extra=infrastructure --extra=parsing \
     --output-file=requirements-dev.txt \
     requirements.txt \
diff --git a/scripts/generate_python_dependencies.sh b/scripts/generate_python_dependencies.sh
index a08c88fdb9e7eb849a84b967a896a7fb1b382c75..eeb5d4a03b0a35486fb988129621dc5c968c4b39 100755
--- a/scripts/generate_python_dependencies.sh
+++ b/scripts/generate_python_dependencies.sh
@@ -15,14 +15,14 @@ project_dir=$(dirname $(dirname $(realpath $0)))
 cd $project_dir
 
 
-uv pip compile -U -p 3.9 --annotation-style=line \
+uv pip compile -U --universal --annotation-style=line \
     --extra=infrastructure --extra=parsing \
     --output-file=requirements.txt \
     dependencies/nomad-dos-fingerprints/pyproject.toml \
     dependencies/parsers/eelsdb/pyproject.toml \
     pyproject.toml
 
-uv pip compile -U -p 3.9 --annotation-style=line \
+uv pip compile -U --universal --annotation-style=line \
     --extra=dev --extra=infrastructure --extra=parsing \
     --output-file=requirements-dev.txt \
     requirements.txt \
diff --git a/tests/app/v1/routers/test_systems.py b/tests/app/v1/routers/test_systems.py
index 40beb917bac514fb283090be6d0ce436ac9e7118..fe261c95348a121c3ec87207d9c0dea6aefc88a5 100644
--- a/tests/app/v1/routers/test_systems.py
+++ b/tests/app/v1/routers/test_systems.py
@@ -400,31 +400,31 @@ def test_indices(path, filename, n_atoms, client, example_data_systems):
         ),
         pytest.param(
             '/run/0/system/3',
-            WrapModeEnum.original,
+            WrapModeEnum.original,  # type: ignore
             [[-15, -15, -15], [17, 17, 17]],
             id='original',
         ),
         pytest.param(
             '/run/0/system/3',
-            WrapModeEnum.wrap,
+            WrapModeEnum.wrap,  # type: ignore
             [[0, 0, 0], [2, 2, 2]],
             id='wrap, pbc=[1, 1, 1]',
         ),
         pytest.param(
             '/run/0/system/4',
-            WrapModeEnum.wrap,
+            WrapModeEnum.wrap,  # type: ignore
             [[-15, -15, -15], [17, 17, 17]],
             id='wrap, pbc=[0, 0, 0]',
         ),
         pytest.param(
             '/run/0/system/3',
-            WrapModeEnum.unwrap,
+            WrapModeEnum.unwrap,  # type: ignore
             [[1.5, 1.5, 1.5], [3.5, 3.5, 3.5]],
             id='unwrap, pbc=[1, 1, 1]',
         ),
         pytest.param(
             '/run/0/system/4',
-            WrapModeEnum.unwrap,
+            WrapModeEnum.unwrap,  # type: ignore
             [[-15, -15, -15], [17, 17, 17]],
             id='unwrap, pbc=[0, 0, 0]',
         ),