diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 23b70354b00deccfb1b1f0b8afc1693df62f9e78..4ef9ab14e4cde7d69eca8a3363470cea40925e6b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -16,7 +16,9 @@ stages:
     - ssh-keyscan -p 10022 git.xfel.eu > $CI_PROJECT_DIR/.ssh/known_hosts
     - ls  $CI_PROJECT_DIR/.ssh
     - echo $GIT_SSH_COMMAND
-    - python3 -m venv .venv --clear
+    - pyenv install 3.11
+    - pyenv versions
+    - python3.11 -m venv .venv --clear
     - source .venv/bin/activate
     - python3 -m pip install --upgrade pip setuptools wheel
 
diff --git a/pyproject.toml b/pyproject.toml
index 9b2d60a2d97e513e063f6b3b742407686218413b..bb8aaac00a361d820b88b932a19f1896a5b881b1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,5 +1,5 @@
 [build-system]
-requires = ["cython==0.29.21", "numpy==1.20.3", "setuptools>=40.8.0", "wheel"]
+requires = ["cython==3.0.8", "numpy==1.26.4", "setuptools>=40.8.0", "wheel"]
 
 [tool.isort]
 profile = "black"
diff --git a/setup.py b/setup.py
index 5de8022951277e52d50623c05e9630c4cff12e81..f3e60d2faa1049405cd2ded8dd415a71e8634b99 100644
--- a/setup.py
+++ b/setup.py
@@ -53,67 +53,68 @@ for ctypes in notebooks.values():
 data_files = list(filter(None, data_files))  # Get rid of `None` entries
 
 install_requires = [
-        "Cython==0.29.21",
-        "Jinja2==2.11.2",
-        "markupsafe==2.0.1",
-        "astcheck==0.3.0",
+        "Cython==3.0.8",
+        "Jinja2==3.1.3",
+        "astcheck==0.4.0",
         "cfelpyutils==2.0.6",
         "calibration_client==11.3.0",
-        "dill==0.3.0",
-        "docutils==0.17.1",
-        "dynaconf==3.1.4",
+        "dill==0.3.8",
+        "docutils==0.20.1",
+        "dynaconf==3.2.4",
         "dynflatfield==1.0.0",
         "env_cache==0.1",
-        "extra_data==1.15.1",
-        "extra_geom==1.10.0",
-        "gitpython==3.1.0",
-        "h5py==3.5.0",
-        "iminuit==1.3.8",
-        "ipykernel==5.1.4",
-        "ipyparallel==6.2.4",
-        "ipython==7.12.0",
+        "extra_data==1.16.0",
+        "extra_geom==1.11.0",
+        "gitpython==3.1.42",
+        "h5py==3.10.0",
+        "ipykernel==6.29.3",
+        "ipyparallel==8.6.1",
+        "ipython==8.22.1",
         "ipython_genutils==0.2.0",
-        "jupyter-core==4.10.0",
-        "jupyter_client==7.3.4",
-        "jupyter_console==6.1.0",
+        "jupyter-core==5.7.1",
+        "jupyter_client==8.6.0",
+        "jupyter_console==6.6.3",
         "kafka-python==2.0.2",
-        "lxml==4.5.0",
-        "markupsafe==2.0.1",
-        "matplotlib==3.4.2",
+        "lxml==5.1.0",
+        "markupsafe==2.1.5",
+        "matplotlib==3.8.3",
         "metadata_client==4.0.0",
-        "nbclient==0.5.1",
-        "nbconvert==5.6.1",
-        "nbformat==5.0.7",
+        "nbclient==0.9.0",
+        "nbconvert==7.16.1",
+        "nbformat==5.9.2",
         "nbparameterise==0.6",
-        "notebook==6.1.5",
-        "numpy==1.20.3",
+        "notebook==7.1.1",
+        "numpy==1.26.4",
         "pasha==0.1.1",
         "pillow==10.3.0",
-        "prettytable==0.7.2",
-        "princess==0.5",
+        "prettytable==3.10.0",
+        "princess==0.6",
         "pymunge==0.1.3",
-        "pypandoc==1.4",
+        "pypandoc==1.13",
         "python-dateutil==2.8.2",
-        "pyyaml==5.3",
-        "pyzmq==23.2.0",
-        "requests==2.22.0",
-        "scikit-learn==0.22.2.post1",
-        "scipy==1.7.0",
+        "pyyaml==6.0.1",
+        "pyzmq==25.1.2",
+        "requests==2.29.0",
+        "scikit-learn==1.4.1.post1",
+        "scipy==1.12.0",
         "sharedmem==0.3.8",
-        "sphinx==1.8.5",
-        "tabulate==0.8.6",
-        "traitlets==4.3.3",
-        "xarray==2022.3.0",
+        "sphinx==7.2.6",
+        "tabulate==0.9.0",
+        "traitlets==5.14.1",
+        "xarray==2024.2.0",
         "EXtra-redu==0.0.8",
-        "rich==12.6.0",
-        "httpx==0.23.0",
+        "rich==13.7.0",
+        "httpx==0.27.0",
 ]
 
 if "readthedocs.org" not in sys.executable:
     install_requires += [
         "iCalibrationDB @ git+ssh://git@git.xfel.eu:10022/detectors/cal_db_interactive.git@2.4.3",  # noqa
-        "XFELDetectorAnalysis @ git+ssh://git@git.xfel.eu:10022/karaboDevices/pyDetLib.git@2.7.0",  # noqa
+        "XFELDetectorAnalysis @ git+ssh://git@git.xfel.eu:10022/karaboDevices/pyDetLib.git@7f79b825cf0a881d4126f2aab4d248cc55da0298",  # noqa
         "CalParrot @ git+ssh://git@git.xfel.eu:10022/calibration/calparrot.git@0.3",  # noqa
+        # iminuit 1.3.8 is compatible with Python 3.11, but there isn't a 3.11
+        # wheel on PyPI, and building directly from source doesn't work.
+        "iminuit @ https://git.xfel.eu/api/v4/projects/4538/packages/generic/iminuit/1.3.8/iminuit-1.3.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",  # noqa
     ]
 
 setup(
@@ -163,7 +164,7 @@ setup(
             "pytest-subprocess",
             "pytest>=5.4.0",
             "testpath",
-            "unittest-xml-reporting==3.0.2",
+            "unittest-xml-reporting==3.2.0",
         ],
         "dev": [
             "nbqa[toolchain]",