diff --git a/Dockerfile b/Dockerfile
index afc0e87b18817744ba1504a5ba4d542d559043e4..05c880f7740d8dc8b88bcfbe8c787b8dc9bdb349 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -24,8 +24,8 @@ FROM node:20 AS base_node
 FROM python:3.12-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
-ENV PYTHONPATH "${PYTHONPATH}:/backend/"
+ENV PYTHONUNBUFFERED=1
+ENV PYTHONPATH="${PYTHONPATH}:/backend/"
 ENV UV_SYSTEM_PYTHON=1
 
 FROM base_python AS base_final
@@ -75,7 +75,7 @@ FROM base_python AS dev_python
 # Prevents Python from writing pyc files.
 ENV PYTHONDONTWRITEBYTECODE=1
 
-ENV RUNTIME docker
+ENV RUNTIME=docker
 
 WORKDIR /app
 
@@ -108,8 +108,8 @@ FROM base_node AS dev_node
 
 WORKDIR /app/gui
 
-ENV PATH /app/node_modules/.bin:$PATH
-ENV NODE_OPTIONS "--max_old_space_size=4096 --openssl-legacy-provider"
+ENV PATH=/app/node_modules/.bin:$PATH
+ENV NODE_OPTIONS="--max_old_space_size=4096 --openssl-legacy-provider"
 
 # Fetch and cache all (but only) the dependencies
 COPY gui/yarn.lock gui/package.json ./
@@ -123,11 +123,11 @@ COPY tests/states/archives/dft.json  /app/tests/states/archives/dft.json
 COPY gui .
 RUN echo "REACT_APP_BACKEND_URL=/fairdi/nomad/latest" > .env
 
-FROM dev_node as build_node
+FROM dev_node AS build_node
 
 RUN yarn run build
 
-FROM dev_python as dev_package
+FROM dev_python AS dev_package
 
 WORKDIR /app
 
@@ -185,7 +185,7 @@ RUN uv build --sdist
 # ================================================================================
 # We use slim for the final image
 # ================================================================================
-FROM base_builder as builder
+FROM base_builder AS builder
 
 # install
 COPY --from=dev_package /app/dist/nomad-lab-*.tar.gz .
@@ -223,6 +223,9 @@ RUN mkdir -p /app/.volumes/fs \
  && chown -R nomad:1000 /app \
  && chown -R nomad:1000 /usr/local/lib/python3.12/site-packages/nomad
 
+# for attaching profiler to running processes
+RUN echo "kernel.yama.ptrace_scope = 0" > /etc/sysctl.d/10-ptrace.conf
+
 USER nomad
 
 # The application ports
diff --git a/nomad/app/v1/main.py b/nomad/app/v1/main.py
index 808c8e169d3fd5a06e38af35dda6de3b7e88dcd0..9573d1a35de112b91c542c757d9be8944dd36146 100644
--- a/nomad/app/v1/main.py
+++ b/nomad/app/v1/main.py
@@ -16,18 +16,19 @@
 # limitations under the License.
 #
 
-from typing import Any, cast
+import traceback
+
 from fastapi import FastAPI, status, Request
 from fastapi.middleware.cors import CORSMiddleware
-from fastapi.responses import JSONResponse, RedirectResponse
-from starlette.types import ASGIApp, Message, Receive, Scope, Send
-from fastapi.routing import APIRoute
-import traceback
-import orjson
+from fastapi.responses import JSONResponse, RedirectResponse, ORJSONResponse
+from pyinstrument import Profiler
+from starlette.middleware import Middleware
+from starlette.middleware.base import BaseHTTPMiddleware
+from starlette.responses import HTMLResponse
+from starlette.types import ASGIApp, Receive, Scope, Send
 
 from nomad import utils
 from nomad.config import config
-
 from .common import root_path
 from .routers import (
     users,
@@ -49,13 +50,23 @@ from .routers import (
 logger = utils.get_logger(__name__)
 
 
-class ORJSONResponse(JSONResponse):
-    media_type = 'application/json'
+class LoggingMiddleware:
+    def __init__(self, app: ASGIApp) -> None:
+        self.app = app
+
+    async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
+        with utils.timer(logger, 'request handled', path=scope.get('path')):
+            await self.app(scope, receive, send)
+
+
+async def profile_request(request: Request, call_next):
+    if not request.query_params.get('__profile__', False):
+        return await call_next(request)
+
+    with Profiler(async_mode='enabled') as profiler:
+        await call_next(request)
 
-    def render(self, content: Any) -> bytes:
-        return orjson.dumps(
-            content, option=orjson.OPT_INDENT_2 | orjson.OPT_NON_STR_KEYS
-        )  # pylint: disable=maybe-no-member
+    return HTMLResponse(profiler.output_html())
 
 
 app = FastAPI(
@@ -73,19 +84,22 @@ app = FastAPI(
     """
     ),
     default_response_class=ORJSONResponse,
-)
-
-app.add_middleware(
-    CORSMiddleware,
-    allow_origins=['*'],
-    allow_credentials=True,
-    allow_methods=['*'],
-    allow_headers=['*'],
-    expose_headers=['Content-Disposition'],
+    middleware=[
+        Middleware(
+            CORSMiddleware,
+            allow_origins=['*'],
+            allow_credentials=True,
+            allow_methods=['*'],
+            allow_headers=['*'],
+            expose_headers=['Content-Disposition'],
+        ),
+        Middleware(LoggingMiddleware),
+        Middleware(BaseHTTPMiddleware, dispatch=profile_request),
+    ],
 )
 
 
-async def redirect_to_docs(req: Request):
+async def redirect_to_docs(_):
     return RedirectResponse(f'{root_path}/extensions/docs')
 
 
@@ -93,18 +107,6 @@ async def redirect_to_docs(req: Request):
 app.add_route('/', redirect_to_docs, include_in_schema=False)
 
 
-class LoggingMiddleware:
-    def __init__(self, app: ASGIApp) -> None:
-        self.app = app
-
-    async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
-        with utils.timer(logger, 'request handled', path=scope.get('path')):
-            await self.app(scope, receive, send)
-
-
-app.add_middleware(LoggingMiddleware)
-
-
 @app.exception_handler(Exception)
 async def unicorn_exception_handler(request: Request, e: Exception):
     logger.error('unexpected exception in API', url=request.url, exc_info=e)
diff --git a/pyproject.toml b/pyproject.toml
index c62ef02da0f168ccd075961680cc44394adcdec4..9936fbad142055a644b56be674d80dba3fb1b5f8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -26,8 +26,9 @@ dependencies = [
     'httpx>=0.23.3',
     'importlib_metadata~=7.1.0',
     'jmespath>=0.10.0',
-    'lxml>=5.2',
+    'kaleido==0.2.1',
     'lxml-html-clean>=0.1.0',
+    'lxml>=5.2',
     'matid>=2.1.3',
     'nptyping~=1.4.4',
     'numpy>=1.22.4,<2.0.0',
@@ -37,7 +38,9 @@ dependencies = [
     'panedr>=0.2',
     'parmed>=3.0.0',
     'pint==0.17',
+    'py-spy', # for on-server profiling
     'pydantic>=1.10.8,<2.0.0',
+    'pyinstrument', # for endpoint profiling
     'pymatgen>=2023.5.10',
     'python-keycloak>=0.26.1',
     'python-magic==0.4.24',
@@ -49,10 +52,9 @@ dependencies = [
     'scipy>=1.7.1',
     'toposort>=1.0',
     'typing-extensions>=4.12',
-    'kaleido==0.2.1',
+    'unidecode==1.3.2',
     'wrapt>=1.12.1',
     'xarray>=0.20.2',
-    'unidecode==1.3.2',
 ]
 
 [project.urls]
@@ -75,7 +77,7 @@ infrastructure = [
     'celery>=5.0',
     'dockerspawner==13.0.0',
     'elasticsearch>=7.0,<8',
-    'fastapi<0.100',              # later versions pending pydantic v2 upgrade
+    'fastapi<0.100', # later versions pending pydantic v2 upgrade
     'filelock==3.3.1',
     'gitpython>=3.0',
     'gunicorn>=21.2.0,<22.0.0',
@@ -118,7 +120,7 @@ dev = [
     'mkdocs-material>=9.0',
     'mkdocs-redirects>=1.0',
     'mkdocs>=1.0',
-    'mypy==1.0.1',                                    # bug: incompatible with derived models of pydantic v1
+    'mypy==1.0.1', # bug: incompatible with derived models of pydantic v1
     'names==0.3.0',
     'uv>=0.2.35',
     'pytest-asyncio>=0.23',
@@ -131,7 +133,7 @@ dev = [
     'rope==0.21.0',
     'ruamel.yaml>=0.1',
     'ruff>=0.6',
-    'setuptools>=70',                                 # py3.12 doesn't bundle in setuptools, but this is required by mongomock lib
+    'setuptools>=70', # py3.12 doesn't bundle in setuptools, but this is required by mongomock lib
 ]
 
 
@@ -148,15 +150,15 @@ indent-width = 4
 
 [tool.ruff.lint]
 select = [
-    "E",  # pycodestyle
-    "W",  # pycodestyle
+    "E", # pycodestyle
+    "W", # pycodestyle
     "PL", # pylint
 ]
 ignore = [
-    "E501",    # Line too long ({width} > {limit} characters)
-    "E701",    # Multiple statements on one line (colon)
-    "E731",    # Do not assign a lambda expression, use a def
-    "E402",    # Module level import not at top of file
+    "E501", # Line too long ({width} > {limit} characters)
+    "E701", # Multiple statements on one line (colon)
+    "E731", # Do not assign a lambda expression, use a def
+    "E402", # Module level import not at top of file
     "PLR0911", # Too many return statements
     "PLR0912", # Too many branches
     "PLR0913", # Too many arguments in function definition
@@ -201,7 +203,7 @@ disable_error_code = "import, annotation-unchecked"
 extra-index-url = [
     "https://gitlab.mpcdf.mpg.de/api/v4/projects/2187/packages/pypi/simple",
 ]
-constraint-dependencies = [ # can be removed once pynxtools removes kikuchipy restriction
+constraint-dependencies = [# can be removed once pynxtools removes kikuchipy restriction
     "hyperspy>=1.7.6",
     "pillow<10.1",
 ]
diff --git a/requirements-dev.txt b/requirements-dev.txt
index bead3ebf40b6cc8e7e64aaf1d84b6afc371420e0..c1fc5c84edb6120d30f90962b654ca6319609563 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -2,7 +2,7 @@
 #    uv pip compile --universal -p 3.11 --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==1.0.0          # via sphinx, -r requirements.txt
-alembic==1.13.3           # via jupyterhub, -r requirements.txt
+alembic==1.14.0           # via jupyterhub, -r requirements.txt
 amqp==5.2.0               # via kombu, -r requirements.txt
 aniso8601==9.0.1          # via -r requirements.txt, nomad-lab (pyproject.toml)
 anyio==4.6.2.post1        # via httpx, starlette, watchfiles, -r requirements.txt
@@ -108,9 +108,9 @@ mkdocs-get-deps==0.2.0    # via mkdocs
 mkdocs-git-revision-date-localized-plugin==1.3.0  # via nomad-lab (pyproject.toml)
 mkdocs-glightbox==0.4.0   # via nomad-lab (pyproject.toml)
 mkdocs-macros-plugin==1.3.7  # via nomad-lab (pyproject.toml)
-mkdocs-material==9.5.42   # via nomad-lab (pyproject.toml)
+mkdocs-material==9.5.44   # 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)
+mkdocs-redirects==1.2.2   # via nomad-lab (pyproject.toml)
 mongoengine==0.29.1       # via -r requirements.txt, nomad-lab (pyproject.toml)
 mongomock==4.2.0.post1    # via optimade, -r requirements.txt
 monty==2024.10.21         # via pymatgen, -r requirements.txt
@@ -128,8 +128,8 @@ oauthenticator==15.1.0    # via -r requirements.txt, nomad-lab (pyproject.toml)
 oauthlib==3.2.2           # via jupyterhub, -r requirements.txt
 openpyxl==3.1.5           # via -r requirements.txt, nomad-lab (pyproject.toml)
 optimade==0.22.1          # via -r requirements.txt, nomad-lab (pyproject.toml)
-orjson==3.10.10           # via h5grove, -r requirements.txt, nomad-lab (pyproject.toml)
-packaging==24.1           # via deprecation, gunicorn, jupyterhub, matplotlib, mkdocs, mkdocs-macros-plugin, mongomock, pint, plotly, pytest, sphinx, xarray, -r requirements.txt
+orjson==3.10.11           # via h5grove, -r requirements.txt, nomad-lab (pyproject.toml)
+packaging==24.2           # via deprecation, gunicorn, jupyterhub, matplotlib, mkdocs, mkdocs-macros-plugin, mongomock, pint, plotly, pytest, sphinx, xarray, -r requirements.txt
 paginate==0.5.7           # via mkdocs-material
 palettable==3.3.3         # via pymatgen, -r requirements.txt
 pamela==1.2.0 ; sys_platform != 'win32'  # via jupyterhub, -r requirements.txt
@@ -145,13 +145,15 @@ pluggy==1.5.0             # via pytest
 prometheus-client==0.21.0  # via jupyterhub, -r requirements.txt
 prompt-toolkit==3.0.48    # via click-repl, -r requirements.txt
 psutil==6.1.0 ; sys_platform == 'win32'  # via jupyterhub, -r requirements.txt
+py-spy==0.4.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
 pyasn1==0.6.1             # via pyasn1-modules, rfc3161ng, -r requirements.txt
 pyasn1-modules==0.4.1     # via rfc3161ng, -r requirements.txt
 pybtex==0.24.0            # via pymatgen, -r requirements.txt
 pycparser==2.22 ; platform_python_implementation != 'PyPy'  # via cffi, -r requirements.txt
-pydantic==1.10.18         # via fastapi, optimade, -r requirements.txt, nomad-lab (pyproject.toml)
+pydantic==1.10.19         # 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, sphinx, -r requirements.txt
+pyinstrument==5.0.0       # via -r requirements.txt, nomad-lab (pyproject.toml)
 pyjwt==2.6.0              # via -r requirements.txt, nomad-lab (pyproject.toml)
 pymatgen==2024.5.1        # via -r requirements.txt, nomad-lab (pyproject.toml)
 pymdown-extensions==10.12  # via mkdocs-material
@@ -168,7 +170,7 @@ 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.6.3    # via -r requirements.txt, nomad-lab (pyproject.toml)
+python-keycloak==4.7.0    # 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)
@@ -180,7 +182,7 @@ pyyaml-env-tag==0.1       # via mkdocs
 rdflib==5.0.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
 rdkit==2023.9.5           # via -r requirements.txt, nomad-lab (pyproject.toml)
 recommonmark==0.7.1       # via -r requirements.txt, nomad-lab (pyproject.toml)
-regex==2024.9.11          # via mkdocs-material
+regex==2024.11.6          # via mkdocs-material
 requests==2.31.0          # via docker, jupyterhub, mkdocs-material, oauthenticator, optimade, pymatgen, python-gitlab, python-keycloak, requests-toolbelt, rfc3161ng, sphinx, -r requirements.txt, nomad-lab (pyproject.toml)
 requests-toolbelt==1.0.0  # via python-gitlab, python-keycloak, -r requirements.txt
 rfc3161ng==2.1.3          # via -r requirements.txt, nomad-lab (pyproject.toml)
@@ -189,7 +191,7 @@ 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, monty, oauthenticator, pymatgen, -r requirements.txt, nomad-lab (pyproject.toml)
 ruamel-yaml-clib==0.2.12 ; python_full_version < '3.13' and platform_python_implementation == 'CPython'  # via ruamel-yaml, -r requirements.txt
-ruff==0.7.1               # via nomad-lab (pyproject.toml)
+ruff==0.7.3               # via nomad-lab (pyproject.toml)
 runstats==2.0.0           # via -r requirements.txt, nomad-lab (pyproject.toml)
 scikit-learn==1.5.2       # via matid, -r requirements.txt, nomad-lab (pyproject.toml)
 scipy==1.14.1             # via ase, pymatgen, scikit-learn, -r requirements.txt, nomad-lab (pyproject.toml)
@@ -221,7 +223,7 @@ tifffile==2024.9.20       # via h5grove, -r requirements.txt
 tomli==2.0.2 ; python_full_version <= '3.11'  # via coverage
 toposort==1.10            # via -r requirements.txt, nomad-lab (pyproject.toml)
 tornado==6.4.1            # via jupyterhub, -r requirements.txt
-tqdm==4.66.6              # via pyedr, pymatgen, -r requirements.txt
+tqdm==4.67.0              # via pyedr, pymatgen, -r requirements.txt
 traitlets==5.14.3         # via jupyter-telemetry, jupyterhub, -r requirements.txt
 types-python-dateutil==2.9.0.20241003  # via arrow, -r requirements.txt
 typing-extensions==4.12.2  # via alembic, fastapi, jwcrypto, mypy, pydantic, sqlalchemy, -r requirements.txt, nomad-lab (pyproject.toml)
@@ -231,18 +233,18 @@ 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.20          # via docker, elasticsearch, requests, -r requirements.txt
-uv==0.4.29                # via nomad-lab (pyproject.toml)
+uv==0.5.1                 # via nomad-lab (pyproject.toml)
 uvicorn==0.32.0           # via h5grove, -r requirements.txt, nomad-lab (pyproject.toml)
 uvloop==0.21.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==5.0.3           # via mkdocs
+watchdog==6.0.0           # via mkdocs
 watchfiles==0.24.0        # via uvicorn, -r requirements.txt
 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.1          # via uvicorn, -r requirements.txt
+websockets==14.0          # via uvicorn, -r requirements.txt
 wrapt==1.16.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
 xarray==2024.10.0         # via -r requirements.txt, nomad-lab (pyproject.toml)
-zipp==3.20.2              # via importlib-metadata, -r requirements.txt
+zipp==3.21.0              # via importlib-metadata, -r requirements.txt
 zipstream-new==1.1.5      # via -r requirements.txt, nomad-lab (pyproject.toml)
diff --git a/requirements-plugins.txt b/requirements-plugins.txt
index 4b9816a7833895f9f35e2c755516bdd6526e4090..5b0fdaf241de497801e17a7184ba48fe252618dd 100644
--- a/requirements-plugins.txt
+++ b/requirements-plugins.txt
@@ -166,8 +166,8 @@ numexpr==2.10.1           # via blosc2, hyperspy, pyfai, pyxem, tables
 numpy==1.26.4             # via ase, blosc2, cftime, contourpy, dask, diffpy-structure, diffsims, fabio, fairmat-readers-xrd, findiff, griddataformats, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, igor2, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, monty, mrcfile, netcdf4, niondata, nionswift, nionswift-io, nionui, nomad-lab, nptyping, numba, numcodecs, numexpr, orix, pandas, phonopy, pycifrw, pyedr, pyfai, pymatgen, pynxtools, pynxtools-apm, pynxtools-em, pynxtools-xps, pyxem, radioactivedecay, rdkit, rosettasciio, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tables, tifffile, transforms3d, xarray, xraydb, zarr, -c requirements-dev.txt
 openpyxl==3.1.5           # via nomad-lab, perovskite-solar-cell-database, -c requirements-dev.txt
 orix==0.13.2              # via diffsims, kikuchipy, pyxem
-orjson==3.10.10           # 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, scikit-image, silx, tables, xarray, xraydb, -c requirements-dev.txt
+orjson==3.10.11           # via h5grove, nomad-lab, -c requirements-dev.txt
+packaging==24.2           # via dask, deprecation, hyperspy, ipykernel, jupyter-server, jupyterlab, jupyterlab-server, lazy-loader, matplotlib, mdanalysis, nbconvert, pint, plotly, pooch, scikit-image, silx, tables, xarray, xraydb, -c requirements-dev.txt
 palettable==3.3.3         # via pymatgen, -c requirements-dev.txt
 pandas==2.2.3             # via eelsdbconverter, ifes-apt-tc-data-modeling, nomad-lab, nomad-openbis, panedr, pymatgen, pynxtools, radioactivedecay, xarray, -c requirements-dev.txt
 pandocfilters==1.5.1      # via nbconvert
@@ -197,7 +197,7 @@ pyasn1-modules==0.4.1     # via rfc3161ng, -c requirements-dev.txt
 pybtex==0.24.0            # via pymatgen, -c requirements-dev.txt
 pycifrw==4.4.6            # via diffpy-structure, orix
 pycparser==2.22           # via cffi, -c requirements-dev.txt
-pydantic==1.10.18         # via nomad-lab, nomad-parser-plugins-atomistic, nomad-parser-plugins-database, nomad-parser-plugins-electronic, nomad-parser-plugins-workflow, nomad-porous-materials, -c requirements-dev.txt
+pydantic==1.10.19         # via nomad-lab, nomad-parser-plugins-atomistic, nomad-parser-plugins-database, nomad-parser-plugins-electronic, nomad-parser-plugins-workflow, nomad-porous-materials, -c requirements-dev.txt
 pyedr==0.8.0              # via panedr, -c requirements-dev.txt
 pyfai==2024.9.0           # via pyxem
 pygments==2.18.0          # via ipython, jupyter-console, nbconvert, -c requirements-dev.txt
@@ -216,7 +216,7 @@ 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, nomad-openbis, pandas, rfc3161ng, rosettasciio, -c requirements-dev.txt
 python-json-logger==2.0.2  # via jupyter-events, -c requirements-dev.txt
-python-keycloak==4.6.3    # via nomad-lab, -c requirements-dev.txt
+python-keycloak==4.7.0    # via nomad-lab, -c requirements-dev.txt
 python-magic==0.4.24      # via nomad-lab, -c requirements-dev.txt
 pytz==2024.2              # via nionswift, nomad-lab, pandas, -c requirements-dev.txt
 pywin32==308 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32'  # via jupyter-core, -c requirements-dev.txt
@@ -260,7 +260,7 @@ tinycss2==1.3.0           # via nbconvert
 toolz==1.0.0              # 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.6              # via diffsims, hyperspy, ipyparallel, kikuchipy, mdanalysis, orix, pyedr, pymatgen, pyxem, -c requirements-dev.txt
+tqdm==4.67.0              # 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, -c requirements-dev.txt
 traits==6.4.3             # via hyperspy, pyxem
 transforms3d==0.4.2       # via diffsims, pyxem
@@ -284,7 +284,7 @@ xarray==2024.10.0         # via nomad-lab, nomad-parser-plugins-workflow, pynxto
 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.3 ; platform_machine == 'AMD64' or platform_machine == 'x86_64'  # via hyperspy
-zipp==3.20.2              # via importlib-metadata, -c requirements-dev.txt
+zipp==3.21.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 4f2fe81d3c6885b3010150a5c6d14af267d2091e..e312909155c3ce3b08692461b8433935ad20e48c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,7 @@
 # This file was autogenerated by uv via the following command:
 #    uv pip compile --universal -p 3.11 --annotation-style=line --extra=infrastructure --extra=parsing --output-file=requirements.txt pyproject.toml
 alabaster==1.0.0          # via sphinx
-alembic==1.13.3           # via jupyterhub
+alembic==1.14.0           # via jupyterhub
 amqp==5.2.0               # via kombu
 aniso8601==9.0.1          # via nomad-lab (pyproject.toml)
 anyio==4.6.2.post1        # via httpx, starlette, watchfiles
@@ -104,8 +104,8 @@ oauthenticator==15.1.0    # via nomad-lab (pyproject.toml)
 oauthlib==3.2.2           # via jupyterhub
 openpyxl==3.1.5           # via nomad-lab (pyproject.toml)
 optimade==0.22.1          # via nomad-lab (pyproject.toml)
-orjson==3.10.10           # via h5grove, nomad-lab (pyproject.toml)
-packaging==24.1           # via deprecation, gunicorn, jupyterhub, matplotlib, mongomock, pint, plotly, sphinx, xarray
+orjson==3.10.11           # via h5grove, nomad-lab (pyproject.toml)
+packaging==24.2           # via deprecation, gunicorn, jupyterhub, matplotlib, mongomock, pint, plotly, sphinx, xarray
 palettable==3.3.3         # via pymatgen
 pamela==1.2.0 ; sys_platform != 'win32'  # via jupyterhub
 pandas==2.2.3             # via panedr, pymatgen, xarray, nomad-lab (pyproject.toml)
@@ -117,13 +117,15 @@ plotly==5.24.1            # via pymatgen
 prometheus-client==0.21.0  # via jupyterhub
 prompt-toolkit==3.0.48    # via click-repl
 psutil==6.1.0 ; sys_platform == 'win32'  # via jupyterhub
+py-spy==0.4.0             # via nomad-lab (pyproject.toml)
 pyasn1==0.6.1             # via pyasn1-modules, rfc3161ng
 pyasn1-modules==0.4.1     # via rfc3161ng
 pybtex==0.24.0            # via pymatgen
 pycparser==2.22 ; platform_python_implementation != 'PyPy'  # via cffi
-pydantic==1.10.18         # via fastapi, optimade, nomad-lab (pyproject.toml)
+pydantic==1.10.19         # via fastapi, optimade, nomad-lab (pyproject.toml)
 pyedr==0.8.0              # via panedr
 pygments==2.18.0          # via sphinx
+pyinstrument==5.0.0       # via nomad-lab (pyproject.toml)
 pyjwt==2.6.0              # via nomad-lab (pyproject.toml)
 pymatgen==2024.5.1        # via nomad-lab (pyproject.toml)
 pymongo==4.6.3            # via mongoengine, optimade, nomad-lab (pyproject.toml)
@@ -132,7 +134,7 @@ pyrsistent==0.20.0        # via jsonschema
 python-dateutil==2.9.0.post0  # via arrow, celery, elasticsearch-dsl, jupyterhub, matplotlib, 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.6.3    # via nomad-lab (pyproject.toml)
+python-keycloak==4.7.0    # 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)
@@ -177,7 +179,7 @@ threadpoolctl==3.5.0      # via scikit-learn
 tifffile==2024.9.20       # via h5grove
 toposort==1.10            # via nomad-lab (pyproject.toml)
 tornado==6.4.1            # via jupyterhub
-tqdm==4.66.6              # via pyedr, pymatgen
+tqdm==4.67.0              # via pyedr, pymatgen
 traitlets==5.14.3         # via jupyter-telemetry, jupyterhub
 types-python-dateutil==2.9.0.20241003  # via arrow
 typing-extensions==4.12.2  # via alembic, fastapi, jwcrypto, pydantic, sqlalchemy, nomad-lab (pyproject.toml)
@@ -195,8 +197,8 @@ watchfiles==0.24.0        # via uvicorn
 wcwidth==0.2.13           # via prompt-toolkit
 webcolors==24.8.0         # via jsonschema
 webencodings==0.5.1       # via html5lib
-websockets==13.1          # via uvicorn
+websockets==14.0          # via uvicorn
 wrapt==1.16.0             # via nomad-lab (pyproject.toml)
 xarray==2024.10.0         # via nomad-lab (pyproject.toml)
-zipp==3.20.2              # via importlib-metadata
+zipp==3.21.0              # via importlib-metadata
 zipstream-new==1.1.5      # via nomad-lab (pyproject.toml)