diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 3b4a70be33ebf01ed8c37cdff7e93ceb0471aef2..a89ede4e3bad077ba26b5128c6ab8861854bcdb7 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -9,6 +9,11 @@ and this project adheres to `Semantic Versioning`_.
 Unreleased
 ----------
 
+Changed
+~~~~~~~
+
+* PWA icons can now be marked maskable
+
 Fixed
 ~~~~~
 
diff --git a/aleksis/core/preferences.py b/aleksis/core/preferences.py
index fe29f220f211616bf57d08c04e87a95b60c84365..f1fb0227eab16a152f29918e91b37d0808471812 100644
--- a/aleksis/core/preferences.py
+++ b/aleksis/core/preferences.py
@@ -112,6 +112,17 @@ class PWAIcon(PublicFilePreferenceMixin, FilePreference):
     required = False
 
 
+@site_preferences_registry.register
+class PWAIconMaskable(BooleanPreference):
+    """PWA icon is maskable."""
+
+    section = theme
+    name = "pwa_icon_maskable"
+    verbose_name = _("PWA-Icon is maskable")
+    default = True
+    required = False
+
+
 @site_preferences_registry.register
 class MailOutName(StringPreference):
     """Mail out name of your AlekSIS instance."""
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index ec38875ad876f6cc7f6b8943a70254a28704195b..539807bf19434b3ae812afe9fa8f317063be8654 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -175,6 +175,7 @@ class ManifestView(View):
             {
                 "src": favicon_img.faviconImage.url,
                 "sizes": f"{favicon_img.size}x{favicon_img.size}",
+                "purpose": "maskable" if prefs["theme__pwa_icon_maskable"] else "any",
             }
             for favicon_img in pwa_imgs
         ]