diff --git a/.github/release.yml b/.github/release.yml
new file mode 100644
index 0000000000..a961339c9f
--- /dev/null
+++ b/.github/release.yml
@@ -0,0 +1,26 @@
+changelog:
+  categories:
+    - title: Breaking Changes 🛠
+      labels:
+        - breaking-change
+    - title: Server
+      labels:
+        - 🗄️server
+    - title: Mobile
+      labels:
+        - 📱mobile
+    - title: Web
+      labels:
+        - 🖥️web
+    - title: Machine Learning
+      labels:
+        - 🧠machine-learning
+    - title: CLI
+      labels:
+        - cli
+    - title: Documentation
+      labels:
+        - documentation
+    - title: Dependency updates
+      labels:
+        - renovate
diff --git a/.github/workflows/pr-require-label.yml b/.github/workflows/pr-require-label.yml
new file mode 100644
index 0000000000..6bf54eacf1
--- /dev/null
+++ b/.github/workflows/pr-require-label.yml
@@ -0,0 +1,13 @@
+name: Enforce PR labels
+
+on:
+  pull_request:
+    types: [labeled, unlabeled, opened, edited, synchronize]
+jobs:
+  enforce-label:
+    name: Enforce label
+    runs-on: ubuntu-latest
+    steps:
+    - if: toJson(github.event.pull_request.labels) == '[]'
+      run: exit 1
+
diff --git a/renovate.json b/renovate.json
index 928d6783a1..987f0198db 100644
--- a/renovate.json
+++ b/renovate.json
@@ -71,5 +71,6 @@
     "vector_map_tiles",
     "flutter_map",
     "flutter_map_heatmap"
-  ]
+  ],
+  "labels": ["renovate"]
 }