diff --git a/images/friendica-maskable-192.png b/images/friendica-maskable-192.png
new file mode 100644
index 0000000000..9acfb80f30
Binary files /dev/null and b/images/friendica-maskable-192.png differ
diff --git a/images/friendica-maskable-512.png b/images/friendica-maskable-512.png
new file mode 100644
index 0000000000..b454089f86
Binary files /dev/null and b/images/friendica-maskable-512.png differ
diff --git a/images/friendica-maskable.svg b/images/friendica-maskable.svg
new file mode 100644
index 0000000000..77864d1a55
--- /dev/null
+++ b/images/friendica-maskable.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 1920 1920">
+	<rect fill="#1872a2" width="1920" height="1920"/>
+	<path fill="#febf19" d="M390 595q0-84 61-145 60-60 144-60h730q85 0 145 60 60 61 60 145v730q0 84-60 145-60 60-145 60H595q-84 0-144-60-60-61-61-145zm935-160h-183v274H778v231l363-2 1 273H778v274h547q67 0 114-47 46-46 45-113V595q0-67-45-113-46-46-114-47z"/>
+</svg>
diff --git a/src/Module/Manifest.php b/src/Module/Manifest.php
index 2ae8009e25..a554f77526 100644
--- a/src/Module/Manifest.php
+++ b/src/Module/Manifest.php
@@ -31,8 +31,6 @@ class Manifest extends BaseModule
 	{
 		$config = DI::config();
 
-		$touch_icon = $config->get('system', 'touch_icon') ?: 'images/friendica-192.png';
-
 		$theme = DI::config()->get('system', 'theme');
 
 		$manifest = [
@@ -44,18 +42,6 @@ class Manifest extends BaseModule
 			'lang'          => $config->get('system', 'language'),
 			'dir'           => 'auto',
 			'categories'    => ['social network', 'internet'],
-			'icons'         => [
-				[
-					'src'   => DI::baseUrl()->get() . '/' . $touch_icon,
-					'sizes' => '192x192',
-					'type'  => 'image/png',
-				],
-				[
-					'src'   => DI::baseUrl()->get() . '/' . $touch_icon,
-					'sizes' => '512x512',
-					'type'  => 'image/png',
-				],
-			],
 			'shortcuts'     => [
 				[
 					'name'  => 'Latest posts',
@@ -80,6 +66,65 @@ class Manifest extends BaseModule
 			]
 		];
 
+		/// @TODO If the admin provides their own touch icon, the manifest will regress
+		/// to a smaller set of icons that do not follow the web app manifest spec.
+		/// There should be a mechanism to allow the admin to provide all of the 6
+		/// different images that are required for a fully valid web app manifest.
+		$touch_icon = $config->get('system', 'touch_icon');
+		if($touch_icon){
+			$manifest['icons'] = [
+				[
+					'src'   => DI::baseUrl()->get() . '/' . $touch_icon,
+					'sizes' => '192x192',
+					'type'  => 'image/png',
+				],
+				[
+					'src'   => DI::baseUrl()->get() . '/' . $touch_icon,
+					'sizes' => '512x512',
+					'type'  => 'image/png',
+				],
+			];
+		} else {
+			$manifest['icons'] = [
+				[
+					'src'   => DI::baseUrl()->get() . '/images/friendica.svg',
+					'sizes' => 'any',
+					'type'  => 'image/svg+xml',
+					'purpose' => 'any',
+				],
+				[
+					'src'   => DI::baseUrl()->get() . '/images/friendica-192.png',
+					'sizes' => '192x192',
+					'type'  => 'image/png',
+					'purpose' => 'any',
+				],
+				[
+					'src'   => DI::baseUrl()->get() . '/images/friendica-512.png',
+					'sizes' => '512x512',
+					'type'  => 'image/png',
+					'purpose' => 'any',
+				],
+				[
+					'src'   => DI::baseUrl()->get() . '/images/friendica-maskable.svg',
+					'sizes' => 'any',
+					'type'  => 'image/svg+xml',
+					'purpose' => 'maskable',
+				],
+				[
+					'src'   => DI::baseUrl()->get() . '/images/friendica-maskable-192.png',
+					'sizes' => '192x192',
+					'type'  => 'image/png',
+					'purpose' => 'maskable',
+				],
+				[
+					'src'   => DI::baseUrl()->get() . '/images/friendica-maskable-512.png',
+					'sizes' => '512x512',
+					'type'  => 'image/png',
+					'purpose' => 'maskable',
+				],
+			];
+		}
+
 		if ($background_color = Core\Theme::getBackgroundColor($theme)) {
 			$manifest['background_color'] = $background_color;
 		}