diff --git a/aleksis/core/preferences.py b/aleksis/core/preferences.py
index ad90929ef8f4332daf50ef3485b47383f79a9dea..9c81cf4c82fe573ba8787d309b0d4bbfba1751ff 100644
--- a/aleksis/core/preferences.py
+++ b/aleksis/core/preferences.py
@@ -252,3 +252,12 @@ class DataChecksEmailsRecipientGroups(ModelMultipleChoicePreference):
     default = []
     model = Group
     verbose_name = _("Email recipient groups for data checks problem emails")
+
+
+@site_preferences_registry.register
+class AnonymousDashboard(BooleanPreference):
+    section = general
+    name = "anonymous_dashboard"
+    default = False
+    required = False
+    verbose_name = _("Show dashboard to users without login")
diff --git a/aleksis/core/rules.py b/aleksis/core/rules.py
index fb8845abef6fa276e1671a3a78dbd8182e001e7f..cf29b8790a310573d4719f89230a200850ea9bc8 100644
--- a/aleksis/core/rules.py
+++ b/aleksis/core/rules.py
@@ -9,12 +9,14 @@ from .util.predicates import (
     is_current_person,
     is_group_owner,
     is_notification_recipient,
+    is_site_preference_set,
 )
 
 rules.add_perm("core", rules.always_allow)
 
 # View dashboard
-rules.add_perm("core.view_dashboard", has_person)
+view_dashboard_predicate = is_site_preference_set("general", "anonymous_dashboard") | has_person
+rules.add_perm("core.view_dashboard", view_dashboard_predicate)
 
 # View notifications
 rules.add_perm("core.view_notifications", has_person)
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index 3aa8fa72f0de38298b56ef487fa3bea1f0a32cc8..b9d7d502cdfee47f2490650d3822d661e4abf314 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -54,6 +54,7 @@ from .models import (
     DashboardWidget,
     DashboardWidgetOrder,
     DataCheckResult,
+    DummyPerson,
     Group,
     GroupType,
     Notification,
@@ -75,7 +76,7 @@ from .tables import (
 )
 from .util import messages
 from .util.apps import AppConfig
-from .util.core_helpers import objectgetter_optional
+from .util.core_helpers import has_person, objectgetter_optional
 from .util.forms import PreferenceLayout
 
 
@@ -99,7 +100,7 @@ def index(request: HttpRequest) -> HttpResponse:
     context["notifications"] = notifications
     context["unread_notifications"] = unread_notifications
 
-    announcements = Announcement.objects.at_time().for_person(request.user.person)
+    announcements = Announcement.objects.at_time().for_person(person)
     context["announcements"] = announcements
 
     if len(widgets) == 0: