diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts
index e2bfafe7..469ef59c 100644
--- a/src/@types/global.d.ts
+++ b/src/@types/global.d.ts
@@ -31,6 +31,12 @@ declare global {
         // https://developer.mozilla.org/en-US/docs/Web/API/InstallTrigger
         InstallTrigger: any;
     }
+
+    interface Navigator {
+        // PWA badging extensions https://w3c.github.io/badging/
+        setAppBadge?(count: number): Promise<void>;
+        clearAppBadge?(): Promise<void>;
+    }
 }
 
 // add method which is missing from the node typing
diff --git a/src/vector/init.tsx b/src/vector/init.tsx
index 82c5931b..043ae0ba 100644
--- a/src/vector/init.tsx
+++ b/src/vector/init.tsx
@@ -26,6 +26,7 @@ import * as React from "react";
 import * as languageHandler from "matrix-react-sdk/src/languageHandler";
 import SettingsStore from "matrix-react-sdk/src/settings/SettingsStore";
 import ElectronPlatform from "./platform/ElectronPlatform";
+import PWAPlatform from "./platform/PWAPlatform";
 import WebPlatform from "./platform/WebPlatform";
 import PlatformPeg from "matrix-react-sdk/src/PlatformPeg";
 import SdkConfig from "matrix-react-sdk/src/SdkConfig";
@@ -39,8 +40,10 @@ export const rageshakePromise = initRageshake();
 export function preparePlatform() {
     if (window.ipcRenderer) {
         console.log("Using Electron platform");
-        const plaf = new ElectronPlatform();
-        PlatformPeg.set(plaf);
+        PlatformPeg.set(new ElectronPlatform());
+    } else if (window.matchMedia('(display-mode: standalone)').matches) {
+        console.log("Using PWA platform");
+        PlatformPeg.set(new PWAPlatform());
     } else {
         console.log("Using Web platform");
         PlatformPeg.set(new WebPlatform());
diff --git a/src/vector/platform/PWAPlatform.ts b/src/vector/platform/PWAPlatform.ts
new file mode 100644
index 00000000..cca3a8e7
--- /dev/null
+++ b/src/vector/platform/PWAPlatform.ts
@@ -0,0 +1,29 @@
+/*
+Copyright 2020 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import WebPlatform from "./WebPlatform";
+
+export default class PWAPlatform extends WebPlatform {
+    setNotificationCount(count: number) {
+        if (!navigator.setAppBadge) return super.setNotificationCount(count);
+        if (this.notificationCount === count) return;
+        this.notificationCount = count;
+
+        navigator.setAppBadge(count).catch(e => {
+            console.error("Failed to update PWA app badge", e);
+        });
+    }
+}