diff --git a/aleksis/core/migrations/0037_add_static_content_widget.py b/aleksis/core/migrations/0037_add_static_content_widget.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb4e810a614c1357243bdda4c5ac42b7f844058a
--- /dev/null
+++ b/aleksis/core/migrations/0037_add_static_content_widget.py
@@ -0,0 +1,27 @@
+# Generated by Django 3.2.12 on 2022-02-23 18:03
+
+import ckeditor.fields
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0036_additionalfields_helptext_required'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='StaticContentWidget',
+            fields=[
+                ('dashboardwidget_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.dashboardwidget')),
+                ('content', ckeditor.fields.RichTextField(verbose_name='Content')),
+            ],
+            options={
+                'verbose_name': 'Static content widget',
+                'verbose_name_plural': 'Static content widgets',
+            },
+            bases=('core.dashboardwidget',),
+        ),
+    ]
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index 07fdaca69b7551e26078365a8f4e583dd5d02120..03ea0320f11220dc2c392188d1bf3b7807dfeffd 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -29,6 +29,7 @@ import customidenticon
 import jsonstore
 from cachalot.api import cachalot_disabled
 from cache_memoize import cache_memoize
+from ckeditor.fields import RichTextField
 from django_celery_results.models import TaskResult
 from django_cte import CTEQuerySet, With
 from dynamic_preferences.models import PerInstancePreferenceModel
@@ -988,6 +989,19 @@ class ExternalLinkWidget(DashboardWidget):
         verbose_name_plural = _("External link widgets")
 
 
+class StaticContentWidget(DashboardWidget):
+    template = "core/dashboard_widget/static_content_widget.html"
+
+    content = RichTextField(verbose_name=_("Content"))
+
+    def get_context(self, request):
+        return {"title": self.title, "content": self.content}
+
+    class Meta:
+        verbose_name = _("Static content widget")
+        verbose_name_plural = _("Static content widgets")
+
+
 class DashboardWidgetOrder(ExtensibleModel):
     widget = models.ForeignKey(
         DashboardWidget, on_delete=models.CASCADE, verbose_name=_("Dashboard widget")
diff --git a/aleksis/core/templates/core/dashboard_widget/static_content_widget.html b/aleksis/core/templates/core/dashboard_widget/static_content_widget.html
new file mode 100644
index 0000000000000000000000000000000000000000..96e5549d5890e4cc95dbe6b4a843f1b1612c5d7f
--- /dev/null
+++ b/aleksis/core/templates/core/dashboard_widget/static_content_widget.html
@@ -0,0 +1,10 @@
+{% load html_helpers %}
+
+<div class="card" style="padding: 2em">
+	<div class="card-title">
+		{{ title }}
+	</div>
+        <div class="card-text">
+		{{ content|add_class_to_el:"ul, browser-default"|safe }}
+        </div>
+</div>