diff --git a/aleksis/core/checks.py b/aleksis/core/checks.py
new file mode 100644
index 0000000000000000000000000000000000000000..eefc7e5ab7e12e7ac67ac11871912b049056adb8
--- /dev/null
+++ b/aleksis/core/checks.py
@@ -0,0 +1,29 @@
+from typing import Optional
+
+import django.apps
+from django.core.checks import Tags, Warning, register
+
+from .util.apps import AppConfig
+
+
+@register(Tags.compatibility)
+def check_app_configs_base_class(app_configs: Optional[django.apps] = None, **kwargs) -> None:
+    """ Checks whether all apps derive from AlekSIS's base app config """
+
+    results = []
+
+    if app_configs is None:
+        app_configs = django.apps.get_app_configs()
+
+    for app_config in app_configs:
+        if app_config.name.startswith("aleksis.apps.") and not isinstance(app_config, AppConfig):
+            results.append(
+                Warning(
+                    "App config %s does not derive from aleksis.core.util.apps.AppConfig.",
+                    hint="Ensure the app uses the correct base class for all registry functionality to work.",
+                    obj=app_config,
+                    id="aleksis.core.W001",
+                )
+            )
+
+    return results