diff --git a/aleksis/apps/matrix/model_extensions.py b/aleksis/apps/matrix/model_extensions.py
index 4e0472b2a75acaea8486a95e10982815ef61619f..f666d778b90edcccf71655b51304ee751c2a3f01 100644
--- a/aleksis/apps/matrix/model_extensions.py
+++ b/aleksis/apps/matrix/model_extensions.py
@@ -29,14 +29,14 @@ def _provision_in_matrix(self) -> MatrixRoom:
 @Group.property_
 def matrix_alias(self) -> Optional[str]:
     """Return the alias of the group's room in Matrix."""
-    rooms = [room for room in self.matrix_rooms.all() if type(room) == MatrixRoom]
+    rooms = [room for room in self.matrix_rooms.all() if isinstance(room, MatrixRoom)]
     return rooms[0].alias if rooms else None
 
 
 @Group.property_
 def matrix_room_id(self) -> Optional[str]:
     """Return the ID of the group's room in Matrix."""
-    rooms = [room for room in self.matrix_rooms.all() if type(room) == MatrixRoom]
+    rooms = [room for room in self.matrix_rooms.all() if isinstance(room, MatrixRoom)]
     return rooms[0].room_id if rooms else None
 
 
diff --git a/aleksis/apps/matrix/tasks.py b/aleksis/apps/matrix/tasks.py
index 34ccd15eb6cab43b7d43d8959f7abb577b425149..b47c2fb404ac7559203a4b9b83d8e6f631c29eda 100644
--- a/aleksis/apps/matrix/tasks.py
+++ b/aleksis/apps/matrix/tasks.py
@@ -1,5 +1,5 @@
+from collections.abc import Sequence
 from datetime import timedelta
-from typing import Sequence
 
 from aleksis.apps.matrix.models import MatrixRoom
 from aleksis.core.celery import app
diff --git a/aleksis/apps/matrix/tests/test_matrix.py b/aleksis/apps/matrix/tests/test_matrix.py
index a815655fe4d290d4bbf9fa8fd6daacc11386633b..8c9dbdf80b5e92dfdfb4d9c502daa77175ad1a52 100644
--- a/aleksis/apps/matrix/tests/test_matrix.py
+++ b/aleksis/apps/matrix/tests/test_matrix.py
@@ -1,20 +1,16 @@
-import time
 from datetime import date
 from unittest.mock import call
 
 from django.contrib.auth.models import User
-from django.db.models import Q
 
 import pytest
 import requests
-from celery.result import AsyncResult
 
 from aleksis.apps.matrix.models import MatrixProfile, MatrixRoom, MatrixSpace
 from aleksis.apps.matrix.util.matrix import (
     MatrixException,
     build_url,
     do_matrix_request,
-    get_headers,
 )
 from aleksis.core.models import Group, Person, SchoolTerm
 from aleksis.core.util.core_helpers import get_site_preferences
@@ -27,7 +23,7 @@ SERVER_URL = "http://127.0.0.1:8008"
 def test_connection(synapse):
     assert synapse["listeners"][0]["port"] == 8008
 
-    assert requests.get(SERVER_URL).status_code == requests.codes.ok
+    assert requests.get(SERVER_URL).status_code == requests.codes.ok  # noqa: S113
 
 
 @pytest.fixture
@@ -36,7 +32,7 @@ def matrix_bot_user(synapse):
 
     get_site_preferences()["matrix__homeserver"] = SERVER_URL
 
-    r = requests.post(build_url("register"), json=body)
+    r = requests.post(build_url("register"), json=body)  # noqa: S113
     print(r.text, build_url("register"))
     assert r.status_code == requests.codes.ok
 
@@ -172,7 +168,7 @@ def test_sync_room_members(matrix_bot_user):
     # Get power levels
     r = do_matrix_request("GET", f"rooms/{room.room_id}/state")
     for event in r:
-        if not event["type"] == "m.room.power_levels":
+        if event["type"] != "m.room.power_levels":
             continue
         current_power_levels = event["content"]["users"]
 
@@ -207,7 +203,7 @@ def test_power_levels(matrix_bot_user):
     # Get power levels
     r = do_matrix_request("GET", f"rooms/{room.room_id}/state")
     for event in r:
-        if not event["type"] == "m.room.power_levels":
+        if event["type"] != "m.room.power_levels":
             continue
         current_power_levels = event["content"]["users"]
 
@@ -225,7 +221,7 @@ def test_power_levels(matrix_bot_user):
     # Not reduced here
     r = do_matrix_request("GET", f"rooms/{room.room_id}/state")
     for event in r:
-        if not event["type"] == "m.room.power_levels":
+        if event["type"] != "m.room.power_levels":
             continue
         current_power_levels = event["content"]["users"]
 
@@ -240,7 +236,7 @@ def test_power_levels(matrix_bot_user):
     # Reduced here
     r = do_matrix_request("GET", f"rooms/{room.room_id}/state")
     for event in r:
-        if not event["type"] == "m.room.power_levels":
+        if event["type"] != "m.room.power_levels":
             continue
         current_power_levels = event["content"]["users"]
 
@@ -313,9 +309,6 @@ def test_use_room_sync(matrix_bot_user):
     assert p1.matrix_profile.matrix_id == "@test1:matrix.aleksis.example.org"
 
 
-from django.test import TransactionTestCase, override_settings
-
-
 def test_space_creation(matrix_bot_user):
     parent_group = Group.objects.create(name="Test Group")
     child_1 = Group.objects.create(name="Test Group 1")
@@ -518,7 +511,7 @@ def test_signal_profile_person_changed(matrix_bot_user, mocker):
     g2.members.set([p2])
     g2.owners.set([p4])
 
-    room = MatrixRoom.from_group(g)
+    MatrixRoom.from_group(g)
     room2 = MatrixRoom.from_group(g2)
 
     sync_mock = mocker.patch("aleksis.apps.matrix.tasks.sync_room.delay")
diff --git a/aleksis/apps/matrix/util/matrix.py b/aleksis/apps/matrix/util/matrix.py
index 864a3f6ebbbefc34219dad31b94b0ccdfc8459ae..70662473e95237654d3b230f3ec515f4bab58683 100644
--- a/aleksis/apps/matrix/util/matrix.py
+++ b/aleksis/apps/matrix/util/matrix.py
@@ -29,7 +29,7 @@ def get_headers() -> dict[str, str]:
 def do_matrix_request(method: str, url: str, body: Optional[dict] = None) -> dict[str, Any]:
     """Do a HTTP request to the Matrix Client Server API."""
     while True:
-        res = requests.request(method=method, url=build_url(url), headers=get_headers(), json=body)
+        res = requests.request(method=method, url=build_url(url), headers=get_headers(), json=body)  # noqa: S113
 
         try:
             data = res.json()
diff --git a/pyproject.toml b/pyproject.toml
index 8e260a884ba607ee282278f96b7380725499541c..134e446f39cc2923865be62e5542324444b9f800 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -9,7 +9,7 @@ include = ["CHANGELOG.rst", "LICENCE.rst", "aleksis/**/*.mo"]
 
 description = "AlekSIS (School Information System) — App Matrix (Integration with Matrix/Element)"
 authors = ["Jonathan Weth <dev@jonathanweth.de>"]
-maintainers = ["Jonathan Weth <dev@jonathanweth.de>", "Dominik George <dominik.george@teckids.org>"]
+maintainers = ["Jonathan Weth <jonathan.weth@teckids.org>", "Dominik George <dominik.george@teckids.org>"]
 license = "EUPL-1.2-or-later"
 homepage = "https://aleksis.org"
 repository = "https://edugit.org/AlekSIS/official/AlekSIS-App-Matrix"
@@ -30,7 +30,6 @@ priority = "primary"
 name = "gitlab"
 url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
 priority = "supplemental"
-
 [tool.poetry.dependencies]
 python = "^3.10"
 aleksis-core = "^4.0.0.dev3"
@@ -42,18 +41,16 @@ matrix = "aleksis.apps.matrix.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"
 
 [tool.poetry.group.docs]
 optional = true
@@ -64,20 +61,20 @@ sphinxcontrib-django = "^2.3.0"
 sphinxcontrib-svg2pdfconverter = "^1.1.1"
 sphinx-autodoc-typehints = "^1.7"
 sphinx_material = "^0.0.35"
-
 [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.isort]
+[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.isort.sections]
+[tool.ruff.lint.isort.sections]
 django = ["django"]
 
 [build-system]