diff --git a/.ruff.toml b/.ruff.toml
index a6ddc49a23a8912a023ae89b8e5cae9ffc9e6465..a3fa4a23bce715f7a0266e88ebc393da1646b4e2 100644
--- a/.ruff.toml
+++ b/.ruff.toml
@@ -1,7 +1,21 @@
 line-length = 160
 extend-exclude = ["venv", ".tox", "migrations"]
 
-extend-select = ["C4", "DTZ", "E", "F", "G", "I002", "INT", "PTH", "RUF005", "T20", "TID", "W"]
+extend-select = [
+    "C4",
+    "DTZ",
+    "E",
+    "F",
+    "G",
+    "I002",
+    "INT",
+    "PTH",
+    "RUF005",
+    "RUF013",
+    "T20",
+    "TID",
+    "W",
+]
 ignore = ["TID252", "TD002"]
 
 [format]
diff --git a/src/api/views/maps.py b/src/api/views/maps.py
index 06ff9e3ba75727cc2c135f651fbe07d8558bcb38..ff9324649068afa2e01ee93ed576d7f152abcf75 100644
--- a/src/api/views/maps.py
+++ b/src/api/views/maps.py
@@ -13,7 +13,7 @@ from .mixins import ConferenceSlugMixin
 _cts = {}  # cache of CoordTransforms (if needed)
 
 
-def get_field_geojson(value, srid: int, ct_cache: dict = None):
+def get_field_geojson(value, srid: int, ct_cache: dict | None = None):
     if value.srid != srid:
         if ct_cache is None:
             ct_cache = {}
diff --git a/src/core/models/schedules.py b/src/core/models/schedules.py
index 0f3ed6c1e783d24a3dd8d693ae351463ec6306a8..974ee058374bf8bebdbf3616a5af01ce73a62a7e 100644
--- a/src/core/models/schedules.py
+++ b/src/core/models/schedules.py
@@ -106,7 +106,7 @@ class ScheduleSource(models.Model):
         deadline = latest_import.start + self.import_timeout
         return timezone.now() < deadline
 
-    def get_or_create_mapping(self, mapping_type, source_id, create_local_object=True, source_uuid=None, hints: dict = None):
+    def get_or_create_mapping(self, mapping_type, source_id, create_local_object=True, source_uuid=None, hints: dict | None = None):
         """
         Fetches the local object mapped by the given type and id.
         If the mapping does not exist yet, a new one is created.
diff --git a/src/core/models/voucher.py b/src/core/models/voucher.py
index e6347dac2d391237f85272ec77f8c8bc4463b944..1f1ae163a8a9b0e6884e0279bf6471c0cb305ea8 100644
--- a/src/core/models/voucher.py
+++ b/src/core/models/voucher.py
@@ -157,7 +157,7 @@ class Voucher(models.Model):
         return html
 
     @classmethod
-    def do_auto_assignments(cls, conference: Conference = None, assemblies: List[Assembly] = None) -> int:
+    def do_auto_assignments(cls, conference: Conference = None, assemblies: List[Assembly] | None = None) -> int:
         qs = cls.objects.filter(conference=conference) if conference is not None else cls.objects.all()
         qs = qs.filter(enabled=True)
         qs = qs.filter(target__in=Voucher.ASSEMBLY_TARGETS)
diff --git a/src/plainui/views.py b/src/plainui/views.py
index cacc5170141e5a6e197bfecd37cbf2721ec353bd..d004ab11d890e5f5b3d106c50ae75108fdbce62b 100644
--- a/src/plainui/views.py
+++ b/src/plainui/views.py
@@ -1380,7 +1380,7 @@ class PersonalMessageDeleteView(ConferenceRequiredMixin, View):
 class IndexView(ConferenceRequiredMixin, TemplateView):
     template_name = 'plainui/index.html'
 
-    def _fetch_page(self, slug, default_title: str = None, default_body: str = None):
+    def _fetch_page(self, slug, default_title: str | None = None, default_body: str | None = None):
         try:
             static_page = StaticPage.objects.conference_accessible(conference=self.conf, language=get_language()).get(slug=slug)
         except StaticPage.DoesNotExist: