diff --git a/pdm.lock b/pdm.lock
index 412b0e3138b9bceb7103085bd1a7fa6617070f77..6137c5a9ec1001e1ef2b885f21c2ffc10bb71a0e 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -5,7 +5,7 @@
 groups = ["default", "auth-ldap", "auth-oauth", "auth-saml", "dev"]
 strategy = ["inherit_metadata"]
 lock_version = "4.5.0"
-content_hash = "sha256:a9b84acbfcc9d879802fa8f81de993b8b24c2594642836253ea0b885a33132a4"
+content_hash = "sha256:724b4e719780cf213f4d1e15ff86e2f807d6c595b2e54595523c6fbd3615e247"
 
 [[metadata.targets]]
 requires_python = ">=3.12"
diff --git a/pyproject.toml b/pyproject.toml
index 92ba9d53552c7541e34d09ef45866b1cc2721926..e680be99185f4a18805833978ad6dd6d3cd3cc9f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -10,17 +10,17 @@ requires-python = ">=3.12"
 license = {text = "EUPL-1.2"}
 
 dependencies = [
-    "weasyprint",
-    "jinja2",
-    "flask[async]>=3.0.3",
-    "flask-sqlalchemy",
-    "flask-wtf",
-    "uuid7",
-    "psycopg",
-    "flask-weasyprint",
-    "python-webpack-boilerplate",
+    "weasyprint~=62.3",
+    "jinja2~=3.1",
+    "flask[async]~=3.0",
+    "flask-sqlalchemy~=3.1",
+    "flask-wtf~=1.2",
+    "uuid7~=0.1",
+    "psycopg~=3.2",
+    "flask-weasyprint~=1.1",
+    "python-webpack-boilerplate~=1.0",
     "pyipp @ git+https://github.com/ctalkington/python-ipp",
-    "Flask-Multipass>=0.5.5",
+    "Flask-Multipass~=0.5",
 ]
 
 [project.optional-dependencies]
@@ -36,11 +36,11 @@ auth-oauth = [
 
 [tool.pdm.dev-dependencies]
 dev = [
-    "python-dotenv",
-    "ruff>=0.6.3",
-    "python-lsp-ruff>=2.2.2",
-    "pylsp-rope>=0.1.16",
-    "flask-shell-ipython>=0.5.3",
+    "python-dotenv~=1.0",
+    "ruff~=0.6",
+    "python-lsp-ruff~=2.2",
+    "pylsp-rope~=0.1",
+    "flask-shell-ipython~=0.5",
 ]
 
 [tool.pdm.scripts]