diff --git a/pyproject.toml b/pyproject.toml
index c949388cc2ac1202be2ed2b02e736ae0798a5fb4..3d2142b36794d6855fe6bd5b245e2eae9dd6cbf7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -51,18 +51,16 @@ lesrooster = "aleksis.apps.lesrooster.apps:DefaultConfig"
 django-stubs = "^4.2"
 safety = "^2.3.5"
 
-ruff = "^0.1.5"
-
-curlylint = "^0.13.0"
+ruff = "^0.8.2"
 
 [tool.poetry.group.test.dependencies]
-pytest = "^7.2"
-pytest-django = "^4.1"
+pytest = "^8.3"
+pytest-django = "^4.9"
 pytest-django-testing-postgresql = "^0.2"
-pytest-cov = "^4.0.0"
-pytest-sugar = "^0.9.2"
-selenium = "<4.10.0"
-freezegun = "^1.1.0"
+pytest-cov = "^6.0.0"
+pytest-sugar = "^1.0.0"
+selenium = "^4.27.0"
+freezegun = "^1.5.0"
 pytest-mock = "^3.14.0"
 
 [tool.poetry.group.docs]
@@ -87,12 +85,20 @@ no_autofocus = true
 tabindex_no_positive = true
 
 [tool.ruff]
-exclude = ["migrations", "tests"]
+exclude = ["migrations"]
 line-length = 100
 
 [tool.ruff.lint]
 select = ["E", "F", "UP", "B", "SIM", "I", "DJ", "A", "S"]
 ignore = ["UP034", "UP015", "B028"]
+[tool.ruff.lint.extend-per-file-ignores]
+"**/*/tests/**/*.py" = ["S101", "ARG", "FBT", "PLR2004", "S311", "S105"]
+[tool.ruff.lint.isort]
+known-first-party = ["aleksis"]
+section-order = ["future", "standard-library", "django", "third-party", "first-party", "local-folder"]
+
+[tool.ruff.lint.isort.sections]
+django = ["django"]
 
 [tool.ruff.isort]
 known-first-party = ["aleksis"]