diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 65eb216ba874ec8ace3220cbe928ed181bf5c644..60743175daae9f7e5c6734a935418ba74617b93f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -105,9 +105,9 @@ python linting:
   before_script:
     - cd /app
   script:
-    - ruff nomad tests
+    - ruff check nomad tests
     - ruff format nomad tests --check
-    - ruff nomad tests --output-format gitlab > $CI_PROJECT_DIR/gl-code-quality-report.json
+    - ruff check nomad tests --output-format gitlab > $CI_PROJECT_DIR/gl-code-quality-report.json
     - mypy nomad tests
   rules:
     - if: $CI_COMMIT_TAG
diff --git a/.pylintrc b/.pylintrc
deleted file mode 100644
index a5c27b21c0351394c904cf970e010484ecc3cd95..0000000000000000000000000000000000000000
--- a/.pylintrc
+++ /dev/null
@@ -1,371 +0,0 @@
-[MASTER]
-
-# A comma-separated list of package or module names from where C extensions may
-# be loaded. Extensions are loading into the active Python interpreter and may
-# run arbitrary code.
-extension-pkg-whitelist=pydantic,orjson
-
-# List of plugins (as comma separated values of python module names) to load,
-# usually to register additional checkers.
-load-plugins=pylint_mongoengine,nomad.metainfo.pylint_plugin
-
-
-[MESSAGES CONTROL]
-
-# Disable the message, report, category or checker with the given id(s). You
-# can either give multiple identifiers separated by comma (,) or put this
-# option multiple times (only on the command line, not in the configuration
-# file where it should appear only once). You can also use "--disable=all" to
-# disable everything first and then reenable specific checks. For example, if
-# you want to run only the similarities checker, you can use "--disable=all
-# --enable=similarities". If you want to run only the classes checker, but have
-# no Warning level messages displayed, use "--disable=all --enable=classes
-# --disable=W".
-disable=blacklisted-name,
-        unspecified-encoding,
-        invalid-name,
-        missing-docstring,
-        empty-docstring,
-        unneeded-not,
-        singleton-comparison,
-        unidiomatic-typecheck,
-        consider-using-enumerate,
-        consider-iterating-dictionary,
-        consider-using-f-string,
-        bad-classmethod-argument,
-        bad-mcs-method-argument,
-        bad-mcs-classmethod-argument,
-        single-string-used-for-slots,
-        line-too-long,
-        too-many-lines,
-        trailing-whitespace,
-        missing-final-newline,
-        trailing-newlines,
-        multiple-statements,
-        superfluous-parens,
-        bad-whitespace,
-        mixed-line-endings,
-        unexpected-line-ending-format,
-        bad-continuation,
-        wrong-spelling-in-comment,
-        wrong-spelling-in-docstring,
-        invalid-characters-in-docstring,
-        multiple-imports,
-        wrong-import-order,
-        ungrouped-imports,
-        wrong-import-position,
-        useless-import-alias,
-        import-outside-toplevel,
-        len-as-condition,
-        raw-checker-failed,
-        bad-inline-option,
-        locally-disabled,
-        file-ignored,
-        suppressed-message,
-        useless-suppression,
-        deprecated-pragma,
-        use-symbolic-message-instead,
-        c-extension-no-member,
-        literal-comparison,
-        comparison-with-itself,
-        no-self-use,
-        no-classmethod-decorator,
-        no-staticmethod-decorator,
-        useless-object-inheritance,
-        cyclic-import,
-        duplicate-code,
-        too-many-ancestors,
-        too-many-instance-attributes,
-        too-few-public-methods,
-        too-many-public-methods,
-        too-many-return-statements,
-        too-many-branches,
-        too-many-arguments,
-        too-many-locals,
-        too-many-statements,
-        too-many-boolean-expressions,
-        consider-merging-isinstance,
-        too-many-nested-blocks,
-        simplifiable-if-statement,
-        redefined-argument-from-local,
-        no-else-return,
-        consider-using-ternary,
-        trailing-comma-tuple,
-        stop-iteration-return,
-        simplify-boolean-expression,
-        inconsistent-return-statements,
-        useless-return,
-        consider-swap-variables,
-        consider-using-join,
-        consider-using-in,
-        consider-using-get,
-        chained-comparison,
-        consider-using-dict-comprehension,
-        consider-using-set-comprehension,
-        dangerous-default-value,
-        pointless-statement,
-        pointless-string-statement,
-        expression-not-assigned,
-        unnecessary-pass,
-        unnecessary-lambda,
-        assign-to-new-keyword,
-        useless-else-on-loop,
-        exec-used,
-        eval-used,
-        confusing-with-statement,
-        using-constant-test,
-        comparison-with-callable,
-        lost-exception,
-        assert-on-tuple,
-        attribute-defined-outside-init,
-        bad-staticmethod-argument,
-        protected-access,
-        arguments-differ,
-        signature-differs,
-        abstract-method,
-        super-init-not-called,
-        no-init,
-        non-parent-init-called,
-        useless-super-delegation,
-        bad-indentation,
-        mixed-indentation,
-        wildcard-import,
-        deprecated-module,
-        reimported,
-        import-self,
-        misplaced-future,
-        fixme,
-        global-variable-undefined,
-        global-statement,
-        global-at-module-level,
-        unused-argument,
-        unused-wildcard-import,
-        redefined-outer-name,
-        redefined-builtin,
-        undefined-loop-variable,
-        cell-var-from-loop,
-        possibly-unused-variable,
-        self-cls-assignment,
-        bare-except,
-        broad-except,
-        duplicate-except,
-        try-except-raise,
-        raising-format-tuple,
-        keyword-arg-before-vararg,
-        logging-not-lazy,
-        logging-format-interpolation,
-        logging-fstring-interpolation,
-        bad-format-string-key,
-        unused-format-string-key,
-        missing-format-argument-key,
-        unused-format-string-argument,
-        format-combined-specification,
-        missing-format-attribute,
-        invalid-format-index,
-        anomalous-unicode-escape-in-string,
-        boolean-datetime,
-        redundant-unittest-assert,
-        deprecated-method,
-        bad-thread-instantiation,
-        shallow-copy-environ,
-        invalid-envvar-default,
-        subprocess-popen-preexec-fn,
-        apply-builtin,
-        basestring-builtin,
-        buffer-builtin,
-        cmp-builtin,
-        coerce-builtin,
-        execfile-builtin,
-        file-builtin,
-        long-builtin,
-        raw_input-builtin,
-        reduce-builtin,
-        standarderror-builtin,
-        unicode-builtin,
-        xrange-builtin,
-        coerce-method,
-        delslice-method,
-        getslice-method,
-        setslice-method,
-        no-absolute-import,
-        old-division,
-        dict-iter-method,
-        dict-view-method,
-        next-method-called,
-        metaclass-assignment,
-        indexing-exception,
-        raising-string,
-        reload-builtin,
-        oct-method,
-        hex-method,
-        nonzero-method,
-        cmp-method,
-        input-builtin,
-        round-builtin,
-        intern-builtin,
-        unichr-builtin,
-        map-builtin-not-iterating,
-        zip-builtin-not-iterating,
-        range-builtin-not-iterating,
-        filter-builtin-not-iterating,
-        using-cmp-argument,
-        div-method,
-        idiv-method,
-        rdiv-method,
-        exception-message-attribute,
-        invalid-str-codec,
-        sys-max-int,
-        bad-python3-import,
-        deprecated-string-function,
-        deprecated-str-translate-call,
-        deprecated-itertools-function,
-        deprecated-types-field,
-        next-method-defined,
-        dict-items-not-iterating,
-        dict-keys-not-iterating,
-        dict-values-not-iterating,
-        deprecated-operator-function,
-        deprecated-urllib-function,
-        xreadlines-attribute,
-        deprecated-sys-function,
-        exception-escape,
-        comprehension-escape,
-        mongoengine-placeholder,
-        # TODO: These were temporarily added when upgrading to newer pylint version that
-        # catches these new linting issues. Should be addressed and removed.
-        self-assigning-variable,
-        use-dict-literal,
-        unnecessary-comprehension,
-        use-sequence-for-iteration,
-        f-string-without-interpolation,
-        super-with-arguments,
-        used-before-assignment,
-        consider-using-dict-items,
-        no-else-continue,
-        arguments-renamed,
-        consider-using-with,
-        raise-missing-from,
-        no-else-break
-
-# Enable the message, report, category or checker with the given id(s). You can
-# either give multiple identifier separated by comma (,) or put this option
-# multiple time (only on the command line, not in the configuration file where
-# it should appear only once). See also the "--disable" option for examples.
-enable=syntax-error,
-       unrecognized-inline-option,
-       bad-option-value,
-       init-is-generator,
-       return-in-init,
-       function-redefined,
-       not-in-loop,
-       return-outside-function,
-       yield-outside-function,
-       return-arg-in-generator,
-       nonexistent-operator,
-       duplicate-argument-name,
-       abstract-class-instantiated,
-       bad-reversed-sequence,
-       too-many-star-expressions,
-       invalid-star-assignment-target,
-       star-needs-assignment-target,
-       nonlocal-and-global,
-       continue-in-finally,
-       nonlocal-without-binding,
-       used-prior-global-declaration,
-       misplaced-format-function,
-       method-hidden,
-       access-member-before-definition,
-       no-method-argument,
-       no-self-argument,
-       invalid-slots-object,
-       assigning-non-slot,
-       invalid-slots,
-       inherit-non-class,
-       inconsistent-mro,
-       duplicate-bases,
-       non-iterator-returned,
-       unexpected-special-method-signature,
-       invalid-length-returned,
-       import-error,
-       relative-beyond-top-level,
-       used-before-assignment,
-       undefined-variable,
-       undefined-all-variable,
-       invalid-all-object,
-       no-name-in-module,
-       unbalanced-tuple-unpacking,
-       unpacking-non-sequence,
-       bad-except-order,
-       raising-bad-type,
-       bad-exception-context,
-       misplaced-bare-raise,
-       raising-non-exception,
-       notimplemented-raised,
-       catching-non-exception,
-       bad-super-call,
-       no-member,
-       not-callable,
-       assignment-from-no-return,
-       no-value-for-parameter,
-       too-many-function-args,
-       unexpected-keyword-arg,
-       redundant-keyword-arg,
-       missing-kwoa,
-       invalid-sequence-index,
-       invalid-slice-index,
-       assignment-from-none,
-       not-context-manager,
-       invalid-unary-operand-type,
-       unsupported-binary-operation,
-       repeated-keyword,
-       not-an-iterable,
-       not-a-mapping,
-       unsupported-membership-test,
-       unsubscriptable-object,
-       unsupported-assignment-operation,
-       unsupported-delete-operation,
-       invalid-metaclass,
-       unhashable-dict-key,
-       logging-unsupported-format,
-       logging-format-truncated,
-       logging-too-many-args,
-       logging-too-few-args,
-       bad-format-character,
-       truncated-format-string,
-       mixed-format-string,
-       format-needs-mapping,
-       missing-format-string-key,
-       too-many-format-args,
-       too-few-format-args,
-       bad-str-strip-call,
-       invalid-envvar-value,
-       print-statement,
-       parameter-unpacking,
-       unpacking-in-except,
-       old-raise-syntax,
-       backtick,
-       import-star-module-level,
-       yield-inside-async-function,
-       not-async-context-manager,
-       fatal,
-       astroid-error,
-       parse-error,
-       method-check-failed,
-       unreachable,
-       duplicate-key,
-       unnecessary-semicolon,
-       global-variable-not-assigned,
-       unused-import,
-       unused-variable,
-       binary-op-exception,
-       bad-format-string,
-       anomalous-backslash-in-string,
-       bad-open-mode
-
-
-[TYPECHECK]
-
-# List of class names for which member attributes should not be checked (useful
-# for classes with dynamically set attributes). This supports the use of
-# qualified names.
-ignored-classes=optparse.Values,thread._local,_thread._local,SearchResponse
diff --git a/Dockerfile b/Dockerfile
index 57671c25980ffb9f8af26aa904ce050537186319..72193689ade871a20ae837fc7b2810b116a664d6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -95,8 +95,7 @@ COPY examples ./examples
 COPY nomad ./nomad
 COPY scripts ./scripts
 COPY tests ./tests
-COPY .pylintrc \
-     .coveragerc \
+COPY .coveragerc \
      AUTHORS \
      LICENSE \
      MANIFEST.in \
diff --git a/mkdocs.yml b/mkdocs.yml
index 56b2fa02ef5d3c5323f6a2d6bb95ec60434553f5..09ad791204f21c7b2ca395267f4ef856f324090e 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -101,12 +101,8 @@ markdown_extensions:
   - pymdownx.arithmatex:
       generic: true
   - pymdownx.emoji: # TODO make sure this isn't used!!
-      # below 2 lines works for mkdocs-material<=9.3, but they produce a deprecated warning
-      emoji_index: !!python/name:materialx.emoji.twemoji
-      emoji_generator: !!python/name:materialx.emoji.to_svg
-      # below 2 lines are supposed to work for mkdocs-material>=9.4
-      # emoji_index: !!python/name:material.extensions.emoji.twemoji
-      # emoji_generator: !!python/name:material.extensions.emoji.to_svg
+      emoji_index: !!python/name:material.extensions.emoji.twemoji
+      emoji_generator: !!python/name:material.extensions.emoji.to_svg
   - pymdownx.superfences:
       custom_fences:
         - name: mermaid
diff --git a/nomad/app/static/__init__.py b/nomad/app/static/__init__.py
index 127a985928c45733aaed86ecfcefb1402cbe1756..c67cf9204faf89dff6803948e050728ff6bbd05d 100644
--- a/nomad/app/static/__init__.py
+++ b/nomad/app/static/__init__.py
@@ -102,9 +102,9 @@ async def add_header(request: Request, call_next):
     if max_age is not None:
         response.headers['Cache-Control'] = f'max-age={max_age}, must-revalidate'
     else:
-        response.headers[
-            'Cache-Control'
-        ] = f'max-age=0, no-cache, no-store, must-revalidate'
+        response.headers['Cache-Control'] = (
+            f'max-age=0, no-cache, no-store, must-revalidate'
+        )
 
     # The etags that we and starlette produce do not follow the RFC, because they do not
     # start with a " as the RFC specifies. Nginx considers them weak etags and will strip
diff --git a/nomad/app/v1/routers/federation.py b/nomad/app/v1/routers/federation.py
index ea22b39c8ce9c27bd5debc47b74b3f2ba01b2bc9..cc35d792dd67d105cabf3748c72f3680ff483dc1 100644
--- a/nomad/app/v1/routers/federation.py
+++ b/nomad/app/v1/routers/federation.py
@@ -19,6 +19,7 @@
 """
 API endpoint to receive telemetry data (in logstash format) from local installations.
 """
+
 import gzip
 import io
 import socket
diff --git a/nomad/app/v1/routers/uploads.py b/nomad/app/v1/routers/uploads.py
index f72c4b734abb4013152350034455af9b6b45bb7c..dae2381bf3579c46a76389e41d1e7c05020068f1 100644
--- a/nomad/app/v1/routers/uploads.py
+++ b/nomad/app/v1/routers/uploads.py
@@ -49,6 +49,7 @@ from nomad.files import (
 )
 from nomad.bundles import BundleExporter, BundleImporter
 from nomad.config.models.config import Reprocess
+from nomad.groups import get_group_ids
 from nomad.processing import (
     Upload,
     Entry,
@@ -2641,7 +2642,7 @@ def get_role_query(roles: List[UploadRole], user: User) -> Q:
     if not roles:
         roles = list(UploadRole)
 
-    group_ids = user.get_group_ids()
+    group_ids = get_group_ids(user.user_id)
 
     role_query = Q()
     if UploadRole.main_author in roles:
@@ -2667,7 +2668,7 @@ def is_user_upload_viewer(upload: Upload, user: Optional[User]):
     if user.user_id in upload.viewers:
         return True
 
-    group_ids = user.get_group_ids()
+    group_ids = get_group_ids(user.user_id)
     if not set(group_ids).isdisjoint(upload.viewer_groups):
         return True
 
@@ -2681,7 +2682,7 @@ def is_user_upload_writer(upload: Upload, user: User):
     if user.user_id in upload.writers:
         return True
 
-    group_ids = user.get_group_ids()
+    group_ids = get_group_ids(user.user_id)
     if not set(group_ids).isdisjoint(upload.writer_groups):
         return True
 
diff --git a/nomad/cli/client/datatests.py b/nomad/cli/client/datatests.py
index 1180cb630686cc4d2c95306f73e1eb35a5ce757b..22fca47ad50a308181fe049de2105a20ce95b2dc 100644
--- a/nomad/cli/client/datatests.py
+++ b/nomad/cli/client/datatests.py
@@ -20,6 +20,7 @@
 A command that runs a series of data compatibility tests against this version
 and another nomad@FAIRDI installation.
 """
+
 from nomad.client import api
 from nomad.datamodel.datamodel import EntryArchive
 from nomad.metainfo import MEnum
diff --git a/nomad/client/archive.py b/nomad/client/archive.py
index decae7b85caa24346c74f6b1a1604d86c46ef1ca..5e2e46da7ea640fe36247260d8949033a455b2d9 100644
--- a/nomad/client/archive.py
+++ b/nomad/client/archive.py
@@ -400,7 +400,7 @@ class ArchiveQuery:
             while chunk := list(islice(iterator, chunk_size)):
                 yield chunk
 
-        with progressbar(
+        with progressbar(  # type: ignore
             length=actual_number, label=f'Downloading {actual_number} entries...'
         ) as bar:
             async with AsyncClient(timeout=Timeout(timeout=300)) as session:
diff --git a/nomad/config/models/config.py b/nomad/config/models/config.py
index d7125d45eb45ac25310b3f32cd0fd7147cc19077..c18e74f09fa20e3abec246e18e58e7eae4573eb8 100644
--- a/nomad/config/models/config.py
+++ b/nomad/config/models/config.py
@@ -19,15 +19,16 @@
 import warnings
 import os
 import logging
+from importlib.metadata import version
+
 import yaml
 from typing import List, Union, Optional, Dict, Any
 from pydantic import Field, root_validator, validator, parse_obj_as
-from pkg_resources import get_distribution, DistributionNotFound
 import pkgutil
 
 try:
-    __version__ = get_distribution('nomad-lab').version
-except DistributionNotFound:
+    __version__ = version('nomad-lab')
+except Exception:  # noqa
     # package is not installed
     pass
 
diff --git a/nomad/datamodel/data.py b/nomad/datamodel/data.py
index c16c80466104f642e335d7f7f68adbc727a488ab..73595a44ed730023f0e4d86e009777ee32267c9a 100644
--- a/nomad/datamodel/data.py
+++ b/nomad/datamodel/data.py
@@ -19,7 +19,7 @@
 import os.path
 
 from typing import Any
-from cachetools import cached, TTLCache
+from cachetools import TTLCache, cached
 from nomad.metainfo.metainfo import (
     predefined_datatypes,
     Category,
@@ -175,7 +175,7 @@ class User(Author):
     is_oasis_admin = Quantity(type=bool, default=False)
 
     @staticmethod
-    @cached(cache=TTLCache(maxsize=2048, ttl=24 * 3600))
+    @cached(TTLCache(maxsize=2048, ttl=24 * 3600))
     def get(*args, **kwargs) -> 'User':
         from nomad import infrastructure
 
@@ -188,12 +188,6 @@ class User(Author):
         assert self.user_id is not None
         return infrastructure.user_management.get_user(user_id=self.user_id)  # type: ignore
 
-    @cached(cache=TTLCache(maxsize=2048, ttl=60))
-    def get_group_ids(self):
-        from nomad.groups import UserGroup
-
-        return UserGroup.get_ids_by_user_id(self.user_id)
-
 
 class UserReference(Reference):
     """
diff --git a/nomad/datamodel/datamodel.py b/nomad/datamodel/datamodel.py
index c04f126815390168304b2927320e518366f0e779..5e21d28a5f3ec5a84660bc9b2cc8b9ed7b98c2df 100644
--- a/nomad/datamodel/datamodel.py
+++ b/nomad/datamodel/datamodel.py
@@ -16,7 +16,7 @@
 # limitations under the License.
 #
 
-""" All generic entry metadata and related classes. """
+"""All generic entry metadata and related classes."""
 
 from typing import List, Any
 from enum import Enum
diff --git a/nomad/datamodel/results.py b/nomad/datamodel/results.py
index 820f4f6bce00c299dd26afe831c302d45ca040b5..4bf6cf82a89ca18b2945d111642a75072f5c84e3 100644
--- a/nomad/datamodel/results.py
+++ b/nomad/datamodel/results.py
@@ -2770,13 +2770,13 @@ class GeometryOptimization(MSection):
         )
         type = simulationworkflowschema.GeometryOptimization.name.m_copy()
         convergence_tolerance_energy_difference = simulationworkflowschema.GeometryOptimizationMethod.convergence_tolerance_energy_difference.m_copy()
-        convergence_tolerance_energy_difference.m_annotations[
-            'elasticsearch'
-        ] = Elasticsearch(material_entry_type)
+        convergence_tolerance_energy_difference.m_annotations['elasticsearch'] = (
+            Elasticsearch(material_entry_type)
+        )
         convergence_tolerance_force_maximum = simulationworkflowschema.GeometryOptimizationMethod.convergence_tolerance_force_maximum.m_copy()
-        convergence_tolerance_force_maximum.m_annotations[
-            'elasticsearch'
-        ] = Elasticsearch(material_entry_type)
+        convergence_tolerance_force_maximum.m_annotations['elasticsearch'] = (
+            Elasticsearch(material_entry_type)
+        )
         final_force_maximum = simulationworkflowschema.GeometryOptimizationResults.final_force_maximum.m_copy()
         final_force_maximum.m_annotations['elasticsearch'] = Elasticsearch(
             material_entry_type
diff --git a/nomad/doi.py b/nomad/doi.py
index b2da6fe77293ee04b713435fa74bb38bb8717d54..67ba54067a602e9d88ebc9c182f7473f0d5fb255 100644
--- a/nomad/doi.py
+++ b/nomad/doi.py
@@ -20,6 +20,7 @@
 This module contains all functions necessary to manage DOI via datacite.org and its
 MDS API (https://support.datacite.org/docs/mds-api-guide).
 """
+
 import xml.etree.ElementTree as ET
 import datetime
 import requests
@@ -155,9 +156,9 @@ class DOI(Document):
             title = 'NOMAD Repository Dataset'
 
         mds_resource = ET.Element('resource')
-        mds_resource.attrib[
-            'xsi:schemaLocation'
-        ] = 'http://datacite.org/schema/kernel-3 http://schema.datacite.org/meta/kernel-3.1/metadata.xsd'
+        mds_resource.attrib['xsi:schemaLocation'] = (
+            'http://datacite.org/schema/kernel-3 http://schema.datacite.org/meta/kernel-3.1/metadata.xsd'
+        )
         mds_resource.attrib['xmlns'] = 'http://datacite.org/schema/kernel-3'
         mds_resource.attrib['xmlns:xsi'] = 'http://www.w3.org/2001/XMLSchema-instance'
 
diff --git a/nomad/files.py b/nomad/files.py
index d18a420479a1912e6845218675136665d758fa98..c229c2a7fac47bf80d7ab77fd74baa557aa25983 100644
--- a/nomad/files.py
+++ b/nomad/files.py
@@ -1464,9 +1464,9 @@ class PublicUploadFiles(UploadFiles):
             )
             if found:
                 if files_found:
-                    self._access = (
-                        self._raw_zip_file_object
-                    ) = self._archive_msg_file_object = None
+                    self._access = self._raw_zip_file_object = (
+                        self._archive_msg_file_object
+                    ) = None
                     raise KeyError(
                         'Inconsistency: both public and restricted files found'
                     )
diff --git a/nomad/groups.py b/nomad/groups.py
index 25915a83565e11b949f6a468ae79109b97eff4c5..66ef9c08ce24a12c57180e1beda45ba02d118713 100644
--- a/nomad/groups.py
+++ b/nomad/groups.py
@@ -16,6 +16,7 @@
 # limitations under the License.
 #
 from typing import Iterable, List, Optional
+
 from mongoengine import Document, StringField, ListField
 from mongoengine.queryset.visitor import Q
 
@@ -96,3 +97,7 @@ def user_group_exists(group_id: str, *, include_all=True) -> bool:
     if include_all and group_id == 'all':
         return True
     return get_user_group(group_id) is not None
+
+
+def get_group_ids(user_id):
+    return UserGroup.get_ids_by_user_id(user_id)
diff --git a/nomad/metainfo/__init__.py b/nomad/metainfo/__init__.py
index 191b110883d736aed57e2610f2526bddae137000..be07523c0c4e3207e3085d9f4210291978d68199 100644
--- a/nomad/metainfo/__init__.py
+++ b/nomad/metainfo/__init__.py
@@ -29,7 +29,6 @@ manipulate, and access data. We also use it to map data to various storage forma
 including JSON, (HDF5), mongodb, and elastic search.
 """
 
-
 from .metainfo import (
     MTypes,
     MSectionBound,
diff --git a/nomad/metainfo/example.py b/nomad/metainfo/example.py
index ada47d210fd8860bf056db2cf8f0ca495bb96353..3f18e1b52ca0446bf8408a4d96fe65a9f58bff5b 100644
--- a/nomad/metainfo/example.py
+++ b/nomad/metainfo/example.py
@@ -16,7 +16,7 @@
 # limitations under the License.
 #
 
-""" An example metainfo package. """
+"""An example metainfo package."""
 
 import numpy as np
 from datetime import datetime
diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py
index fb1ca83ce924174bb9752a5d8e786110eeaa13d2..0b7bd3ee08e4b8fb5bfd07678b95491392939388 100644
--- a/nomad/metainfo/metainfo.py
+++ b/nomad/metainfo/metainfo.py
@@ -3603,9 +3603,9 @@ class Definition(MSection):
             '../uploads/{upload_id}/archive/{entry_id}#{fragment}'
         """
         kwargs['strict'] = True
-        kwargs[
-            'global_reference'
-        ] = True  # we always want to use global reference if possible
+        kwargs['global_reference'] = (
+            True  # we always want to use global reference if possible
+        )
         return self.definition_reference(None, **kwargs)
 
 
diff --git a/nomad/metainfo/pylint_plugin.py b/nomad/metainfo/pylint_plugin.py
index 4d50ebd830b8d913f6551feb5ee7e202919f66ad..23c8f1b52a7592217169f3ce8eba6f9f8e48cc1d 100644
--- a/nomad/metainfo/pylint_plugin.py
+++ b/nomad/metainfo/pylint_plugin.py
@@ -16,8 +16,8 @@
 # limitations under the License.
 #
 
-""" The beginning of a pylint plugin. Unfotunately it is kinda nonsensical without a
-partnering mypy plugin. """
+"""The beginning of a pylint plugin. Unfotunately it is kinda nonsensical without a
+partnering mypy plugin."""
 
 import astroid
 from astroid import MANAGER
diff --git a/nomad/normalizing/normalizer.py b/nomad/normalizing/normalizer.py
index b95e398e34b432fca9e114d29a857780c2363352..145ec4db8e4ac00a7fecc0b64531bbd6f7d0caf5 100644
--- a/nomad/normalizing/normalizer.py
+++ b/nomad/normalizing/normalizer.py
@@ -148,9 +148,9 @@ class SystemBasedNormalizer(Normalizer, metaclass=ABCMeta):
         if scc is not None:
             self.section_run.m_cache['representative_scc_idx'] = scc.m_parent_index
         if system is not None:
-            self.section_run.m_cache[
-                'representative_system_idx'
-            ] = system.m_parent_index
+            self.section_run.m_cache['representative_system_idx'] = (
+                system.m_parent_index
+            )
 
         return system.m_resolved() if system is not None else None
 
diff --git a/nomad/normalizing/optimade.py b/nomad/normalizing/optimade.py
index 7426adea7afe28472982b4a0505e5582ae68e794..77db87723b3570041bc15c53121a6c15f0f9d218 100644
--- a/nomad/normalizing/optimade.py
+++ b/nomad/normalizing/optimade.py
@@ -83,7 +83,6 @@ def transform_to_v1(entry: EntryMetadata) -> EntryMetadata:
 
 
 class OptimadeNormalizer(SystemBasedNormalizer):
-
     """
     This normalizer performs all produces a section all data necessary for the Optimade API.
     It assumes that the :class:`SystemNormalizer` was run before.
diff --git a/nomad/normalizing/results.py b/nomad/normalizing/results.py
index 5f6f64a7ee5562a0fc2bf62c703dd0b21d30ce50..a301e1838e767b21f411e598a4a065fa23b0a651 100644
--- a/nomad/normalizing/results.py
+++ b/nomad/normalizing/results.py
@@ -679,9 +679,9 @@ class ResultsNormalizer(Normalizer):
         methods = ['dft', 'tb']
         self._resolve_workflow_gs_properties(methods, properties)
         # Resolving DMFT Greens functions
-        gfs_electronic: List[
-            GreensFunctionsElectronic
-        ] = self.electronic_properties.get('greens_functions')  # type: ignore
+        gfs_electronic: List[GreensFunctionsElectronic] = (
+            self.electronic_properties.get('greens_functions')  # type: ignore
+        )
         gfs_electronic_dmft = self.resolve_greens_functions(
             ['workflow2', 'results', 'dmft_outputs', 'greens_functions']
         )
@@ -697,9 +697,9 @@ class ResultsNormalizer(Normalizer):
         methods = ['maxent']
         self._resolve_workflow_gs_properties(methods, properties)
         # Resolving DMFT Greens functions
-        gfs_electronic: List[
-            GreensFunctionsElectronic
-        ] = self.electronic_properties.get('greens_functions')  # type: ignore
+        gfs_electronic: List[GreensFunctionsElectronic] = (
+            self.electronic_properties.get('greens_functions')  # type: ignore
+        )
         for method in ['dmft', 'maxent']:
             name = 'MaxEnt' if method == 'maxent' else method.upper()
             gfs = self.resolve_greens_functions(
diff --git a/nomad/parsing/tabular.py b/nomad/parsing/tabular.py
index 4146d8b6fba2e193f45219239a55821a15dd452b..a9e8c7087243b8bd494a78745d1c8348c0dbb47b 100644
--- a/nomad/parsing/tabular.py
+++ b/nomad/parsing/tabular.py
@@ -19,12 +19,12 @@ import os
 from typing import List, Dict, Callable, Set, Any, Tuple, Iterator, Union, Iterable
 
 import pandas as pd
-from memoization import cached
 import re
 import math
 import numpy as np
 import json
 import yaml
+from cachetools import cached, LRUCache
 
 from nomad import utils
 from nomad.parsing import MatchingParser
@@ -598,7 +598,7 @@ def _get_relative_path(section_def) -> Iterator[str]:
     )
 
 
-@cached(max_size=10)
+@cached(LRUCache(maxsize=10))
 def _create_column_to_quantity_mapping(section_def: Section):
     mapping: Dict[str, Callable[[MSection, Any], MSection]] = {}
 
diff --git a/nomad/processing/data.py b/nomad/processing/data.py
index 0ca3017748a19062c5e929a2f1f028ae417d68a2..9316abe27aecf783d413928382c6b627dee5c058 100644
--- a/nomad/processing/data.py
+++ b/nomad/processing/data.py
@@ -27,6 +27,7 @@ entries, and files
 .. autoclass:: Upload
 
 """
+
 import base64
 from typing import (
     Optional,
@@ -86,7 +87,7 @@ from nomad.files import (
     create_tmp_dir,
     is_safe_relative_path,
 )
-from nomad.groups import user_group_exists
+from nomad.groups import user_group_exists, get_group_ids
 from nomad.processing.base import (
     Proc,
     process,
@@ -339,15 +340,15 @@ class MetadataEditRequestHandler:
         self.verified_entries: Dict[
             str, Dict[str, Any]
         ] = {}  # Metadata specified for individual entries
-        self.affected_uploads: List[
-            'Upload'
-        ] = None  # A MetadataEditRequest may involve multiple uploads
+        self.affected_uploads: List['Upload'] = (
+            None  # A MetadataEditRequest may involve multiple uploads
+        )
 
         # Used when edit_request = files
         self.verified_file_metadata_cache: Dict[str, Dict[str, Any]] = {}
-        self.root_file_entries: Dict[
-            str, Dict[str, Any]
-        ] = None  # `entries` defined in the root metadata file
+        self.root_file_entries: Dict[str, Dict[str, Any]] = (
+            None  # `entries` defined in the root metadata file
+        )
 
     def validate_json_request(self):
         """Validates the provided edit_request_json."""
@@ -397,7 +398,7 @@ class MetadataEditRequestHandler:
                 return self._error('No matching upload found', 'upload_id')
 
             is_admin = self.user.is_admin
-            group_ids = self.user.get_group_ids()
+            group_ids = get_group_ids(self.user.user_id)
             for upload in self.affected_uploads:
                 is_main_author = self.user.user_id == upload.main_author
                 is_coauthor = self.user.user_id in upload.coauthors or (
@@ -1489,9 +1490,9 @@ class Entry(Proc):
                 if self._child_entries:
                     child_archives = {}
                     for child_entry in self._child_entries:
-                        child_archives[
-                            child_entry.mainfile_key
-                        ] = child_entry._parser_results
+                        child_archives[child_entry.mainfile_key] = (
+                            child_entry._parser_results
+                        )
                     kwargs = dict(child_archives=child_archives)
                 else:
                     kwargs = {}
diff --git a/ops/kubernetes/nomad/values.yaml b/ops/kubernetes/nomad/values.yaml
index 29cc9bdbce8a39098ee7909c373c4052ee1b1565..ef04f09902890b6dc6f26020856ca9867e285c4c 100644
--- a/ops/kubernetes/nomad/values.yaml
+++ b/ops/kubernetes/nomad/values.yaml
@@ -402,9 +402,12 @@ jupyterhub:
       GenericOAuthenticator:
         client_id: nomad_public
         oauth_callback_url:
-        authorize_url: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_test/protocol/openid-connect/auth
-        token_url: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_test/protocol/openid-connect/token
-        userdata_url: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_test/protocol/openid-connect/userinfo
+        authorize_url: 
+          https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_test/protocol/openid-connect/auth
+        token_url: 
+          https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_test/protocol/openid-connect/token
+        userdata_url: 
+          https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_test/protocol/openid-connect/userinfo
         login_service: keycloak
         username_key: preferred_username
         userdata_params:
diff --git a/pyproject.toml b/pyproject.toml
index 83fe39a030fd38c05735a2a9940245c8d76187f0..32bc503df5aa7483a1d44f8f16ffaff8b41055da 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -14,44 +14,43 @@ license = { text = "Apache-2.0" }
 requires-python = ">=3.9"
 
 dependencies = [
-    'numpy~=1.22.4',
-    'nptyping~=1.4.4',
-    'pandas>=1.3.5,<2.0.0',
-    'cachetools>=4.2.4',
-    'docstring-parser>=0.12',
-    'pint==0.17',
-    'orjson==3.9.4',
-    'click>=7.1.2',
-    'requests>=2.27.1',
-    'pytz>=2022.7.1',
     'aniso8601>=7.0.0',
     'ase~=3.19.0',
-    'python-keycloak>=0.26.1',
+    'bitarray>=2.3.5',
+    'cachetools>=4.2.4',
+    'click>=7.1.2',
+    'docstring-parser>=0.12',
     'elasticsearch-dsl==7.4.0',
-    'pydantic>=1.10.8,<2.0.0',
-    'jmespath>=0.10.0',
+    'h5py>=3.6.0',
+    'hjson>=3.0.2',
     'httpx>=0.23.3',
-    'memoization>=0.4.0',
-    'rfc3161ng>=2.1.3',
+    'jmespath>=0.10.0',
     'lxml>=5.2',
-    'lxml_html_clean>=0.1.0',
-    'wrapt>=1.12.1',
-    'pyyaml>=6.0',
-    'python-magic==0.4.24',
-    'hjson>=3.0.2',
-    'scipy>=1.7.1',
+    'lxml-html-clean>=0.1.0',
+    'matid>=2.0.0.dev2',
+    'mdanalysis==2.5.0',
+    'networkx==2.6.3',
+    'nptyping~=1.4.4',
+    'numpy~=1.22.4',
+    'openpyxl>=3.0.0',
+    'orjson==3.9.4',
+    'pandas>=1.3.5,<2.0.0',
     'panedr>=0.2',
     'parmed>=3.0.0',
-    'mdanalysis==2.5.0',
-    'h5py>=3.6.0',
-    'xarray>=0.20.2',
+    'pint==0.17',
+    'pydantic>=1.10.8,<2.0.0',
     'pymatgen>=2023.5.10',
-    'bitarray>=2.3.5',
+    'python-keycloak>=0.26.1',
+    'python-magic==0.4.24',
+    'pytz>=2022.7.1',
+    'pyyaml>=6.0',
+    'requests>=2.27.1',
+    'rfc3161ng>=2.1.3',
     'scikit-learn>=1.0.2',
+    'scipy>=1.7.1',
     'toposort',
-    'openpyxl>=3.0.0',
-    'networkx==2.6.3',
-    'matid>=2.0.0.dev2'
+    'wrapt>=1.12.1',
+    'xarray>=0.20.2',
 ]
 
 [project.urls]
@@ -62,88 +61,82 @@ repository = 'https://gitlab.mpcdf.mpg.de/nomad-lab/nomad-FAIR'
 [project.optional-dependencies]
 parsing = [
     'asr==0.4.1',
-    'netCDF4==1.5.4',
     'h5py==3.6.0',
-    'pyzeo==0.1.4',
-    'quippy-ase==0.9.14',
+    'netCDF4==1.5.4',
     'pybis@git+https://github.com/FAIRmat-NFDI/fairmat-pybis.git',
     'pynxtools[convert]==0.1.1',
+    'pyzeo==0.1.4',
+    'quippy-ase==0.9.14',
 ]
 infrastructure = [
-    'h5grove[fastapi]==1.3.0',
-    'optimade[mongo]==0.22.1',
-    'structlog',
-    'elasticsearch==7.17.1',
-    'msgpack',
-    'celery[redis]==5.2.7',
     'asgiref~=3.5',
-    'mongoengine>=0.20',
-    'pymongo==4.3.3',
-    'itsdangerous>=2.1.2',
-    'passlib==1.7.4',
-    'python-logstash==0.4.6',
-    'gitpython==3.1.24',
-    'm2r==0.2.1',
-    'zipstream-new==1.1.5',
     'bagit==1.8.1',
+    'basicauth==0.4.1',
     'bcrypt==3.2.0',
-    'filelock==3.3.1',
-    'pyjwt[crypto]==2.6.0',
+    'beautifulsoup4',
+    'celery',
     'cryptography',
-    'jsonschema[format]==4.17.3',
-    'runstats==2.0.0',
-    'tabulate==0.8.9',
-    'bs4==0.0.1',
+    'dockerspawner==12.1.0',
+    'elasticsearch==7.17.1',
+    'fastapi<0.100', # later versions pending pydantic v2 upgrade
+    'filelock==3.3.1',
+    'gitpython==3.1.24',
+    'gunicorn>=21.2.0,<22.0.0',
+    'h5grove[fastapi]==1.3.0',
     'html5lib==1.1',
-    'basicauth==0.4.1',
     'inflection==0.5.1',
-    'unidecode==1.3.2',
+    'itsdangerous>=2.1.2',
+    'jsonschema[format]==4.17.3',
+    'jupyterhub==4.0.2',
+    'm2r==0.2.1',
+    'mongoengine>=0.20',
+    'msgpack',
+    'oauthenticator==15.1.0',
+    'optimade[mongo]==0.22.1',
+    'passlib==1.7.4',
+    'pyjwt[crypto]==2.6.0',
     'python-json-logger==2.0.2',
-    'recommonmark==0.7.1',
+    'python-logstash==0.4.6',
+    'python-multipart',
     'rdflib==5.0.0',
-    'fastapi==0.92.0',
+    'recommonmark==0.7.1',
+    'runstats==2.0.0',
+    'structlog',
+    'tabulate==0.8.9',
+    'unidecode==1.3.2',
     'uvicorn[standard]',
-    'python-multipart==0.0.5',
-    'jupyterhub==4.0.2',
-    'dockerspawner==12.1.0',
-    'oauthenticator==15.1.0',
     'validators==0.18.2',
-    'gunicorn>=21.2.0,<22.0.0',
-    'importlib-metadata~=4.13.0' # Needed because of https://github.com/python/importlib_metadata/issues/411
+    'zipstream-new==1.1.5',
 ]
 dev = [
+    'aiosmtpd',
+    'astroid>=2.5.1',
     'build',
-    'pip-tools>=6.13.0',
+    'devtools',
+    'essential-generators==1.0',
     'markupsafe',
-    'gitpython==3.1.24',
-    'mypy>=1.0.1',
-    'typed-ast>=1.4.2',
-    'astroid>=2.5.1',
-    'pylint==2.13.9',
-    'pylint_plugin_utils==0.7',
-    'pylint_mongoengine==0.4.0',
+    'mkdocs-click',
+    'mkdocs-git-revision-date-localized-plugin',
+    'mkdocs-glightbox',
+    'mkdocs-macros-plugin',
+    'mkdocs-material-extensions',
+    'mkdocs-material',
+    'mkdocs-redirects',
+    'mkdocs',
+    'mypy==1.0.1', # bug: incompatible with derived models of pydantic v1
+    'names==0.3.0',
+    'pip-tools>=6.13.0',
     'pycodestyle==2.8.0',
-    'pytest>= 5.3.0, < 6.0.0',
-    'pytest-xdist>=1.30.0',
-    'pytest-timeout==1.4.2',
     'pytest-cov==2.7.1',
+    'pytest-timeout==1.4.2',
+    'pytest-xdist>=1.30.0',
+    'pytest>= 5.3.0, < 6.0.0',
+    'python-gitlab==2.10.1',
     'rope==0.21.0',
-    'names==0.3.0',
-    'essential_generators==1.0',
+    'ruamel.yaml',
+    'ruff',
     'twine==3.4.2',
-    'python-gitlab==2.10.1',
-    'devtools==0.8.0',
-    'mkdocs==1.3.0',
-    'mkdocs-material==8.2.8',
-    'mkdocs-material-extensions==1.3.1',
-    'mkdocs-macros-plugin==0.6.3',
-    'mkdocs-glightbox==0.3.5',
-    'aiosmtpd',
-    'mkdocs-click==0.8.0',
-    'mkdocs-redirects==1.2.0',
-    'mkdocs-git-revision-date-localized-plugin==1.2.1',
-    'ruff==0.1.8',
-    'ruamel.yaml==0.17.21'
+    'typed-ast>=1.4.2',
 ]
 
 
@@ -152,6 +145,13 @@ nomad = "nomad.cli:run_cli"
 
 [tool.ruff]
 include = ["nomad/*.py", "tests/*.py"]
+exclude = ["dependencies"]
+
+# Same as Black.
+line-length = 88
+indent-width = 4
+
+[tool.ruff.lint]
 select = [
     "E", # pycodestyle
     "W", # pycodestyle
@@ -161,7 +161,7 @@ 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
+    "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
@@ -173,11 +173,6 @@ ignore = [
     "PLR5501", # else-if-used
 ]
 fixable = ["ALL"]
-exclude = ["dependencies"]
-
-# Same as Black.
-line-length = 88
-indent-width = 4
 
 [tool.ruff.format]
 # use single quotes for strings.
diff --git a/requirements-dev.txt b/requirements-dev.txt
index c08efd6a51f02130a9ee9cb49a79740350e2a770..fc4eca75f03c69db425e31ba985efa3099b99fe2 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -2,356 +2,359 @@
 # This file is autogenerated by pip-compile with Python 3.9
 # by the following command:
 #
-#    pip-compile --annotation-style=line --extra=dev --extra=infrastructure --extra=parsing --output-file=requirements-dev.txt --pip-args='--prefer-binary' --resolver=backtracking pyproject.toml requirements.txt
+#    pip-compile --annotation-style=line --extra=dev --extra=infrastructure --extra=parsing --output-file=requirements-dev.txt --pip-args='--prefer-binary' pyproject.toml requirements.txt
 #
-aiosmtpd==1.4.4.post2     # via nomad-lab (pyproject.toml)
-alabaster==0.7.12         # via -r requirements.txt, sphinx
-alembic==1.9.1            # via -r requirements.txt, jupyterhub
-amqp==5.1.1               # via -r requirements.txt, kombu
-aniso8601==7.0.0          # via -r requirements.txt, nomad-lab (pyproject.toml)
-anyio==3.6.2              # via -r requirements.txt, httpcore, starlette, watchfiles
-arrow==1.2.3              # via -r requirements.txt, isoduration
+aiosmtpd==1.4.5           # via nomad-lab (pyproject.toml)
+alabaster==0.7.16         # via -r requirements.txt, sphinx
+alembic==1.13.1           # via -r requirements.txt, jupyterhub
+amqp==5.2.0               # via -r requirements.txt, kombu
+aniso8601==9.0.1          # via -r requirements.txt, nomad-lab (pyproject.toml)
+anyio==4.3.0              # via -r requirements.txt, httpx, starlette, watchfiles
+arrow==1.3.0              # via -r requirements.txt, isoduration
 asciitree==0.3.3          # via -r requirements.txt, zarr
-ase==3.19.0               # via -r requirements.txt, asr, ifes-apt-tc-data-modeling, matid, nomad-lab (pyproject.toml), pynxtools, quippy-ase
-asgiref==3.6.0            # via -r requirements.txt, nomad-lab (pyproject.toml)
+ase==3.19.3               # via -r requirements.txt, asr, ifes-apt-tc-data-modeling, matid, nomad-lab (pyproject.toml), pynxtools, quippy-ase
+asgiref==3.8.1            # via -r requirements.txt, nomad-lab (pyproject.toml)
 asr==0.4.1                # via -r requirements.txt, nomad-lab (pyproject.toml)
-asteval==0.9.31           # via -r requirements.txt, lmfit
-astroid==2.11.7           # via nomad-lab (pyproject.toml), pylint
-asttokens==2.1.0          # via devtools
+asteval==0.9.32           # via -r requirements.txt, lmfit
+astroid==3.1.0            # via nomad-lab (pyproject.toml)
+asttokens==2.4.1          # via -r requirements.txt, devtools, stack-data
 async-generator==1.10     # via -r requirements.txt, jupyterhub
-async-timeout==4.0.2      # via -r requirements.txt, redis
-atpublic==3.1.1           # via aiosmtpd
-attrs==22.2.0             # via -r requirements.txt, aiosmtpd, jsonschema, pytest
-babel==2.11.0             # via -r requirements.txt, mkdocs-git-revision-date-localized-plugin, sphinx
-backcall==0.2.0           # via -r requirements.txt, ipython
+atpublic==4.1.0           # via aiosmtpd
+attrs==23.2.0             # via -r requirements.txt, aiosmtpd, jsonschema, pytest
+babel==2.14.0             # via -r requirements.txt, mkdocs-git-revision-date-localized-plugin, mkdocs-material, sphinx
+backports-tarfile==1.0.0  # 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)
 bcrypt==3.2.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
-beautifulsoup4==4.11.1    # via -r requirements.txt, bs4
-billiard==3.6.4.0         # via -r requirements.txt, celery
-biopython==1.80           # via -r requirements.txt, mdanalysis
-bitarray==2.3.5           # via -r requirements.txt, nomad-lab (pyproject.toml)
-bleach==5.0.1             # via readme-renderer
-bs4==0.0.1                # via -r requirements.txt, nomad-lab (pyproject.toml)
-build==0.9.0              # via nomad-lab (pyproject.toml), pip-tools
-cachetools==4.2.4         # via -r requirements.txt, nomad-lab (pyproject.toml)
-celery[redis]==5.2.7      # via celery, nomad-lab (pyproject.toml)
-certifi==2022.12.7        # via -r requirements.txt, elasticsearch, httpcore, httpx, requests
+beautifulsoup4==4.12.3    # via -r requirements.txt, nomad-lab (pyproject.toml)
+billiard==4.2.0           # via -r requirements.txt, celery
+biopython==1.83           # via -r requirements.txt, mdanalysis
+bitarray==2.9.2           # via -r requirements.txt, nomad-lab (pyproject.toml)
+blinker==1.7.0            # via -r requirements.txt, flask
+blosc2==2.5.1             # via -r requirements.txt, tables
+build==1.2.1              # via nomad-lab (pyproject.toml), pip-tools
+cachetools==5.3.3         # via -r requirements.txt, nomad-lab (pyproject.toml)
+celery==5.3.6             # via -r requirements.txt, nomad-lab (pyproject.toml)
+certifi==2024.2.2         # via -r requirements.txt, elasticsearch, httpcore, httpx, requests
 certipy==0.1.3            # via -r requirements.txt, jupyterhub
-cffi==1.15.1              # via -r requirements.txt, bcrypt, cryptography
-cftime==1.6.2             # via -r requirements.txt, netcdf4
-charset-normalizer==2.0.12  # via -r requirements.txt, requests
-click==8.1.3              # via -r requirements.txt, asr, celery, click-didyoumean, click-plugins, click-repl, flask, mkdocs, mkdocs-click, nomad-lab (pyproject.toml), pip-tools, pynxtools, uvicorn
-click-didyoumean==0.3.0   # via -r requirements.txt, celery
+cffi==1.16.0              # via -r requirements.txt, bcrypt, cryptography
+cftime==1.6.3             # via -r requirements.txt, netcdf4
+charset-normalizer==3.3.2  # via -r requirements.txt, requests
+click==8.1.7              # via -r requirements.txt, asr, celery, click-didyoumean, click-plugins, click-repl, dask, flask, mkdocs, mkdocs-click, nomad-lab (pyproject.toml), pip-tools, pynxtools, uvicorn
+click-didyoumean==0.3.1   # via -r requirements.txt, celery
 click-plugins==1.1.1      # via -r requirements.txt, celery
-click-repl==0.2.0         # via -r requirements.txt, celery
-cloudpickle==2.2.0        # via -r requirements.txt, dask
-colorama==0.4.6           # via twine
-comm==0.1.4               # via -r requirements.txt, ipywidgets
+click-repl==0.3.0         # via -r requirements.txt, celery
+cloudpickle==3.0.0        # via -r requirements.txt, dask
+colorama==0.4.6           # via mkdocs-material, twine
+comm==0.2.2               # via -r requirements.txt, ipykernel
 commonmark==0.9.1         # via -r requirements.txt, recommonmark
-coverage==6.5.0           # via pytest-cov
-cryptography==39.0.0      # via -r requirements.txt, nomad-lab (pyproject.toml), pyjwt, pyopenssl, rfc3161ng, secretstorage
-cycler==0.11.0            # via -r requirements.txt, matplotlib
-dask[array]==2022.2.0     # via -r requirements.txt, dask, hyperspy, kikuchipy, orix, pyxem
-debugpy==1.6.5            # via -r requirements.txt, ipykernel
+contourpy==1.2.1          # via -r requirements.txt, matplotlib
+coverage==7.4.4           # via pytest-cov
+cryptography==42.0.5      # via -r requirements.txt, jwcrypto, nomad-lab (pyproject.toml), pyjwt, pyopenssl, rfc3161ng, secretstorage
+cycler==0.12.1            # via -r requirements.txt, matplotlib
+dask[array]==2024.4.1     # via -r requirements.txt, hyperspy, kikuchipy, orix, pyxem
+debugpy==1.8.1            # via -r requirements.txt, ipykernel
 decorator==5.1.1          # via -r requirements.txt, ipyparallel, ipython, validators
-devtools==0.8.0           # via nomad-lab (pyproject.toml)
+deprecation==2.1.0        # via -r requirements.txt, python-keycloak
+devtools==0.12.2          # via nomad-lab (pyproject.toml)
 diffpy-structure==3.1.0   # via -r requirements.txt, diffsims, kikuchipy, orix
 diffsims==0.5.2           # via -r requirements.txt, kikuchipy, pyxem
-dill==0.3.6               # via -r requirements.txt, hyperspy, pylint
-dnspython==2.2.1          # via -r requirements.txt, email-validator, pymongo
-docker==6.0.1             # via -r requirements.txt, dockerspawner
+dill==0.3.8               # via -r requirements.txt, hyperspy, lmfit
+dnspython==2.6.1          # via -r requirements.txt, email-validator, pymongo
+docker==7.0.0             # via -r requirements.txt, dockerspawner
 dockerspawner==12.1.0     # via -r requirements.txt, nomad-lab (pyproject.toml)
-docstring-parser==0.12    # via -r requirements.txt, nomad-lab (pyproject.toml)
-docutils==0.19            # via -r requirements.txt, m2r, readme-renderer, recommonmark, sphinx
-ecdsa==0.18.0             # via -r requirements.txt, python-jose
+docstring-parser==0.16    # via -r requirements.txt, nomad-lab (pyproject.toml)
+docutils==0.20.1          # via -r requirements.txt, m2r, readme-renderer, recommonmark, sphinx
 elasticsearch==7.17.1     # via -r requirements.txt, elasticsearch-dsl, nomad-lab (pyproject.toml)
 elasticsearch-dsl==7.4.0  # via -r requirements.txt, nomad-lab (pyproject.toml)
-email-validator==1.3.0    # via -r requirements.txt, optimade
-entrypoints==0.4          # via -r requirements.txt, ipyparallel, jupyter-client, numcodecs
+email-validator==1.3.1    # via -r requirements.txt, optimade
+entrypoints==0.4          # via -r requirements.txt, ipyparallel
 escapism==1.0.1           # via -r requirements.txt, dockerspawner
 essential-generators==1.0  # via nomad-lab (pyproject.toml)
 et-xmlfile==1.1.0         # via -r requirements.txt, openpyxl
-execnet==1.9.0            # via pytest-xdist
-executing==0.10.0         # via devtools
+exceptiongroup==1.2.0     # via -r requirements.txt, anyio, ipython
+execnet==2.1.1            # via pytest-xdist
+executing==2.0.1          # via -r requirements.txt, devtools, stack-data
 f90wrap==0.2.13           # via -r requirements.txt, quippy-ase
-fabio==2023.6.0           # via -r requirements.txt, pyfai, silx
-fastapi==0.92.0           # via -r requirements.txt, h5grove, nomad-lab (pyproject.toml)
-fasteners==0.18           # via -r requirements.txt, mdanalysis, zarr
+fabio==2023.10.0          # via -r requirements.txt, pyfai, silx
+fastapi==0.99.1           # via -r requirements.txt, h5grove, nomad-lab (pyproject.toml)
+fasteners==0.19           # via -r requirements.txt, mdanalysis, zarr
 filelock==3.3.1           # via -r requirements.txt, nomad-lab (pyproject.toml)
 findiff==0.10.0           # via -r requirements.txt, pynxtools-stm
-flask==2.2.2              # via -r requirements.txt, asr
+flask==3.0.3              # via -r requirements.txt, asr
 flatdict==4.0.1           # via -r requirements.txt, pynxtools
-fonttools==4.38.0         # via -r requirements.txt, matplotlib
+fonttools==4.51.0         # via -r requirements.txt, matplotlib
 fqdn==1.5.1               # via -r requirements.txt, jsonschema
-fsspec==2022.11.0         # via -r requirements.txt, dask, hyperspy
-future==0.18.2            # via -r requirements.txt, uncertainties
+fsspec==2024.3.1          # via -r requirements.txt, dask, hyperspy
+future==1.0.0             # via -r requirements.txt, uncertainties
 ghp-import==2.1.0         # via mkdocs
-gitdb==4.0.10             # via -r requirements.txt, gitpython
+gitdb==4.0.11             # via -r requirements.txt, gitpython
 gitpython==3.1.24         # via -r requirements.txt, mkdocs-git-revision-date-localized-plugin, nomad-lab (pyproject.toml), pynxtools
-greenlet==2.0.1           # via -r requirements.txt, sqlalchemy
-griddataformats==0.7.0    # via -r requirements.txt, mdanalysis
-gsd==2.7.0                # via -r requirements.txt, mdanalysis
+greenlet==3.0.3           # via -r requirements.txt, sqlalchemy
+griddataformats==1.0.2    # via -r requirements.txt, mdanalysis
+gsd==3.2.1                # via -r requirements.txt, mdanalysis
 gunicorn==21.2.0          # via -r requirements.txt, nomad-lab (pyproject.toml)
 h11==0.14.0               # via -r requirements.txt, httpcore, uvicorn
-h5grove[fastapi]==1.3.0   # via h5grove, nomad-lab (pyproject.toml)
-h5py==3.6.0               # via -r requirements.txt, h5grove, hyperspy, ifes-apt-tc-data-modeling, kikuchipy, nionswift, nomad-lab (pyproject.toml), orix, phonopy, pyfai, pynxtools, pynxtools-mpes, pynxtools-xps, silx
-hjson==3.0.2              # via -r requirements.txt, nomad-lab (pyproject.toml)
+h5grove[fastapi]==1.3.0   # via -r requirements.txt, nomad-lab (pyproject.toml)
+h5py==3.6.0               # via -r requirements.txt, fabio, h5grove, hdf5plugin, hyperspy, ifes-apt-tc-data-modeling, kikuchipy, nionswift, nomad-lab (pyproject.toml), orix, phonopy, pyfai, pynxtools, pynxtools-mpes, pynxtools-xps, pyxem, silx
+hdf5plugin==4.4.0         # via -r requirements.txt, fabio
+hjson==3.1.0              # via -r requirements.txt, nomad-lab (pyproject.toml)
 html5lib==1.1             # via -r requirements.txt, nomad-lab (pyproject.toml)
-httpcore==0.16.3          # via -r requirements.txt, httpx
-httptools==0.5.0          # via -r requirements.txt, uvicorn
-httpx==0.23.3             # via -r requirements.txt, nomad-lab (pyproject.toml)
-hyperspy==1.7.5           # via -r requirements.txt, kikuchipy, pynxtools, pyxem
-idna==3.4                 # via -r requirements.txt, anyio, email-validator, jsonschema, requests, rfc3986
-ifes-apt-tc-data-modeling==0.0.9  # via -r requirements.txt, pynxtools
-imageio==2.24.0           # via -r requirements.txt, hyperspy, kikuchipy, nionswift, nionswift-io, nionui, scikit-image
+httpcore==1.0.5           # via -r requirements.txt, httpx
+httptools==0.6.1          # via -r requirements.txt, uvicorn
+httpx==0.27.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
+hyperspy==1.7.6           # via -r requirements.txt, kikuchipy, pynxtools, pyxem
+idna==3.6                 # via -r requirements.txt, anyio, email-validator, httpx, jsonschema, requests
+ifes-apt-tc-data-modeling==0.1  # via -r requirements.txt, pynxtools
+imageio==2.27.0           # via -r requirements.txt, hyperspy, kikuchipy, nionswift, nionswift-io, nionui, scikit-image
 imagesize==1.4.1          # via -r requirements.txt, sphinx
-importlib-metadata==4.13.0  # via -r requirements.txt, flask, hyperspy, jupyterhub, keyring, markdown, mkdocs, nomad-lab (pyproject.toml), pynxtools, sphinx, twine
+importlib-metadata==7.1.0  # via -r requirements.txt, build, dask, flask, hyperspy, jupyter-client, jupyterhub, keyring, markdown, mkdocs, pynxtools, sphinx, twine
+importlib-resources==6.4.0  # via -r requirements.txt, matplotlib
 inflection==0.5.1         # via -r requirements.txt, nomad-lab (pyproject.toml)
-ipykernel==6.16.2         # via -r requirements.txt, ipyparallel
-ipyparallel==8.4.1        # via -r requirements.txt, hyperspy
-ipython==7.34.0           # via -r requirements.txt, hyperspy, ipykernel, ipyparallel, ipywidgets, pynxtools-stm
-ipywidgets==8.1.1         # via -r requirements.txt, pyxem
+ipykernel==6.29.4         # via -r requirements.txt, ipyparallel
+ipyparallel==8.8.0        # via -r requirements.txt, hyperspy
+ipython==8.18.1           # via -r requirements.txt, hyperspy, ipykernel, ipyparallel, pynxtools-stm
 isodate==0.6.1            # via -r requirements.txt, rdflib
 isoduration==20.11.0      # via -r requirements.txt, jsonschema
-isort==4.3.21             # via pylint
 itsdangerous==2.1.2       # via -r requirements.txt, flask, nomad-lab (pyproject.toml)
-jaraco-classes==3.2.3     # via keyring
-jedi==0.18.2              # via -r requirements.txt, ipython
+jaraco-classes==3.4.0     # via keyring
+jaraco-context==5.3.0     # via keyring
+jaraco-functools==4.0.0   # via keyring
+jedi==0.19.1              # via -r requirements.txt, ipython
 jeepney==0.8.0            # via keyring, secretstorage
-jinja2==3.0.3             # via -r requirements.txt, flask, hyperspy, jupyterhub, mkdocs, mkdocs-macros-plugin, mkdocs-material, sphinx
-jmespath==0.10.0          # via -r requirements.txt, nomad-lab (pyproject.toml)
-joblib==1.1.0             # via -r requirements.txt, mdanalysis, pymatgen, scikit-learn
-jsonpointer==2.3          # via -r requirements.txt, jsonschema
-jsonschema[format]==4.17.3  # via jsonschema, jupyter-telemetry, nomad-lab (pyproject.toml), oauthenticator
-jupyter-client==7.4.8     # via -r requirements.txt, ipykernel, ipyparallel
-jupyter-core==4.12.0      # via -r requirements.txt, jupyter-client
+jinja2==3.1.3             # via -r requirements.txt, flask, hyperspy, jupyterhub, mkdocs, mkdocs-macros-plugin, mkdocs-material, sphinx
+jmespath==1.0.1           # via -r requirements.txt, nomad-lab (pyproject.toml)
+joblib==1.4.0             # via -r requirements.txt, mdanalysis, pymatgen, scikit-learn
+jsonpointer==2.4          # via -r requirements.txt, jsonschema
+jsonschema[format]==4.17.3  # via -r requirements.txt, jupyter-telemetry, nomad-lab (pyproject.toml), oauthenticator
+jupyter-client==8.6.1     # via -r requirements.txt, ipykernel, ipyparallel
+jupyter-core==5.7.2       # via -r requirements.txt, ipykernel, jupyter-client
 jupyter-telemetry==0.1.0  # via -r requirements.txt, jupyterhub
 jupyterhub==4.0.2         # via -r requirements.txt, dockerspawner, nomad-lab (pyproject.toml), oauthenticator
-jupyterlab-widgets==3.0.9  # via -r requirements.txt, ipywidgets
-keyring==23.11.0          # via twine
-kikuchipy==0.8.7          # via -r requirements.txt, pynxtools
-kiwisolver==1.4.4         # via -r requirements.txt, matplotlib
-kombu==5.2.4              # via -r requirements.txt, celery
-lark==1.1.5               # via -r requirements.txt, optimade
-latexcodec==2.0.1         # via -r requirements.txt, pybtex
-lazy-object-proxy==1.9.0  # via astroid
-llvmlite==0.39.1          # via -r requirements.txt, numba
-lmfit==1.2.2              # via -r requirements.txt, pyxem
+jwcrypto==1.5.6           # via -r requirements.txt, python-keycloak
+keyring==25.1.0           # via twine
+kikuchipy==0.9.0          # via -r requirements.txt, pynxtools
+kiwisolver==1.4.5         # via -r requirements.txt, matplotlib
+kombu==5.3.6              # via -r requirements.txt, celery
+lark==1.1.9               # via -r requirements.txt, optimade
+latexcodec==3.0.0         # via -r requirements.txt, pybtex
+llvmlite==0.42.0          # via -r requirements.txt, numba
+lmfit==1.3.0              # via -r requirements.txt, pyxem
 locket==1.0.0             # via -r requirements.txt, partd
-lxml==5.2.0               # via -r requirements.txt, lxml-html-clean, nomad-lab (pyproject.toml)
-lxml-html-clean==0.1.0    # via -r requirements.txt, nomad-lab (pyproject.toml)
+lxml==5.2.1               # via -r requirements.txt, fabio, lxml-html-clean, nomad-lab (pyproject.toml)
+lxml-html-clean==0.1.1    # via -r requirements.txt, nomad-lab (pyproject.toml)
 m2r==0.2.1                # via -r requirements.txt, nomad-lab (pyproject.toml)
-mako==1.2.4               # via -r requirements.txt, alembic
-markdown==3.4.1           # via mkdocs, mkdocs-click, mkdocs-material, pymdown-extensions
-markupsafe==2.1.1         # via -r requirements.txt, jinja2, mako, nomad-lab (pyproject.toml), werkzeug
+mako==1.3.2               # via -r requirements.txt, alembic
+markdown==3.6             # via mkdocs, mkdocs-click, mkdocs-material, pymdown-extensions
+markupsafe==2.1.5         # via -r requirements.txt, jinja2, mako, mkdocs, nomad-lab (pyproject.toml), werkzeug
 matid==2.0.0.dev2         # via -r requirements.txt, nomad-lab (pyproject.toml)
-matplotlib==3.5.3         # via -r requirements.txt, ase, asr, diffsims, hyperspy, kikuchipy, matplotlib-scalebar, mdanalysis, orix, phonopy, pyfai, pymatgen, pyxem, radioactivedecay
+matplotlib==3.8.4         # via -r requirements.txt, ase, asr, diffsims, hyperspy, kikuchipy, matplotlib-scalebar, mdanalysis, orix, phonopy, pyfai, pymatgen, pyxem, radioactivedecay
 matplotlib-inline==0.1.6  # via -r requirements.txt, ipykernel, ipython
 matplotlib-scalebar==0.8.1  # via -r requirements.txt, orix
-mccabe==0.6.1             # via pylint
+mda-xdrlib==0.2.0         # via -r requirements.txt, pyedr
 mdanalysis==2.5.0         # via -r requirements.txt, nomad-lab (pyproject.toml)
-memoization==0.4.0        # via -r requirements.txt, nomad-lab (pyproject.toml)
 mergedeep==1.3.4          # via -r requirements.txt, mkdocs, pynxtools
-mistune==2.0.4            # via -r requirements.txt, m2r
-mkdocs==1.3.0             # via mkdocs-git-revision-date-localized-plugin, mkdocs-macros-plugin, mkdocs-material, mkdocs-redirects, nomad-lab (pyproject.toml)
-mkdocs-click==0.8.0       # via nomad-lab (pyproject.toml)
-mkdocs-git-revision-date-localized-plugin==1.2.1  # via nomad-lab (pyproject.toml)
-mkdocs-glightbox==0.3.5   # via nomad-lab (pyproject.toml)
-mkdocs-macros-plugin==0.6.3  # via nomad-lab (pyproject.toml)
-mkdocs-material==8.2.8    # via nomad-lab (pyproject.toml)
+mistune==3.0.2            # via -r requirements.txt, m2r
+mkdocs==1.5.3             # via mkdocs-git-revision-date-localized-plugin, mkdocs-macros-plugin, mkdocs-material, mkdocs-redirects, nomad-lab (pyproject.toml)
+mkdocs-click==0.8.1       # via nomad-lab (pyproject.toml)
+mkdocs-git-revision-date-localized-plugin==1.2.4  # via nomad-lab (pyproject.toml)
+mkdocs-glightbox==0.3.7   # via nomad-lab (pyproject.toml)
+mkdocs-macros-plugin==1.0.5  # via nomad-lab (pyproject.toml)
+mkdocs-material==9.5.17   # via nomad-lab (pyproject.toml)
 mkdocs-material-extensions==1.3.1  # via mkdocs-material, nomad-lab (pyproject.toml)
-mkdocs-redirects==1.2.0   # via nomad-lab (pyproject.toml)
+mkdocs-redirects==1.2.1   # via nomad-lab (pyproject.toml)
 mmtf-python==1.1.3        # via -r requirements.txt, mdanalysis
-mongoengine==0.25.0       # via -r requirements.txt, nomad-lab (pyproject.toml)
+mongoengine==0.28.2       # via -r requirements.txt, nomad-lab (pyproject.toml)
 mongomock==4.1.2          # via -r requirements.txt, optimade
-monty==2022.9.9           # via -r requirements.txt, pymatgen
-more-itertools==9.0.0     # via jaraco-classes, pytest
-mpmath==1.2.1             # via -r requirements.txt, sympy
-mrcfile==1.4.3            # via -r requirements.txt, griddataformats
-msgpack==1.0.4            # via -r requirements.txt, mmtf-python, nomad-lab (pyproject.toml)
+monty==2024.3.31          # via -r requirements.txt, pymatgen
+more-itertools==10.2.0    # via jaraco-classes, jaraco-functools, pytest
+mpmath==1.3.0             # via -r requirements.txt, sympy
+mrcfile==1.5.0            # via -r requirements.txt, griddataformats
+msgpack==1.0.8            # via -r requirements.txt, blosc2, mmtf-python, nomad-lab (pyproject.toml)
 mypy==1.0.1               # via nomad-lab (pyproject.toml)
-mypy-extensions==0.4.3    # via mypy
+mypy-extensions==1.0.0    # via mypy
 names==0.3.0              # via nomad-lab (pyproject.toml)
-natsort==8.2.0            # via -r requirements.txt, hyperspy
-nest-asyncio==1.5.6       # via -r requirements.txt, ipykernel, jupyter-client
+natsort==8.4.0            # via -r requirements.txt, hyperspy
+ndindex==1.8              # via -r requirements.txt, blosc2
+nest-asyncio==1.6.0       # via -r requirements.txt, ipykernel
 netcdf4==1.5.4            # via -r requirements.txt, nomad-lab (pyproject.toml)
 networkx==2.6.3           # via -r requirements.txt, matid, mdanalysis, nomad-lab (pyproject.toml), pymatgen, radioactivedecay, scikit-image
+nh3==0.2.17               # via readme-renderer
 niondata==0.15.5          # via -r requirements.txt, nionswift, nionswift-io
 nionswift==0.16.8         # via -r requirements.txt, pynxtools
 nionswift-io==0.15.1      # via -r requirements.txt, nionswift
 nionui==0.6.11            # via -r requirements.txt, nionswift
-nionutils==0.4.8          # via -r requirements.txt, niondata, nionswift, nionswift-io, nionui
+nionutils==0.4.10         # via -r requirements.txt, niondata, nionswift, nionswift-io, nionui
 nptyping==1.4.4           # via -r requirements.txt, nomad-lab (pyproject.toml)
-numba==0.56.4             # via -r requirements.txt, diffsims, hyperspy, kikuchipy, orix, pyxem, sparse
-numcodecs==0.10.2         # via -r requirements.txt, zarr
-numexpr==2.8.4            # via -r requirements.txt, hyperspy, pyfai
-numpy==1.22.4             # via -r requirements.txt, ase, biopython, cftime, dask, diffsims, f90wrap, fabio, findiff, griddataformats, gsd, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, mrcfile, netcdf4, niondata, nionswift, nionswift-io, nionui, nomad-lab (pyproject.toml), nptyping, numba, numcodecs, numexpr, numpy-quaternion, orix, pandas, phonopy, pyfai, pymatgen, pynxtools, pywavelets, pyxem, quippy-ase, radioactivedecay, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tifffile, xarray, zarr
-numpy-quaternion==2022.4.3  # via -r requirements.txt, orix
+numba==0.59.1             # via -r requirements.txt, diffsims, hyperspy, kikuchipy, orix, pyxem, sparse
+numcodecs==0.12.1         # via -r requirements.txt, zarr
+numexpr==2.10.0           # via -r requirements.txt, hyperspy, pyfai, pyxem, tables
+numpy==1.22.4             # via -r requirements.txt, ase, biopython, blosc2, cftime, contourpy, dask, diffsims, f90wrap, fabio, findiff, griddataformats, gsd, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, mrcfile, netcdf4, niondata, nionswift, nionswift-io, nionui, nomad-lab (pyproject.toml), nptyping, numba, numcodecs, numexpr, numpy-quaternion, orix, pandas, phonopy, pyedr, pyfai, pymatgen, pynxtools, pywavelets, pyxem, quippy-ase, radioactivedecay, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tables, tifffile, xarray, zarr
+numpy-quaternion==2023.0.3  # via -r requirements.txt, orix
 oauthenticator==15.1.0    # via -r requirements.txt, nomad-lab (pyproject.toml)
 oauthlib==3.2.2           # via -r requirements.txt, jupyterhub
 openpyxl==3.1.2           # via -r requirements.txt, nomad-lab (pyproject.toml)
-optimade[mongo]==0.22.1   # via nomad-lab (pyproject.toml), optimade
+optimade[mongo]==0.22.1   # via -r requirements.txt, nomad-lab (pyproject.toml)
 orix==0.11.1              # via -r requirements.txt, diffsims, kikuchipy, pyxem
 orjson==3.9.4             # via -r requirements.txt, h5grove, nomad-lab (pyproject.toml)
-packaging==23.0           # via -r requirements.txt, build, dask, docker, gunicorn, hyperspy, ipykernel, jupyterhub, matplotlib, mdanalysis, mkdocs, mongomock, pint, pooch, pytest, scikit-image, sphinx
-palettable==3.3.0         # via -r requirements.txt, pymatgen
-pamela==1.0.0             # via -r requirements.txt, jupyterhub
-pandas==1.3.5             # via -r requirements.txt, ifes-apt-tc-data-modeling, nomad-lab (pyproject.toml), panedr, pybis, pymatgen, pynxtools, xarray
-panedr==0.2               # via -r requirements.txt, nomad-lab (pyproject.toml)
-parmed==3.0.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
-parso==0.8.3              # via -r requirements.txt, jedi
-partd==1.3.0              # via -r requirements.txt, dask
+packaging==24.0           # via -r requirements.txt, build, dask, deprecation, docker, gunicorn, hyperspy, ipykernel, jupyterhub, matplotlib, mdanalysis, mkdocs, mongomock, pint, plotly, pooch, pytest, scikit-image, silx, sphinx, tables, xarray
+paginate==0.5.6           # via mkdocs-material
+palettable==3.3.3         # via -r requirements.txt, pymatgen
+pamela==1.1.0             # via -r requirements.txt, jupyterhub
+pandas==1.5.3             # via -r requirements.txt, ifes-apt-tc-data-modeling, nomad-lab (pyproject.toml), panedr, pybis, pymatgen, pynxtools, xarray
+panedr==0.8.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
+parmed==4.2.2             # via -r requirements.txt, nomad-lab (pyproject.toml)
+parso==0.8.4              # via -r requirements.txt, jedi
+partd==1.4.1              # via -r requirements.txt, dask
 passlib==1.7.4            # via -r requirements.txt, nomad-lab (pyproject.toml)
-pep517==0.13.0            # via build
-pexpect==4.8.0            # via -r requirements.txt, ipython
-phonopy==2.11.0           # via -r requirements.txt, asr
-pickleshare==0.7.5        # via -r requirements.txt, ipython
-pillow==9.4.0             # via -r requirements.txt, imageio, matplotlib, nionswift, scikit-image
+pathspec==0.12.1          # via mkdocs
+pexpect==4.9.0            # via -r requirements.txt, ipython
+phonopy==2.9.1            # via -r requirements.txt, asr
+pillow==10.0.1            # via -r requirements.txt, fabio, hyperspy, imageio, matplotlib, nionswift, scikit-image
 pint==0.17                # via -r requirements.txt, hyperspy, nomad-lab (pyproject.toml)
-pip-tools==6.13.0         # via nomad-lab (pyproject.toml)
-pkginfo==1.8.3            # via twine
-platformdirs==3.1.1       # via -r requirements.txt, pooch, pylint
-plotly==5.11.0            # via -r requirements.txt, asr, pymatgen
+pip-tools==7.4.1          # via nomad-lab (pyproject.toml)
+pkginfo==1.10.0           # via twine
+platformdirs==4.2.0       # via -r requirements.txt, jupyter-core, mkdocs, pooch
+plotly==5.20.0            # via -r requirements.txt, asr, pymatgen
 pluggy==0.13.1            # via pytest
-pooch==1.7.0              # via -r requirements.txt, kikuchipy, orix
-prettytable==3.6.0        # via -r requirements.txt, hyperspy
-prometheus-client==0.15.0  # via -r requirements.txt, jupyterhub
-prompt-toolkit==3.0.36    # via -r requirements.txt, click-repl, ipython
-psutil==5.9.4             # via -r requirements.txt, diffsims, ipykernel, ipyparallel, pyxem
+pooch==1.8.1              # via -r requirements.txt, kikuchipy, orix
+prettytable==3.10.0       # via -r requirements.txt, hyperspy
+prometheus-client==0.20.0  # via -r requirements.txt, jupyterhub
+prompt-toolkit==3.0.43    # via -r requirements.txt, click-repl, ipython
+psutil==5.9.8             # via -r requirements.txt, diffsims, ipykernel, ipyparallel, pyxem
 ptyprocess==0.7.0         # via -r requirements.txt, pexpect
+pure-eval==0.2.2          # via -r requirements.txt, stack-data
 py==1.11.0                # via pytest, pytest-forked
-pyasn1==0.4.8             # via -r requirements.txt, pyasn1-modules, python-jose, rfc3161ng, rsa
-pyasn1-modules==0.2.8     # via -r requirements.txt, rfc3161ng
+py-cpuinfo==9.0.0         # via -r requirements.txt, blosc2, tables
+pyasn1==0.6.0             # via -r requirements.txt, pyasn1-modules, rfc3161ng
+pyasn1-modules==0.4.0     # via -r requirements.txt, rfc3161ng
 pybis @ git+https://github.com/FAIRmat-NFDI/fairmat-pybis.git  # via -r requirements.txt, nomad-lab (pyproject.toml)
 pybtex==0.24.0            # via -r requirements.txt, pymatgen
 pycifrw==4.4.5            # via -r requirements.txt, diffpy-structure
 pycodestyle==2.8.0        # via nomad-lab (pyproject.toml)
-pycparser==2.21           # via -r requirements.txt, cffi
-pydantic==1.10.9          # via -r requirements.txt, fastapi, nomad-lab (pyproject.toml), optimade
-pyfai==2023.9.0           # via -r requirements.txt, pyxem
-pygments==2.14.0          # via -r requirements.txt, ipython, mkdocs-material, readme-renderer, sphinx
-pyjwt[crypto]==2.6.0      # via nomad-lab (pyproject.toml), pyjwt
-pylint==2.13.9            # via nomad-lab (pyproject.toml), pylint-mongoengine, pylint-plugin-utils
-pylint-mongoengine==0.4.0  # via nomad-lab (pyproject.toml)
-pylint-plugin-utils==0.7  # via nomad-lab (pyproject.toml), pylint-mongoengine
+pycparser==2.22           # via -r requirements.txt, cffi
+pydantic==1.10.15         # via -r requirements.txt, fastapi, nomad-lab (pyproject.toml), optimade
+pyedr==0.8.0              # via -r requirements.txt, panedr
+pyfai==2024.2.0           # via -r requirements.txt, pyxem
+pygments==2.17.2          # via -r requirements.txt, devtools, ipython, mkdocs-material, readme-renderer, sphinx
+pyjwt[crypto]==2.6.0      # via -r requirements.txt, nomad-lab (pyproject.toml)
 pymatgen==2023.9.25       # via -r requirements.txt, asr, nomad-lab (pyproject.toml)
-pymdown-extensions==9.7   # via mkdocs-material
-pymongo==4.3.3            # via -r requirements.txt, mongoengine, nomad-lab (pyproject.toml), optimade
-pynxtools[convert,mpes,stm,xps]==0.1.1  # via nomad-lab (pyproject.toml), pynxtools, pynxtools-mpes, pynxtools-stm, pynxtools-xps
-pynxtools-mpes==0.0.1     # via -r requirements.txt, pynxtools
+pymdown-extensions==10.7.1  # via mkdocs-material
+pymongo==4.6.3            # via -r requirements.txt, mongoengine, optimade
+pynxtools[convert,mpes,stm,xps]==0.1.1  # via -r requirements.txt, nomad-lab (pyproject.toml), pynxtools-mpes, pynxtools-stm, pynxtools-xps
+pynxtools-mpes==0.0.3     # via -r requirements.txt, pynxtools
 pynxtools-stm==1.0.1      # via -r requirements.txt, pynxtools
 pynxtools-xps==0.0.3      # via -r requirements.txt, pynxtools
-pyopenssl==23.0.0         # via -r requirements.txt, certipy
-pyparsing==3.0.9          # via -r requirements.txt, matplotlib, rdflib
-pyrsistent==0.19.3        # via -r requirements.txt, jsonschema
+pyopenssl==24.1.0         # via -r requirements.txt, certipy
+pyparsing==3.1.2          # via -r requirements.txt, matplotlib, rdflib
+pyproject-hooks==1.0.0    # via build, pip-tools
+pyrsistent==0.20.0        # via -r requirements.txt, jsonschema
 pytest==5.4.3             # via nomad-lab (pyproject.toml), pytest-cov, pytest-forked, pytest-timeout, pytest-xdist
 pytest-cov==2.7.1         # via nomad-lab (pyproject.toml)
 pytest-forked==1.6.0      # via pytest-xdist
 pytest-timeout==1.4.2     # via nomad-lab (pyproject.toml)
 pytest-xdist==1.34.0      # via nomad-lab (pyproject.toml)
-python-dateutil==2.8.2    # via -r requirements.txt, arrow, elasticsearch-dsl, ghp-import, hyperspy, ipyparallel, jupyter-client, jupyterhub, matplotlib, mkdocs-macros-plugin, pandas, pybis, rfc3161ng
-python-dotenv==0.21.0     # via -r requirements.txt, uvicorn
+python-dateutil==2.9.0.post0  # via -r requirements.txt, arrow, celery, elasticsearch-dsl, ghp-import, hyperspy, ipyparallel, jupyter-client, jupyterhub, matplotlib, mkdocs-macros-plugin, pandas, pybis, rfc3161ng
+python-dotenv==1.0.1      # via -r requirements.txt, uvicorn
 python-gitlab==2.10.1     # via nomad-lab (pyproject.toml)
-python-jose==3.3.0        # via -r requirements.txt, python-keycloak
 python-json-logger==2.0.2  # via -r requirements.txt, jupyter-telemetry, nomad-lab (pyproject.toml)
-python-keycloak==0.26.1   # via -r requirements.txt, nomad-lab (pyproject.toml)
+python-keycloak==3.11.1   # 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-multipart==0.0.5   # via -r requirements.txt, nomad-lab (pyproject.toml)
-pytz==2022.7.1            # via -r requirements.txt, babel, celery, mkdocs-git-revision-date-localized-plugin, nionswift, nomad-lab (pyproject.toml), pandas, pynxtools
+python-multipart==0.0.9   # via -r requirements.txt, nomad-lab (pyproject.toml)
+pytz==2024.1              # via -r requirements.txt, mkdocs-git-revision-date-localized-plugin, nionswift, nomad-lab (pyproject.toml), pandas, pynxtools
 pytz-deprecation-shim==0.1.0.post0  # via -r requirements.txt, tzlocal
-pywavelets==1.3.0         # via -r requirements.txt, scikit-image
-pyxem==0.15.1             # via -r requirements.txt, pynxtools
-pyyaml==6.0               # via -r requirements.txt, dask, hyperspy, kikuchipy, mkdocs, mkdocs-macros-plugin, nomad-lab (pyproject.toml), phonopy, pybtex, pynxtools, pynxtools-mpes, pyyaml-env-tag, uvicorn
+pywavelets==1.6.0         # via -r requirements.txt, scikit-image
+pyxem==0.16.0             # via -r requirements.txt, pynxtools
+pyyaml==6.0.1             # via -r requirements.txt, dask, hyperspy, kikuchipy, mkdocs, mkdocs-macros-plugin, nomad-lab (pyproject.toml), phonopy, pybtex, pymdown-extensions, pynxtools, pynxtools-mpes, pyyaml-env-tag, uvicorn
 pyyaml-env-tag==0.1       # via mkdocs
 pyzeo==0.1.4              # via -r requirements.txt, nomad-lab (pyproject.toml)
-pyzmq==25.0.0             # via -r requirements.txt, ipykernel, ipyparallel, jupyter-client
+pyzmq==25.1.2             # via -r requirements.txt, ipykernel, ipyparallel, jupyter-client
 quippy-ase==0.9.14        # via -r requirements.txt, nomad-lab (pyproject.toml)
-radioactivedecay==0.4.17  # via -r requirements.txt, ifes-apt-tc-data-modeling
+radioactivedecay==0.4.22  # via -r requirements.txt, ifes-apt-tc-data-modeling
 rdflib==5.0.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
-readme-renderer==37.3     # via twine
+readme-renderer==43.0     # via twine
 recommonmark==0.7.1       # via -r requirements.txt, nomad-lab (pyproject.toml)
-redis==4.4.2              # via -r requirements.txt, celery
-requests==2.28.2          # via -r requirements.txt, docker, hyperspy, jupyterhub, nomad-lab (pyproject.toml), oauthenticator, optimade, pooch, pybis, pymatgen, python-gitlab, python-keycloak, requests-toolbelt, rfc3161ng, sphinx, twine
-requests-toolbelt==0.10.1  # via python-gitlab, twine
+regex==2023.12.25         # via mkdocs-material
+requests==2.31.0          # via -r requirements.txt, docker, hyperspy, jupyterhub, mkdocs-material, nomad-lab (pyproject.toml), oauthenticator, optimade, pooch, pybis, pymatgen, python-gitlab, python-keycloak, requests-toolbelt, rfc3161ng, sphinx, twine
+requests-toolbelt==1.0.0  # via -r requirements.txt, python-gitlab, python-keycloak, twine
 rfc3161ng==2.1.3          # via -r requirements.txt, nomad-lab (pyproject.toml)
 rfc3339-validator==0.1.4  # via -r requirements.txt, jsonschema
-rfc3986[idna2008]==1.5.0  # via -r requirements.txt, httpx, rfc3986, twine
+rfc3986==2.0.0            # via twine
 rfc3987==1.3.8            # via -r requirements.txt, jsonschema
 rope==0.21.0              # via nomad-lab (pyproject.toml)
-rsa==4.9                  # via -r requirements.txt, python-jose
-ruamel-yaml==0.17.21      # via -r requirements.txt, jupyter-telemetry, nomad-lab (pyproject.toml), oauthenticator, pymatgen
-ruamel-yaml-clib==0.2.7   # via -r requirements.txt, ruamel-yaml
-ruff==0.1.8               # via nomad-lab (pyproject.toml)
+ruamel-yaml==0.18.6       # via -r requirements.txt, jupyter-telemetry, nomad-lab (pyproject.toml), oauthenticator, pymatgen
+ruamel-yaml-clib==0.2.8   # via -r requirements.txt, ruamel-yaml
+ruff==0.3.5               # via nomad-lab (pyproject.toml)
 runstats==2.0.0           # via -r requirements.txt, nomad-lab (pyproject.toml)
 scikit-image==0.19.3      # via -r requirements.txt, hyperspy, kikuchipy, pyxem
-scikit-learn==1.0.2       # via -r requirements.txt, kikuchipy, matid, nomad-lab (pyproject.toml), pyxem
-scipy==1.7.1              # via -r requirements.txt, ase, diffsims, findiff, griddataformats, hyperspy, kikuchipy, lmfit, matid, mdanalysis, niondata, nionswift, nomad-lab (pyproject.toml), orix, pyfai, pymatgen, pynxtools, pyxem, radioactivedecay, scikit-image, scikit-learn, sparse
+scikit-learn==1.4.2       # via -r requirements.txt, kikuchipy, matid, nomad-lab (pyproject.toml), pyxem
+scipy==1.13.0             # via -r requirements.txt, ase, diffsims, findiff, griddataformats, hyperspy, kikuchipy, lmfit, matid, mdanalysis, niondata, nionswift, nomad-lab (pyproject.toml), orix, pyfai, pymatgen, pynxtools, pyxem, radioactivedecay, scikit-image, scikit-learn, sparse
 secretstorage==3.3.3      # via keyring
 sentinels==1.0.0          # via -r requirements.txt, mongomock
-silx==1.1.2               # via -r requirements.txt, pyfai
-six==1.16.0               # via -r requirements.txt, asttokens, basicauth, bcrypt, bleach, click-repl, diffpy-structure, ecdsa, elasticsearch-dsl, griddataformats, html5lib, isodate, latexcodec, pybtex, pytest-xdist, python-dateutil, python-multipart, rdflib, rfc3339-validator, validators
-smmap==5.0.0              # via -r requirements.txt, gitdb
-sniffio==1.3.0            # via -r requirements.txt, anyio, httpcore, httpx
+silx==2.0.1               # via -r requirements.txt, pyfai
+six==1.16.0               # via -r requirements.txt, asttokens, basicauth, bcrypt, diffpy-structure, elasticsearch-dsl, html5lib, isodate, pybtex, pytest-xdist, python-dateutil, rdflib, rfc3339-validator, validators
+smmap==5.0.1              # via -r requirements.txt, gitdb
+sniffio==1.3.1            # via -r requirements.txt, anyio, httpx
 snowballstemmer==2.2.0    # via -r requirements.txt, sphinx
-soupsieve==2.3.2.post1    # via -r requirements.txt, beautifulsoup4
-sparse==0.13.0            # via -r requirements.txt, hyperspy
-spglib==2.0.2             # via -r requirements.txt, asr, matid, phonopy, pymatgen
-sphinx==5.3.0             # via -r requirements.txt, recommonmark
-sphinxcontrib-applehelp==1.0.2  # via -r requirements.txt, sphinx
-sphinxcontrib-devhelp==1.0.2  # via -r requirements.txt, sphinx
-sphinxcontrib-htmlhelp==2.0.0  # via -r requirements.txt, sphinx
+soupsieve==2.5            # via -r requirements.txt, beautifulsoup4
+sparse==0.15.1            # via -r requirements.txt, hyperspy
+spglib==2.3.1             # via -r requirements.txt, asr, matid, phonopy, pymatgen
+sphinx==7.2.6             # via -r requirements.txt, recommonmark
+sphinxcontrib-applehelp==1.0.8  # via -r requirements.txt, sphinx
+sphinxcontrib-devhelp==1.0.6  # via -r requirements.txt, sphinx
+sphinxcontrib-htmlhelp==2.0.5  # via -r requirements.txt, sphinx
 sphinxcontrib-jsmath==1.0.1  # via -r requirements.txt, sphinx
-sphinxcontrib-qthelp==1.0.3  # via -r requirements.txt, sphinx
-sphinxcontrib-serializinghtml==1.1.5  # via -r requirements.txt, sphinx
-sqlalchemy==1.4.46        # via -r requirements.txt, alembic, jupyterhub
-starlette==0.25.0         # via -r requirements.txt, fastapi
-structlog==22.3.0         # via -r requirements.txt, nomad-lab (pyproject.toml)
-sympy==1.10.1             # via -r requirements.txt, findiff, hyperspy, pymatgen, radioactivedecay
+sphinxcontrib-qthelp==1.0.7  # via -r requirements.txt, sphinx
+sphinxcontrib-serializinghtml==1.1.10  # via -r requirements.txt, sphinx
+sqlalchemy==2.0.29        # via -r requirements.txt, alembic, jupyterhub
+stack-data==0.6.3         # via -r requirements.txt, ipython
+starlette==0.27.0         # via -r requirements.txt, fastapi
+structlog==24.1.0         # via -r requirements.txt, nomad-lab (pyproject.toml)
+sympy==1.12               # via -r requirements.txt, findiff, hyperspy, pymatgen, radioactivedecay
+tables==3.9.2             # via -r requirements.txt, ifes-apt-tc-data-modeling
 tabulate==0.8.9           # via -r requirements.txt, nomad-lab (pyproject.toml), pybis, pymatgen
-tenacity==8.1.0           # via -r requirements.txt, plotly
-termcolor==2.1.0          # via mkdocs-macros-plugin
+tenacity==8.2.3           # via -r requirements.txt, plotly
+termcolor==2.4.0          # via mkdocs-macros-plugin
 texttable==1.7.0          # via -r requirements.txt, pybis
-threadpoolctl==3.1.0      # via -r requirements.txt, mdanalysis, scikit-learn
-tifffile==2021.11.2       # via -r requirements.txt, h5grove, hyperspy, scikit-image
-tomli==2.0.1              # via build, mypy, pep517, pylint
-toolz==0.12.0             # via -r requirements.txt, dask, hyperspy, partd
-toposort==1.9             # via -r requirements.txt, nomad-lab (pyproject.toml)
-tornado==6.2              # via -r requirements.txt, ipykernel, ipyparallel, jupyter-client, jupyterhub
-tqdm==4.64.1              # via -r requirements.txt, diffsims, hyperspy, ipyparallel, kikuchipy, mdanalysis, orix, pymatgen, twine
-traitlets==5.8.1          # via -r requirements.txt, comm, ipykernel, ipyparallel, ipython, ipywidgets, jupyter-client, jupyter-core, jupyter-telemetry, jupyterhub, matplotlib-inline
-traits==6.4.1             # via -r requirements.txt, hyperspy
+threadpoolctl==3.4.0      # via -r requirements.txt, mdanalysis, scikit-learn
+tifffile==2024.2.12       # via -r requirements.txt, h5grove, hyperspy, scikit-image
+tomli==2.0.1              # via build, mypy, pip-tools, pyproject-hooks
+toolz==0.12.1             # via -r requirements.txt, dask, hyperspy, partd
+toposort==1.10            # via -r requirements.txt, nomad-lab (pyproject.toml)
+tornado==6.4              # via -r requirements.txt, ipykernel, ipyparallel, jupyter-client, jupyterhub
+tqdm==4.66.2              # via -r requirements.txt, diffsims, hyperspy, ipyparallel, kikuchipy, mdanalysis, orix, pyedr, pymatgen, pyxem, twine
+traitlets==5.14.2         # via -r requirements.txt, comm, ipykernel, ipyparallel, ipython, jupyter-client, jupyter-core, jupyter-telemetry, jupyterhub, matplotlib-inline
+traits==6.4.3             # via -r requirements.txt, hyperspy, pyxem
 transforms3d==0.4.1       # via -r requirements.txt, diffsims, pyxem
 twine==3.4.2              # via nomad-lab (pyproject.toml)
-typed-ast==1.4.2          # via nomad-lab (pyproject.toml)
-typing-extensions==4.4.0  # via -r requirements.txt, astroid, gitpython, mypy, numcodecs, pydantic, pylint, starlette
+typed-ast==1.5.5          # via nomad-lab (pyproject.toml)
+types-python-dateutil==2.9.0.20240316  # via -r requirements.txt, arrow
+typing-extensions==4.11.0  # via -r requirements.txt, alembic, anyio, asgiref, astroid, fastapi, gitpython, ipython, jwcrypto, kombu, mypy, pydantic, sqlalchemy, starlette, uvicorn
 typish==1.9.3             # via -r requirements.txt, nptyping
-tzdata==2023.3            # via -r requirements.txt, pytz-deprecation-shim
+tzdata==2024.1            # via -r requirements.txt, celery, pytz-deprecation-shim
 tzlocal==4.3              # via -r requirements.txt, nionswift, pynxtools
 uncertainties==3.1.7      # via -r requirements.txt, lmfit, pymatgen
 unidecode==1.3.2          # via -r requirements.txt, nomad-lab (pyproject.toml)
-uri-template==1.2.0       # via -r requirements.txt, jsonschema
-urllib3==1.26.14          # via -r requirements.txt, docker, elasticsearch, pybis, requests
-uvicorn[standard]==0.20.0  # via h5grove, nomad-lab (pyproject.toml), uvicorn
-uvloop==0.17.0            # via -r requirements.txt, uvicorn
+uri-template==1.3.0       # via -r requirements.txt, jsonschema
+urllib3==1.26.18          # via -r requirements.txt, docker, elasticsearch, pybis, requests
+uvicorn[standard]==0.29.0  # via -r requirements.txt, h5grove, nomad-lab (pyproject.toml)
+uvloop==0.19.0            # via -r requirements.txt, uvicorn
 validators==0.18.2        # via -r requirements.txt, nomad-lab (pyproject.toml)
-vine==5.0.0               # via -r requirements.txt, amqp, celery, kombu
-watchdog==2.1.9           # via mkdocs
-watchfiles==0.18.1        # via -r requirements.txt, uvicorn
-wcwidth==0.2.5            # via -r requirements.txt, prettytable, prompt-toolkit, pytest
-webcolors==1.12           # via -r requirements.txt, jsonschema
-webencodings==0.5.1       # via -r requirements.txt, bleach, html5lib
-websocket-client==1.4.2   # via -r requirements.txt, docker
-websockets==10.4          # via -r requirements.txt, uvicorn
-werkzeug==2.2.2           # via -r requirements.txt, flask
-wheel==0.38.4             # via pip-tools
-widgetsnbextension==4.0.9  # via -r requirements.txt, ipywidgets
-wrapt==1.12.1             # via -r requirements.txt, astroid, nomad-lab (pyproject.toml)
-xarray==0.20.2            # via -r requirements.txt, nomad-lab (pyproject.toml), pynxtools, pynxtools-mpes, pynxtools-xps
-zarr==2.12.0              # via -r requirements.txt, hyperspy
+vine==5.1.0               # via -r requirements.txt, amqp, celery, kombu
+watchdog==4.0.0           # via mkdocs
+watchfiles==0.21.0        # via -r requirements.txt, uvicorn
+wcwidth==0.2.13           # via -r requirements.txt, prettytable, prompt-toolkit, pytest
+webcolors==1.13           # via -r requirements.txt, jsonschema
+webencodings==0.5.1       # via -r requirements.txt, html5lib
+websockets==12.0          # via -r requirements.txt, uvicorn
+werkzeug==3.0.2           # via -r requirements.txt, flask
+wheel==0.43.0             # via pip-tools
+wrapt==1.16.0             # via -r requirements.txt, nomad-lab (pyproject.toml)
+xarray==2023.12.0         # via -r requirements.txt, nomad-lab (pyproject.toml), pynxtools, pynxtools-mpes, pynxtools-xps
+zarr==2.17.1              # via -r requirements.txt, hyperspy
 zipfile37==0.1.3          # via -r requirements.txt, pynxtools
-zipp==3.11.0              # via -r requirements.txt, importlib-metadata
+zipp==3.18.1              # via -r requirements.txt, importlib-metadata, importlib-resources
 zipstream-new==1.1.5      # via -r requirements.txt, nomad-lab (pyproject.toml)
 
 # The following packages are considered to be unsafe in a requirements file:
diff --git a/requirements.txt b/requirements.txt
index 9c3946f40b83ffc51e9772b47cb265133f836832..cb91e88fef0c333aba0dc132296240202c509229 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,296 +2,301 @@
 # This file is autogenerated by pip-compile with Python 3.9
 # by the following command:
 #
-#    pip-compile --annotation-style=line --extra=infrastructure --extra=parsing --output-file=requirements.txt --pip-args='--prefer-binary' --resolver=backtracking dependencies/nomad-dos-fingerprints/pyproject.toml dependencies/parsers/eelsdb/pyproject.toml pyproject.toml
+#    pip-compile --annotation-style=line --extra=infrastructure --extra=parsing --output-file=requirements.txt --pip-args='--prefer-binary' dependencies/nomad-dos-fingerprints/pyproject.toml dependencies/parsers/eelsdb/pyproject.toml pyproject.toml
 #
-alabaster==0.7.12         # via sphinx
-alembic==1.9.1            # via jupyterhub
-amqp==5.1.1               # via kombu
-aniso8601==7.0.0          # via nomad-lab (pyproject.toml)
-anyio==3.6.2              # via httpcore, starlette, watchfiles
-arrow==1.2.3              # via isoduration
+alabaster==0.7.16         # via sphinx
+alembic==1.13.1           # via jupyterhub
+amqp==5.2.0               # via kombu
+aniso8601==9.0.1          # via nomad-lab (pyproject.toml)
+anyio==4.3.0              # via httpx, starlette, watchfiles
+arrow==1.3.0              # via isoduration
 asciitree==0.3.3          # via zarr
-ase==3.19.0               # via asr, ifes-apt-tc-data-modeling, matid, nomad-lab (pyproject.toml), pynxtools, quippy-ase
-asgiref==3.6.0            # via nomad-lab (pyproject.toml)
+ase==3.19.3               # via asr, ifes-apt-tc-data-modeling, matid, nomad-lab (pyproject.toml), pynxtools, quippy-ase
+asgiref==3.8.1            # via nomad-lab (pyproject.toml)
 asr==0.4.1                # via nomad-lab (pyproject.toml)
-asteval==0.9.31           # via lmfit
+asteval==0.9.32           # via lmfit
+asttokens==2.4.1          # via stack-data
 async-generator==1.10     # via jupyterhub
-async-timeout==4.0.2      # via redis
-attrs==22.2.0             # via jsonschema
-babel==2.11.0             # via sphinx
-backcall==0.2.0           # via ipython
+attrs==23.2.0             # via jsonschema
+babel==2.14.0             # via sphinx
 bagit==1.8.1              # via nomad-lab (pyproject.toml)
 basicauth==0.4.1          # via nomad-lab (pyproject.toml)
 bcrypt==3.2.0             # via nomad-lab (pyproject.toml)
-beautifulsoup4==4.11.1    # via bs4
-billiard==3.6.4.0         # via celery
-biopython==1.80           # via mdanalysis
-bitarray==2.3.5           # via nomad-lab (pyproject.toml), nomad_dos_fingerprints (dependencies/nomad-dos-fingerprints/pyproject.toml)
-bs4==0.0.1                # via nomad-lab (pyproject.toml)
-cachetools==4.2.4         # via nomad-lab (pyproject.toml)
-celery[redis]==5.2.7      # via celery, nomad-lab (pyproject.toml)
-certifi==2022.12.7        # via elasticsearch, httpcore, httpx, requests
+beautifulsoup4==4.12.3    # via nomad-lab (pyproject.toml)
+billiard==4.2.0           # via celery
+biopython==1.83           # via mdanalysis
+bitarray==2.9.2           # via nomad-lab (pyproject.toml), nomad_dos_fingerprints (dependencies/nomad-dos-fingerprints/pyproject.toml)
+blinker==1.7.0            # via flask
+blosc2==2.5.1             # via tables
+cachetools==5.3.3         # via nomad-lab (pyproject.toml)
+celery==5.3.6             # via nomad-lab (pyproject.toml)
+certifi==2024.2.2         # via elasticsearch, httpcore, httpx, requests
 certipy==0.1.3            # via jupyterhub
-cffi==1.15.1              # via bcrypt, cryptography
-cftime==1.6.2             # via netcdf4
-charset-normalizer==2.0.12  # via requests
-click==8.1.3              # via asr, celery, click-didyoumean, click-plugins, click-repl, flask, nomad-lab (pyproject.toml), pynxtools, uvicorn
-click-didyoumean==0.3.0   # via celery
+cffi==1.16.0              # via bcrypt, cryptography
+cftime==1.6.3             # via netcdf4
+charset-normalizer==3.3.2  # via requests
+click==8.1.7              # via asr, celery, click-didyoumean, click-plugins, click-repl, dask, flask, nomad-lab (pyproject.toml), pynxtools, uvicorn
+click-didyoumean==0.3.1   # via celery
 click-plugins==1.1.1      # via celery
-click-repl==0.2.0         # via celery
-cloudpickle==2.2.0        # via dask
-comm==0.1.4               # via ipywidgets
+click-repl==0.3.0         # via celery
+cloudpickle==3.0.0        # via dask, hyperspy
+comm==0.2.2               # via ipykernel
 commonmark==0.9.1         # via recommonmark
-cryptography==39.0.0      # via nomad-lab (pyproject.toml), pyjwt, pyopenssl, rfc3161ng
-cycler==0.11.0            # via matplotlib
-dask[array]==2022.2.0     # via dask, hyperspy, kikuchipy, orix, pyxem
-debugpy==1.6.5            # via ipykernel
+contourpy==1.2.1          # via matplotlib
+cryptography==42.0.5      # via jwcrypto, nomad-lab (pyproject.toml), pyjwt, pyopenssl, rfc3161ng
+cycler==0.12.1            # via matplotlib
+dask[array]==2024.4.1     # via hyperspy, kikuchipy, orix, pyxem, rosettasciio
+debugpy==1.8.1            # via ipykernel
 decorator==5.1.1          # via ipyparallel, ipython, validators
+deprecation==2.1.0        # via python-keycloak
 diffpy-structure==3.1.0   # via diffsims, kikuchipy, orix
 diffsims==0.5.2           # via kikuchipy, pyxem
-dill==0.3.6               # via hyperspy
-dnspython==2.2.1          # via email-validator, pymongo
-docker==6.0.1             # via dockerspawner
+dill==0.3.8               # via hyperspy, lmfit
+dnspython==2.6.1          # via email-validator, pymongo
+docker==7.0.0             # via dockerspawner
 dockerspawner==12.1.0     # via nomad-lab (pyproject.toml)
-docstring-parser==0.12    # via nomad-lab (pyproject.toml)
-docutils==0.19            # via m2r, recommonmark, sphinx
-ecdsa==0.18.0             # via python-jose
+docstring-parser==0.16    # via nomad-lab (pyproject.toml)
+docutils==0.20.1          # via m2r, recommonmark, sphinx
 elasticsearch==7.17.1     # via elasticsearch-dsl, nomad-lab (pyproject.toml)
 elasticsearch-dsl==7.4.0  # via nomad-lab (pyproject.toml)
-email-validator==1.3.0    # via optimade
-entrypoints==0.4          # via ipyparallel, jupyter-client, numcodecs
+email-validator==1.3.1    # via optimade
+entrypoints==0.4          # via ipyparallel
 escapism==1.0.1           # via dockerspawner
 et-xmlfile==1.1.0         # via openpyxl
+exceptiongroup==1.2.0     # via anyio, ipython
+executing==2.0.1          # via stack-data
 f90wrap==0.2.13           # via quippy-ase
-fabio==2023.6.0           # via pyfai, silx
-fastapi==0.92.0           # via h5grove, nomad-lab (pyproject.toml)
-fasteners==0.18           # via mdanalysis, zarr
+fabio==2023.10.0          # via pyfai, silx
+fastapi==0.99.1           # via h5grove, nomad-lab (pyproject.toml)
+fasteners==0.19           # via mdanalysis, zarr
 filelock==3.3.1           # via nomad-lab (pyproject.toml)
 findiff==0.10.0           # via pynxtools-stm
-flask==2.2.2              # via asr
+flask==3.0.3              # via asr
 flatdict==4.0.1           # via pynxtools
-fonttools==4.38.0         # via matplotlib
+fonttools==4.51.0         # via matplotlib
 fqdn==1.5.1               # via jsonschema
-fsspec==2022.11.0         # via dask, hyperspy
-future==0.18.2            # via uncertainties
-gitdb==4.0.10             # via gitpython
+fsspec==2024.3.1          # via dask, hyperspy
+future==1.0.0             # via uncertainties
+gitdb==4.0.11             # via gitpython
 gitpython==3.1.24         # via nomad-lab (pyproject.toml), pynxtools
-greenlet==2.0.1           # via sqlalchemy
-griddataformats==0.7.0    # via mdanalysis
-gsd==2.7.0                # via mdanalysis
+greenlet==3.0.3           # via sqlalchemy
+griddataformats==1.0.2    # via mdanalysis
+gsd==3.2.1                # via mdanalysis
 gunicorn==21.2.0          # via nomad-lab (pyproject.toml)
 h11==0.14.0               # via httpcore, uvicorn
-h5grove[fastapi]==1.3.0   # via h5grove, nomad-lab (pyproject.toml)
-h5py==3.6.0               # via h5grove, hyperspy, ifes-apt-tc-data-modeling, kikuchipy, nionswift, nomad-lab (pyproject.toml), orix, phonopy, pyfai, pynxtools, pynxtools-mpes, pynxtools-xps, silx
-hjson==3.0.2              # via nomad-lab (pyproject.toml)
+h5grove[fastapi]==1.3.0   # via nomad-lab (pyproject.toml)
+h5py==3.6.0               # via fabio, h5grove, hdf5plugin, hyperspy, ifes-apt-tc-data-modeling, kikuchipy, nionswift, nomad-lab (pyproject.toml), orix, phonopy, pyfai, pynxtools, pynxtools-mpes, pynxtools-xps, pyxem, rosettasciio, silx
+hdf5plugin==4.4.0         # via fabio
+hjson==3.1.0              # via nomad-lab (pyproject.toml)
 html5lib==1.1             # via nomad-lab (pyproject.toml)
-httpcore==0.16.3          # via httpx
-httptools==0.5.0          # via uvicorn
-httpx==0.23.3             # via nomad-lab (pyproject.toml)
-hyperspy==1.7.5           # via kikuchipy, pynxtools, pyxem
-idna==3.4                 # via anyio, email-validator, jsonschema, requests, rfc3986
-ifes-apt-tc-data-modeling==0.0.9  # via pynxtools
-imageio==2.24.0           # via hyperspy, kikuchipy, nionswift, nionswift-io, nionui, scikit-image
+httpcore==1.0.5           # via httpx
+httptools==0.6.1          # via uvicorn
+httpx==0.27.0             # via nomad-lab (pyproject.toml)
+hyperspy==1.7.6           # via kikuchipy, pynxtools, pyxem
+idna==3.6                 # via anyio, email-validator, httpx, jsonschema, requests
+ifes-apt-tc-data-modeling==0.1  # via pynxtools
+imageio==2.27.0           # via hyperspy, kikuchipy, nionswift, nionswift-io, nionui, scikit-image
 imagesize==1.4.1          # via sphinx
-importlib-metadata==4.13.0  # via flask, hyperspy, jupyterhub, nomad-lab (pyproject.toml), pynxtools, sphinx
+importlib-metadata==7.1.0  # via dask, flask, hyperspy, jupyter-client, jupyterhub, pynxtools, sphinx
+importlib-resources==6.4.0  # via matplotlib
 inflection==0.5.1         # via nomad-lab (pyproject.toml)
-ipykernel==6.16.2         # via ipyparallel
-ipyparallel==8.4.1        # via hyperspy
-ipython==7.34.0           # via hyperspy, ipykernel, ipyparallel, ipywidgets, pynxtools-stm
-ipywidgets==8.1.1         # via pyxem
+ipykernel==6.29.4         # via ipyparallel
+ipyparallel==8.8.0        # via hyperspy
+ipython==8.18.1           # via hyperspy, ipykernel, ipyparallel, pynxtools-stm
 isodate==0.6.1            # via rdflib
 isoduration==20.11.0      # via jsonschema
 itsdangerous==2.1.2       # via flask, nomad-lab (pyproject.toml)
-jedi==0.18.2              # via ipython
-jinja2==3.0.3             # via flask, hyperspy, jupyterhub, sphinx
-jmespath==0.10.0          # via nomad-lab (pyproject.toml)
-joblib==1.1.0             # via mdanalysis, pymatgen, scikit-learn
-jsonpointer==2.3          # via jsonschema
-jsonschema[format]==4.17.3  # via jsonschema, jupyter-telemetry, nomad-lab (pyproject.toml), oauthenticator
-jupyter-client==7.4.8     # via ipykernel, ipyparallel
-jupyter-core==4.12.0      # via jupyter-client
+jedi==0.19.1              # via ipython
+jinja2==3.1.3             # via flask, hyperspy, jupyterhub, sphinx
+jmespath==1.0.1           # via nomad-lab (pyproject.toml)
+joblib==1.4.0             # via mdanalysis, pymatgen, scikit-learn
+jsonpointer==2.4          # via jsonschema
+jsonschema[format]==4.17.3  # via jupyter-telemetry, nomad-lab (pyproject.toml), oauthenticator
+jupyter-client==8.6.1     # via ipykernel, ipyparallel
+jupyter-core==5.7.2       # via ipykernel, jupyter-client
 jupyter-telemetry==0.1.0  # via jupyterhub
 jupyterhub==4.0.2         # via dockerspawner, nomad-lab (pyproject.toml), oauthenticator
-jupyterlab-widgets==3.0.9  # via ipywidgets
-kikuchipy==0.8.7          # via pynxtools
-kiwisolver==1.4.4         # via matplotlib
-kombu==5.2.4              # via celery
-lark==1.1.5               # via optimade
-latexcodec==2.0.1         # via pybtex
-llvmlite==0.39.1          # via numba
-lmfit==1.2.2              # via pyxem
+jwcrypto==1.5.6           # via python-keycloak
+kikuchipy==0.9.0          # via pynxtools
+kiwisolver==1.4.5         # via matplotlib
+kombu==5.3.6              # via celery
+lark==1.1.9               # via optimade
+latexcodec==3.0.0         # via pybtex
+llvmlite==0.42.0          # via numba
+lmfit==1.3.0              # via pyxem
 locket==1.0.0             # via partd
-lxml==5.2.0               # via lxml-html-clean, nomad-lab (pyproject.toml)
-lxml-html-clean==0.1.0    # via nomad-lab (pyproject.toml)
+lxml==5.2.1               # via fabio, lxml-html-clean, nomad-lab (pyproject.toml)
+lxml-html-clean==0.1.1    # via nomad-lab (pyproject.toml)
 m2r==0.2.1                # via nomad-lab (pyproject.toml)
-mako==1.2.4               # via alembic
-markupsafe==2.1.1         # via jinja2, mako, werkzeug
+mako==1.3.2               # via alembic
+markupsafe==2.1.5         # via jinja2, mako, werkzeug
 matid==2.0.0.dev2         # via nomad-lab (pyproject.toml)
-matplotlib==3.5.3         # via ase, asr, diffsims, hyperspy, kikuchipy, matplotlib-scalebar, mdanalysis, orix, phonopy, pyfai, pymatgen, pyxem, radioactivedecay
+matplotlib==3.8.4         # via ase, asr, diffsims, hyperspy, kikuchipy, matplotlib-scalebar, mdanalysis, orix, phonopy, pyfai, pymatgen, pyxem, radioactivedecay
 matplotlib-inline==0.1.6  # via ipykernel, ipython
 matplotlib-scalebar==0.8.1  # via orix
+mda-xdrlib==0.2.0         # via pyedr
 mdanalysis==2.5.0         # via nomad-lab (pyproject.toml)
-memoization==0.4.0        # via nomad-lab (pyproject.toml)
 mergedeep==1.3.4          # via pynxtools
-mistune==2.0.4            # via m2r
+mistune==3.0.2            # via m2r
 mmtf-python==1.1.3        # via mdanalysis
-mongoengine==0.25.0       # via nomad-lab (pyproject.toml)
+mongoengine==0.28.2       # via nomad-lab (pyproject.toml)
 mongomock==4.1.2          # via optimade
-monty==2022.9.9           # via pymatgen
-mpmath==1.2.1             # via sympy
-mrcfile==1.4.3            # via griddataformats
-msgpack==1.0.4            # via mmtf-python, nomad-lab (pyproject.toml)
-natsort==8.2.0            # via hyperspy
-nest-asyncio==1.5.6       # via ipykernel, jupyter-client
+monty==2024.3.31          # via pymatgen
+mpmath==1.3.0             # via sympy
+mrcfile==1.5.0            # via griddataformats
+msgpack==1.0.8            # via blosc2, mmtf-python, nomad-lab (pyproject.toml)
+natsort==8.4.0            # via hyperspy
+ndindex==1.8              # via blosc2
+nest-asyncio==1.6.0       # via ipykernel
 netcdf4==1.5.4            # via nomad-lab (pyproject.toml)
 networkx==2.6.3           # via matid, mdanalysis, nomad-lab (pyproject.toml), pymatgen, radioactivedecay, scikit-image
 niondata==0.15.5          # via nionswift, nionswift-io
 nionswift==0.16.8         # via pynxtools
 nionswift-io==0.15.1      # via nionswift
 nionui==0.6.11            # via nionswift
-nionutils==0.4.8          # via niondata, nionswift, nionswift-io, nionui
+nionutils==0.4.10         # via niondata, nionswift, nionswift-io, nionui
 nptyping==1.4.4           # via nomad-lab (pyproject.toml)
-numba==0.56.4             # via diffsims, hyperspy, kikuchipy, orix, pyxem, sparse
-numcodecs==0.10.2         # via zarr
-numexpr==2.8.4            # via hyperspy, pyfai
-numpy==1.22.4             # via ase, biopython, cftime, dask, diffsims, f90wrap, fabio, findiff, griddataformats, gsd, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, mrcfile, netcdf4, niondata, nionswift, nionswift-io, nionui, nomad-lab (pyproject.toml), nomad_dos_fingerprints (dependencies/nomad-dos-fingerprints/pyproject.toml), nptyping, numba, numcodecs, numexpr, numpy-quaternion, orix, pandas, phonopy, pyfai, pymatgen, pynxtools, pywavelets, pyxem, quippy-ase, radioactivedecay, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tifffile, xarray, zarr
-numpy-quaternion==2022.4.3  # via orix
+numba==0.59.1             # via diffsims, hyperspy, kikuchipy, orix, pyxem, sparse
+numcodecs==0.12.1         # via zarr
+numexpr==2.10.0           # via hyperspy, pyfai, pyxem, tables
+numpy==1.22.4             # via ase, biopython, blosc2, cftime, contourpy, dask, diffsims, f90wrap, fabio, findiff, griddataformats, gsd, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, mrcfile, netcdf4, niondata, nionswift, nionswift-io, nionui, nomad-lab (pyproject.toml), nomad_dos_fingerprints (dependencies/nomad-dos-fingerprints/pyproject.toml), nptyping, numba, numcodecs, numexpr, numpy-quaternion, orix, pandas, phonopy, pyedr, pyfai, pymatgen, pynxtools, pywavelets, pyxem, quippy-ase, radioactivedecay, rosettasciio, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tables, tifffile, xarray, zarr
+numpy-quaternion==2023.0.3  # via orix
 oauthenticator==15.1.0    # via nomad-lab (pyproject.toml)
 oauthlib==3.2.2           # via jupyterhub
 openpyxl==3.1.2           # via nomad-lab (pyproject.toml)
-optimade[mongo]==0.22.1   # via nomad-lab (pyproject.toml), optimade
+optimade[mongo]==0.22.1   # via nomad-lab (pyproject.toml)
 orix==0.11.1              # via diffsims, kikuchipy, pyxem
 orjson==3.9.4             # via h5grove, nomad-lab (pyproject.toml)
-packaging==23.0           # via dask, docker, gunicorn, hyperspy, ipykernel, jupyterhub, matplotlib, mdanalysis, mongomock, pint, pooch, scikit-image, sphinx
-palettable==3.3.0         # via pymatgen
-pamela==1.0.0             # via jupyterhub
-pandas==1.3.5             # via eelsdbconverter (dependencies/parsers/eelsdb/pyproject.toml), ifes-apt-tc-data-modeling, nomad-lab (pyproject.toml), panedr, pybis, pymatgen, pynxtools, xarray
-panedr==0.2               # via nomad-lab (pyproject.toml)
-parmed==3.0.0             # via nomad-lab (pyproject.toml)
-parso==0.8.3              # via jedi
-partd==1.3.0              # via dask
+packaging==24.0           # via dask, deprecation, docker, gunicorn, hyperspy, ipykernel, jupyterhub, matplotlib, mdanalysis, mongomock, pint, plotly, pooch, scikit-image, silx, sphinx, tables, xarray
+palettable==3.3.3         # via pymatgen
+pamela==1.1.0             # via jupyterhub
+pandas==1.5.3             # via eelsdbconverter (dependencies/parsers/eelsdb/pyproject.toml), ifes-apt-tc-data-modeling, nomad-lab (pyproject.toml), panedr, pybis, pymatgen, pynxtools, xarray
+panedr==0.8.0             # via nomad-lab (pyproject.toml)
+parmed==4.2.2             # via nomad-lab (pyproject.toml)
+parso==0.8.4              # via jedi
+partd==1.4.1              # via dask
 passlib==1.7.4            # via nomad-lab (pyproject.toml)
-pexpect==4.8.0            # via ipython
-phonopy==2.11.0           # via asr
-pickleshare==0.7.5        # via ipython
-pillow==9.4.0             # via imageio, matplotlib, nionswift, scikit-image
-pint==0.17                # via hyperspy, nomad-lab (pyproject.toml)
-platformdirs==3.1.1       # via pooch
-plotly==5.11.0            # via asr, pymatgen
-pooch==1.7.0              # via kikuchipy, orix
-prettytable==3.6.0        # via hyperspy
-prometheus-client==0.15.0  # via jupyterhub
-prompt-toolkit==3.0.36    # via click-repl, ipython
-psutil==5.9.4             # via diffsims, ipykernel, ipyparallel, pyxem
+pexpect==4.9.0            # via ipython
+phonopy==2.9.1            # via asr
+pillow==10.0.1            # via fabio, hyperspy, imageio, matplotlib, nionswift, scikit-image
+pint==0.17                # via hyperspy, nomad-lab (pyproject.toml), rosettasciio
+platformdirs==4.2.0       # via jupyter-core, pooch
+plotly==5.20.0            # via asr, pymatgen
+pooch==1.8.1              # via hyperspy, kikuchipy, orix
+prettytable==3.10.0       # via hyperspy
+prometheus-client==0.20.0  # via jupyterhub
+prompt-toolkit==3.0.43    # via click-repl, ipython
+psutil==5.9.8             # via diffsims, ipykernel, ipyparallel, pyxem
 ptyprocess==0.7.0         # via pexpect
-pyasn1==0.4.8             # via pyasn1-modules, python-jose, rfc3161ng, rsa
-pyasn1-modules==0.2.8     # via rfc3161ng
+pure-eval==0.2.2          # via stack-data
+py-cpuinfo==9.0.0         # via blosc2, tables
+pyasn1==0.6.0             # via pyasn1-modules, rfc3161ng
+pyasn1-modules==0.4.0     # via rfc3161ng
 pybis @ git+https://github.com/FAIRmat-NFDI/fairmat-pybis.git  # via nomad-lab (pyproject.toml)
 pybtex==0.24.0            # via pymatgen
 pycifrw==4.4.5            # via diffpy-structure
-pycparser==2.21           # via cffi
-pydantic==1.10.9          # via fastapi, nomad-lab (pyproject.toml), optimade
-pyfai==2023.9.0           # via pyxem
-pygments==2.14.0          # via ipython, sphinx
-pyjwt[crypto]==2.6.0      # via nomad-lab (pyproject.toml), pyjwt
+pycparser==2.22           # via cffi
+pydantic==1.10.15         # via fastapi, nomad-lab (pyproject.toml), optimade
+pyedr==0.8.0              # via panedr
+pyfai==2024.2.0           # via pyxem
+pygments==2.17.2          # via ipython, sphinx
+pyjwt[crypto]==2.6.0      # via nomad-lab (pyproject.toml)
 pymatgen==2023.9.25       # via asr, nomad-lab (pyproject.toml)
-pymongo==4.3.3            # via mongoengine, nomad-lab (pyproject.toml), optimade
-pynxtools[convert,mpes,stm,xps]==0.1.1  # via nomad-lab (pyproject.toml), pynxtools, pynxtools-mpes, pynxtools-stm, pynxtools-xps
-pynxtools-mpes==0.0.1     # via pynxtools
+pymongo==4.6.3            # via mongoengine, optimade
+pynxtools[convert,mpes,stm,xps]==0.1.1  # via nomad-lab (pyproject.toml), pynxtools-mpes, pynxtools-stm, pynxtools-xps
+pynxtools-mpes==0.0.3     # via pynxtools
 pynxtools-stm==1.0.1      # via pynxtools
 pynxtools-xps==0.0.3      # via pynxtools
-pyopenssl==23.0.0         # via certipy
-pyparsing==3.0.9          # via matplotlib, rdflib
-pyrsistent==0.19.3        # via jsonschema
-python-dateutil==2.8.2    # via arrow, elasticsearch-dsl, hyperspy, ipyparallel, jupyter-client, jupyterhub, matplotlib, pandas, pybis, rfc3161ng
-python-dotenv==0.21.0     # via uvicorn
-python-jose==3.3.0        # via python-keycloak
+pyopenssl==24.1.0         # 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, hyperspy, ipyparallel, jupyter-client, jupyterhub, matplotlib, pandas, pybis, rfc3161ng, rosettasciio
+python-dotenv==1.0.1      # via uvicorn
 python-json-logger==2.0.2  # via jupyter-telemetry, nomad-lab (pyproject.toml)
-python-keycloak==0.26.1   # via nomad-lab (pyproject.toml)
+python-keycloak==3.11.1   # 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-multipart==0.0.5   # via nomad-lab (pyproject.toml)
-pytz==2022.7.1            # via babel, celery, nionswift, nomad-lab (pyproject.toml), pandas, pynxtools
+python-multipart==0.0.9   # via nomad-lab (pyproject.toml)
+pytz==2024.1              # via nionswift, nomad-lab (pyproject.toml), pandas, pynxtools
 pytz-deprecation-shim==0.1.0.post0  # via tzlocal
-pywavelets==1.3.0         # via scikit-image
-pyxem==0.15.1             # via pynxtools
-pyyaml==6.0               # via dask, hyperspy, kikuchipy, nomad-lab (pyproject.toml), phonopy, pybtex, pynxtools, pynxtools-mpes, uvicorn
+pywavelets==1.6.0         # via scikit-image
+pyxem==0.16.0             # via pynxtools
+pyyaml==6.0.1             # via dask, hyperspy, kikuchipy, nomad-lab (pyproject.toml), phonopy, pybtex, pynxtools, pynxtools-mpes, rosettasciio, uvicorn
 pyzeo==0.1.4              # via nomad-lab (pyproject.toml)
-pyzmq==25.0.0             # via ipykernel, ipyparallel, jupyter-client
+pyzmq==25.1.2             # via ipykernel, ipyparallel, jupyter-client
 quippy-ase==0.9.14        # via nomad-lab (pyproject.toml)
-radioactivedecay==0.4.17  # via ifes-apt-tc-data-modeling
+radioactivedecay==0.4.22  # via ifes-apt-tc-data-modeling
 rdflib==5.0.0             # via nomad-lab (pyproject.toml)
 recommonmark==0.7.1       # via nomad-lab (pyproject.toml)
-redis==4.4.2              # via celery
-requests==2.28.2          # via docker, eelsdbconverter (dependencies/parsers/eelsdb/pyproject.toml), hyperspy, jupyterhub, nomad-lab (pyproject.toml), oauthenticator, optimade, pooch, pybis, pymatgen, python-keycloak, rfc3161ng, sphinx
+requests==2.31.0          # via docker, eelsdbconverter (dependencies/parsers/eelsdb/pyproject.toml), hyperspy, jupyterhub, nomad-lab (pyproject.toml), oauthenticator, optimade, pooch, pybis, pymatgen, python-keycloak, requests-toolbelt, rfc3161ng, sphinx
+requests-toolbelt==1.0.0  # via python-keycloak
 rfc3161ng==2.1.3          # via nomad-lab (pyproject.toml)
 rfc3339-validator==0.1.4  # via jsonschema
-rfc3986[idna2008]==1.5.0  # via httpx, rfc3986
 rfc3987==1.3.8            # via jsonschema
-rsa==4.9                  # via python-jose
-ruamel-yaml==0.17.21      # via jupyter-telemetry, oauthenticator, pymatgen
-ruamel-yaml-clib==0.2.7   # via ruamel-yaml
+ruamel-yaml==0.18.6       # via jupyter-telemetry, oauthenticator, pymatgen
+ruamel-yaml-clib==0.2.8   # via ruamel-yaml
 runstats==2.0.0           # via nomad-lab (pyproject.toml)
 scikit-image==0.19.3      # via hyperspy, kikuchipy, pyxem
-scikit-learn==1.0.2       # via kikuchipy, matid, nomad-lab (pyproject.toml), pyxem
-scipy==1.7.1              # via ase, diffsims, findiff, griddataformats, hyperspy, kikuchipy, lmfit, matid, mdanalysis, niondata, nionswift, nomad-lab (pyproject.toml), orix, pyfai, pymatgen, pynxtools, pyxem, radioactivedecay, scikit-image, scikit-learn, sparse
+scikit-learn==1.4.2       # via kikuchipy, matid, nomad-lab (pyproject.toml), pyxem
+scipy==1.13.0             # via ase, diffsims, findiff, griddataformats, hyperspy, kikuchipy, lmfit, matid, mdanalysis, niondata, nionswift, nomad-lab (pyproject.toml), orix, pyfai, pymatgen, pynxtools, pyxem, radioactivedecay, scikit-image, scikit-learn, sparse
 sentinels==1.0.0          # via mongomock
-silx==1.1.2               # via pyfai
-six==1.16.0               # via basicauth, bcrypt, click-repl, diffpy-structure, ecdsa, elasticsearch-dsl, griddataformats, html5lib, isodate, latexcodec, pybtex, python-dateutil, python-multipart, rdflib, rfc3339-validator, validators
-smmap==5.0.0              # via gitdb
-sniffio==1.3.0            # via anyio, httpcore, httpx
+silx==2.0.1               # via pyfai
+six==1.16.0               # via asttokens, basicauth, bcrypt, diffpy-structure, elasticsearch-dsl, html5lib, isodate, pybtex, python-dateutil, rdflib, rfc3339-validator, validators
+smmap==5.0.1              # via gitdb
+sniffio==1.3.1            # via anyio, httpx
 snowballstemmer==2.2.0    # via sphinx
-soupsieve==2.3.2.post1    # via beautifulsoup4
-sparse==0.13.0            # via hyperspy
-spglib==2.0.2             # via asr, matid, phonopy, pymatgen
-sphinx==5.3.0             # via recommonmark
-sphinxcontrib-applehelp==1.0.2  # via sphinx
-sphinxcontrib-devhelp==1.0.2  # via sphinx
-sphinxcontrib-htmlhelp==2.0.0  # via sphinx
+soupsieve==2.5            # via beautifulsoup4
+sparse==0.15.1            # via hyperspy
+spglib==2.3.1             # via asr, matid, phonopy, pymatgen
+sphinx==7.2.6             # via recommonmark
+sphinxcontrib-applehelp==1.0.8  # via sphinx
+sphinxcontrib-devhelp==1.0.6  # via sphinx
+sphinxcontrib-htmlhelp==2.0.5  # via sphinx
 sphinxcontrib-jsmath==1.0.1  # via sphinx
-sphinxcontrib-qthelp==1.0.3  # via sphinx
-sphinxcontrib-serializinghtml==1.1.5  # via sphinx
-sqlalchemy==1.4.46        # via alembic, jupyterhub
-starlette==0.25.0         # via fastapi
-structlog==22.3.0         # via nomad-lab (pyproject.toml)
-sympy==1.10.1             # via findiff, hyperspy, pymatgen, radioactivedecay
+sphinxcontrib-qthelp==1.0.7  # via sphinx
+sphinxcontrib-serializinghtml==1.1.10  # via sphinx
+sqlalchemy==2.0.29        # via alembic, jupyterhub
+stack-data==0.6.3         # via ipython
+starlette==0.27.0         # via fastapi
+structlog==24.1.0         # via nomad-lab (pyproject.toml)
+sympy==1.12               # via findiff, hyperspy, pymatgen, radioactivedecay
+tables==3.9.2             # via ifes-apt-tc-data-modeling
 tabulate==0.8.9           # via nomad-lab (pyproject.toml), pybis, pymatgen
-tenacity==8.1.0           # via plotly
+tenacity==8.2.3           # via plotly
 texttable==1.7.0          # via pybis
-threadpoolctl==3.1.0      # via mdanalysis, scikit-learn
-tifffile==2021.11.2       # via h5grove, hyperspy, scikit-image
-toolz==0.12.0             # via dask, hyperspy, partd
-toposort==1.9             # via nomad-lab (pyproject.toml)
-tornado==6.2              # via ipykernel, ipyparallel, jupyter-client, jupyterhub
-tqdm==4.64.1              # via diffsims, hyperspy, ipyparallel, kikuchipy, mdanalysis, orix, pymatgen
-traitlets==5.8.1          # via comm, ipykernel, ipyparallel, ipython, ipywidgets, jupyter-client, jupyter-core, jupyter-telemetry, jupyterhub, matplotlib-inline
-traits==6.4.1             # via hyperspy
+threadpoolctl==3.4.0      # via mdanalysis, scikit-learn
+tifffile==2024.2.12       # via h5grove, hyperspy, scikit-image
+toolz==0.12.1             # via dask, hyperspy, partd
+toposort==1.10            # via nomad-lab (pyproject.toml)
+tornado==6.4              # via ipykernel, ipyparallel, jupyter-client, jupyterhub
+tqdm==4.66.2              # via diffsims, hyperspy, ipyparallel, kikuchipy, mdanalysis, orix, pyedr, pymatgen, pyxem
+traitlets==5.14.2         # via comm, ipykernel, ipyparallel, ipython, jupyter-client, jupyter-core, jupyter-telemetry, jupyterhub, matplotlib-inline
+traits==6.4.3             # via hyperspy, pyxem
 transforms3d==0.4.1       # via diffsims, pyxem
-typing-extensions==4.4.0  # via gitpython, numcodecs, pydantic, starlette
+types-python-dateutil==2.9.0.20240316  # via arrow
+typing-extensions==4.11.0  # via alembic, anyio, asgiref, fastapi, gitpython, ipython, jwcrypto, kombu, pydantic, sqlalchemy, starlette, uvicorn
 typish==1.9.3             # via nptyping
-tzdata==2023.3            # via pytz-deprecation-shim
+tzdata==2024.1            # via celery, pytz-deprecation-shim
 tzlocal==4.3              # via nionswift, pynxtools
 uncertainties==3.1.7      # via lmfit, pymatgen
 unidecode==1.3.2          # via nomad-lab (pyproject.toml)
-uri-template==1.2.0       # via jsonschema
-urllib3==1.26.14          # via docker, elasticsearch, pybis, requests
-uvicorn[standard]==0.20.0  # via h5grove, nomad-lab (pyproject.toml)
-uvloop==0.17.0            # via uvicorn
+uri-template==1.3.0       # via jsonschema
+urllib3==1.26.18          # via docker, elasticsearch, pybis, requests
+uvicorn[standard]==0.29.0  # via h5grove, nomad-lab (pyproject.toml)
+uvloop==0.19.0            # via uvicorn
 validators==0.18.2        # via nomad-lab (pyproject.toml)
-vine==5.0.0               # via amqp, celery, kombu
-watchfiles==0.18.1        # via uvicorn
-wcwidth==0.2.5            # via prettytable, prompt-toolkit
-webcolors==1.12           # via jsonschema
+vine==5.1.0               # via amqp, celery, kombu
+watchfiles==0.21.0        # via uvicorn
+wcwidth==0.2.13           # via prettytable, prompt-toolkit
+webcolors==1.13           # via jsonschema
 webencodings==0.5.1       # via html5lib
-websocket-client==1.4.2   # via docker
-websockets==10.4          # via uvicorn
-werkzeug==2.2.2           # via flask
-widgetsnbextension==4.0.9  # via ipywidgets
-wrapt==1.12.1             # via nomad-lab (pyproject.toml)
-xarray==0.20.2            # via nomad-lab (pyproject.toml), pynxtools, pynxtools-mpes, pynxtools-xps
-zarr==2.12.0              # via hyperspy
+websockets==12.0          # via uvicorn
+werkzeug==3.0.2           # via flask
+wrapt==1.16.0             # via nomad-lab (pyproject.toml)
+xarray==2023.12.0         # via nomad-lab (pyproject.toml), pynxtools, pynxtools-mpes, pynxtools-xps
+zarr==2.17.1              # via hyperspy
 zipfile37==0.1.3          # via pynxtools
-zipp==3.11.0              # via importlib-metadata
+zipp==3.18.1              # via importlib-metadata, importlib-resources
 zipstream-new==1.1.5      # via nomad-lab (pyproject.toml)
 
 # The following packages are considered to be unsafe in a requirements file:
diff --git a/scripts/check_python_dependencies.sh b/scripts/check_python_dependencies.sh
index bf772408ca116bfdd5a077b190c92ae28ab80b00..2efe00c83cc428f66b923ec8180856719a8876a5 100755
--- a/scripts/check_python_dependencies.sh
+++ b/scripts/check_python_dependencies.sh
@@ -18,7 +18,7 @@ cd $project_dir
 cp requirements.txt requirements.txt.tmp
 cp requirements-dev.txt requirements-dev.txt.tmp
 
-pip-compile --resolver=backtracking --annotation-style=line \
+pip-compile -r -U --resolver=backtracking --annotation-style=line \
     --extra=infrastructure --extra=parsing \
     --output-file=requirements.txt \
     --pip-args="--prefer-binary" \
@@ -28,7 +28,7 @@ pip-compile --resolver=backtracking --annotation-style=line \
 
 diff requirements.txt.tmp requirements.txt
 
-pip-compile --resolver=backtracking --annotation-style=line \
+pip-compile -r -U --resolver=backtracking --annotation-style=line \
     --extra=dev --extra=infrastructure --extra=parsing \
     --output-file=requirements-dev.txt \
     --pip-args="--prefer-binary" \
diff --git a/scripts/generate_python_dependencies.sh b/scripts/generate_python_dependencies.sh
index 04837fa49ffedb9608170159f61e4d8ccbed53b1..3393d05092e9263dfb4d91f14670f1ece89dd7fa 100755
--- a/scripts/generate_python_dependencies.sh
+++ b/scripts/generate_python_dependencies.sh
@@ -14,7 +14,7 @@ project_dir=$(dirname $(dirname $(realpath $0)))
 
 cd $project_dir
 
-pip-compile --resolver=backtracking --annotation-style=line \
+pip-compile -r -U --resolver=backtracking --annotation-style=line \
     --extra=infrastructure --extra=parsing \
     --output-file=requirements.txt \
     --pip-args="--prefer-binary" \
@@ -22,7 +22,7 @@ pip-compile --resolver=backtracking --annotation-style=line \
     dependencies/parsers/eelsdb/pyproject.toml \
     pyproject.toml
 
-pip-compile --resolver=backtracking --annotation-style=line \
+pip-compile -r -U --resolver=backtracking --annotation-style=line \
     --extra=dev --extra=infrastructure --extra=parsing \
     --output-file=requirements-dev.txt \
     --pip-args="--prefer-binary" \
diff --git a/tests/app/v1/routers/test_metainfo.py b/tests/app/v1/routers/test_metainfo.py
index b2a65ab51175cdc09e5498c113ef1567e0edd254..c8a735ee4524c74c72c3ef85025b5c13ad5c481d 100644
--- a/tests/app/v1/routers/test_metainfo.py
+++ b/tests/app/v1/routers/test_metainfo.py
@@ -197,9 +197,9 @@ def test_upload_and_download(
         EntryArchive.m_from_dict(entry_data, m_context=client_context())
 
     # 7. now test if client side can read the package using non-versioned package
-    entry_data[
-        'm_def'
-    ] = f'/upload/{upload_1_id}/raw/{schema_file_name}#/definitions/section_definitions/1'
+    entry_data['m_def'] = (
+        f'/upload/{upload_1_id}/raw/{schema_file_name}#/definitions/section_definitions/1'
+    )
     entry_data = EntryArchive.m_from_dict(entry_data, m_context=client_context())
     assert entry_data.test_quantity == 'new_value'
 
@@ -320,9 +320,9 @@ def test_two_schemas(
     )
 
     entry_data = response.json()['data']['archive']['data']
-    entry_data[
-        'chemical'
-    ] = f'/entries/{generate_entry_id(processed.upload_id, "chemical.archive.json")}/archive#/data'
+    entry_data['chemical'] = (
+        f'/entries/{generate_entry_id(processed.upload_id, "chemical.archive.json")}/archive#/data'
+    )
     # get data in absence of original schema files
     entry = EntryArchive.m_from_dict(entry_data, m_context=ClientContext())
 
diff --git a/tests/archive/test_archive.py b/tests/archive/test_archive.py
index 122ec3d998919e052ae02635439f40b2c866c403..ee337d972247d27047a8bb140e1ab035081c7621 100644
--- a/tests/archive/test_archive.py
+++ b/tests/archive/test_archive.py
@@ -387,9 +387,10 @@ def test_convert(tmp):
 
     convert_archive(config.normalize.springer_db_path, transform=rename)
 
-    with read_archive(tmp_archive) as springer_new, read_archive(
-        config.normalize.springer_db_path
-    ) as springer_old:
+    with (
+        read_archive(tmp_archive) as springer_new,
+        read_archive(config.normalize.springer_db_path) as springer_old,
+    ):
         for uuid, entry in springer_old.items():
             assert uuid in springer_new
             assert to_json(springer_new[uuid]) == to_json(entry)
diff --git a/tests/datamodel/test_datamodel.py b/tests/datamodel/test_datamodel.py
index d91900e48d1716b9826f79f92a26f8afb6e03567..5be9347c7d481a03706333d67aca74a70d938a65 100644
--- a/tests/datamodel/test_datamodel.py
+++ b/tests/datamodel/test_datamodel.py
@@ -19,6 +19,7 @@
 """
 A generator for random test calculations.
 """
+
 import random
 from essential_generators import DocumentGenerator
 import pytest
diff --git a/tests/parsing/test_nexus.py b/tests/parsing/test_nexus.py
index 65f193d3d6dd817eb5f7750ac86ff80aeb9cb7a1..197aa88d0d24a36d955193069d4a0780d441efad 100644
--- a/tests/parsing/test_nexus.py
+++ b/tests/parsing/test_nexus.py
@@ -1,6 +1,4 @@
-"""This is a code that performs several tests on nexus tool
-
-"""
+"""This is a code that performs several tests on nexus tool"""
 #
 # Copyright The NOMAD Authors.
 #
diff --git a/tests/parsing/test_parsing.py b/tests/parsing/test_parsing.py
index f7382c40d9cdf5099d2b5c804752d141bb8ddcc6..db25370daac7be412687ffbb1d391bf45d5e5302 100644
--- a/tests/parsing/test_parsing.py
+++ b/tests/parsing/test_parsing.py
@@ -38,7 +38,7 @@ parser_examples = [
     ('parsers/vasp', 'tests/data/parsers/vasp_compressed/vasp.xml.gz'),
     ('parsers/vasp', 'tests/data/parsers/vasp_outcar/OUTCAR'),
     ('parsers/fhi-aims', 'tests/data/parsers/fhi-aims/aims.out'),
-    ('parsers/fhi-vibes', 'tests/data/parsers/fhi-vibes/molecular_dynamics.nc'),
+    # ('parsers/fhi-vibes', 'tests/data/parsers/fhi-vibes/molecular_dynamics.nc'),
     ('parsers/cp2k', 'tests/data/parsers/cp2k/si_bulk8.out'),
     ('parsers/crystal', 'tests/data/parsers/crystal/si.out'),
     ('parsers/cpmd', 'tests/data/parsers/cpmd/geo_output.out'),
@@ -101,7 +101,7 @@ for parser, mainfile in parser_examples:
         fixed_parser_examples.append((parser, mainfile))
 parser_examples = fixed_parser_examples
 
-correct_num_output_files = 126
+correct_num_output_files = 125
 
 
 def create_reference(data, pretty):
diff --git a/tests/utils.py b/tests/utils.py
index 64923eea83dc33a865f4d3353b70a0b5cef8a405..d9f452963760ee31e67593429061cc04019e3548 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -16,7 +16,7 @@
 # limitations under the License.
 #
 
-""" Methods to help with testing of nomad@FAIRDI."""
+"""Methods to help with testing of nomad@FAIRDI."""
 
 from typing import List, Union, Dict, Any
 import urllib.parse