diff --git a/src/core/locale/de/LC_MESSAGES/django.po b/src/core/locale/de/LC_MESSAGES/django.po
index de11241f08bc95add6e9475847bb76ff6d9c95cf..ff3f6a27a6010a4cc95a0d6b0f8b348b37ce88c8 100644
--- a/src/core/locale/de/LC_MESSAGES/django.po
+++ b/src/core/locale/de/LC_MESSAGES/django.po
@@ -2556,6 +2556,9 @@ msgstr "Das Bild muss die Abmessungen von minimal %(min_width)spx/%(min_height)s
 msgid "Validation__error_image_square"
 msgstr "Das Bild muss quadratisch sein."
 
+msgid "Validation__error_lowercase"
+msgstr "Das Feld darf nur Kleinbuchstaben enthalten."
+
 msgid "Registration"
 msgstr "Registrieren"
 
diff --git a/src/core/locale/en/LC_MESSAGES/django.po b/src/core/locale/en/LC_MESSAGES/django.po
index bf783a463c514c21bdf23d792eb2c9488b5359fb..14cfc2fcf2063fdbcd5cddd68ff2d4495486f321 100644
--- a/src/core/locale/en/LC_MESSAGES/django.po
+++ b/src/core/locale/en/LC_MESSAGES/django.po
@@ -2538,6 +2538,9 @@ msgstr "The image must have the dimensions of minimal %(min_width)spx/%(min_heig
 msgid "Validation__error_image_square"
 msgstr "The image must be square"
 
+msgid "Validation__error_lowercase"
+msgstr "The field may only contain lowercase letters"
+
 msgid "Registration"
 msgstr "Sign Up"
 
diff --git a/src/core/migrations/0170_alter_assembly_slug.py b/src/core/migrations/0170_alter_assembly_slug.py
new file mode 100644
index 0000000000000000000000000000000000000000..ea803500a158bf4f1776b57a56fcde1d72f23522
--- /dev/null
+++ b/src/core/migrations/0170_alter_assembly_slug.py
@@ -0,0 +1,32 @@
+# Generated by Django 5.1.3 on 2024-12-23 01:30
+
+import core.validators
+import django.core.validators
+import re
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("core", "0169_team_teammember"),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name="assembly",
+            name="slug",
+            field=models.SlugField(
+                help_text="Assembly__slug__help",
+                validators=[
+                    django.core.validators.RegexValidator(
+                        re.compile("^[-a-zA-Z0-9_]+\\Z"),
+                        "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.",
+                        "invalid",
+                    ),
+                    core.validators.validate_lower_case,
+                ],
+                verbose_name="Assembly__slug",
+            ),
+        ),
+    ]
diff --git a/src/core/models/assemblies.py b/src/core/models/assemblies.py
index c3497ff6e3e1404f2523368483c376ee960a82c7..2f2a97badeb4ffd271ae4bed5040523d7f76dbe5 100644
--- a/src/core/models/assemblies.py
+++ b/src/core/models/assemblies.py
@@ -10,6 +10,7 @@ from django.conf import settings
 from django.contrib.contenttypes.fields import GenericRelation
 from django.contrib.gis.db import models as gis_models
 from django.core.exceptions import ValidationError
+from django.core.validators import validate_slug
 from django.db import models
 from django.db.models import Q, QuerySet
 from django.template.loader import render_to_string
@@ -33,7 +34,7 @@ from core.models.tags import TaggedItemMixin, TagItem
 from core.models.users import PlatformUser
 from core.predicates import has_perms
 from core.utils import render_markdown_as_text
-from core.validators import FileSizeValidator, ImageDimensionValidator
+from core.validators import FileSizeValidator, ImageDimensionValidator, validate_lower_case
 
 
 @rules.predicate
@@ -110,7 +111,7 @@ class Assembly(TaggedItemMixin, ActivityLogMixin, RulesModel):
 
     id = models.UUIDField(default=uuid4, primary_key=True, editable=False)
     conference = ConferenceReference(related_name='assemblies')
-    slug = models.SlugField(help_text=_('Assembly__slug__help'), verbose_name=_('Assembly__slug'))
+    slug = models.SlugField(help_text=_('Assembly__slug__help'), verbose_name=_('Assembly__slug'), validators=[validate_slug, validate_lower_case])
     name = models.CharField(max_length=200, help_text=_('Assembly__name__help'), verbose_name=_('Assembly__name'))
 
     is_official = models.BooleanField(default=False, help_text=_('Assembly__is_official__help'), verbose_name=_('Assembly__is_official'))
diff --git a/src/core/validators.py b/src/core/validators.py
index d288ef9c886111569de90f3bb1a3970dfe1b33e8..cf62f4ea1b10c12d639a48e0103ab4a91a34f166 100644
--- a/src/core/validators.py
+++ b/src/core/validators.py
@@ -130,3 +130,17 @@ class ImageDimensionValidator:
             other.max_size,
             other.square,
         )
+
+
+def validate_lower_case(value: str) -> None:
+    """
+    A validator function that will check if a string is lowercase
+
+    Raises:
+        ValidationError: Raises a validation error if the string is not lowercase.
+
+    Args:
+        value (str): The string to check
+    """
+    if value != value.lower():
+        raise ValidationError(_('Validation__error_lowercase'), code='lowercase')