diff --git a/pyproject.toml b/pyproject.toml
index 7cc300260a238d57bc21ec225c5e0cb73a7a9d5a..17d1f7827a441a13794ff2713ecefaa61a19efed 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -28,7 +28,7 @@ name = "gitlab"
 url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
 priority = "supplemental"
 [tool.poetry.dependencies]
-python = "^3.9"
+python = "^3.10"
 aleksis-core = "^3.0"
 python-barcode = "^0.15.0"
 django-formtools = "^2.3"
@@ -40,23 +40,9 @@ kort = "aleksis.apps.kort.apps:DefaultConfig"
 
 [tool.poetry.group.dev.dependencies]
 django-stubs = "^4.2"
-
 safety = "^2.3.5"
 
-flake8 = "^6.0.0"
-flake8-django = "^1.0.0"
-flake8-fixme = "^1.1.1"
-flake8-mypy = "^17.8.0"
-flake8-bandit = "^4.1.1"
-flake8-builtins = "^2.0.0"
-flake8-docstrings = "^1.5.0"
-flake8-rst-docstrings = "^0.3.0"
-
-black = ">=21.0"
-flake8-black = "^0.3.0"
-
-isort = "^5.0.0"
-flake8-isort = "^6.0.0"
+ruff = "^0.1.5"
 
 curlylint = "^0.13.0"
 
@@ -79,10 +65,6 @@ sphinxcontrib-svg2pdfconverter = "^1.1.1"
 sphinx-autodoc-typehints = "^1.7"
 sphinx_material = "^0.0.35"
 
-[tool.black]
-line-length = 100
-exclude = "/migrations/"
-
 [tool.curlylint]
 include = '\.html'
 
@@ -95,6 +77,21 @@ meta_viewport = true
 no_autofocus = true
 tabindex_no_positive = true
 
+
+[tool.ruff]
+exclude = ["migrations", "tests"]
+line-length = 100
+
+[tool.ruff.lint]
+select = ["E", "F", "UP", "B", "SIM", "I", "DJ", "A", "S"]
+ignore = ["UP034", "UP015", "B028"]
+
+[tool.ruff.isort]
+known-first-party = ["aleksis"]
+section-order = ["future", "standard-library", "django", "third-party", "first-party", "local-folder"]
+
+[tool.ruff.isort.sections]
+django = ["django"]
 [build-system]
 requires = ["poetry-core>=1.0.0"]
 build-backend = "poetry.core.masonry.api"