diff --git a/src/web/app/boot.js b/src/web/app/boot.js
index a5f0e04d31bcda7e98ff67f31659749d249c97dd..0a3154ad88cfe88c79197383113839ea833ff961 100644
--- a/src/web/app/boot.js
+++ b/src/web/app/boot.js
@@ -92,6 +92,13 @@
 				'\n\n' +
 				'New version of Misskey available. The page will be reloaded.');
 
+			// Clear cache (serive worker)
+			try {
+				navigator.serviceWorker.controller.postMessage('clear');
+			} catch (e) {
+				console.error(e);
+			}
+
 			// Force reload
 			location.reload(true);
 		}
diff --git a/src/web/app/sw.js b/src/web/app/sw.js
index 2074ee39c43bd29a5b8b5164986ba2c5229b59b9..669703b16c050d28a7c0c471eae3dcf8121fe0eb 100644
--- a/src/web/app/sw.js
+++ b/src/web/app/sw.js
@@ -63,3 +63,9 @@ self.addEventListener('push', ev => {
 		});
 	}));
 });
+
+self.addEventListener('message', ev => {
+	if (ev.data == 'clear') {
+		caches.keys().then(keys => keys.forEach(key => caches.delete(key)));
+	}
+});
diff --git a/src/web/assets/help.js b/src/web/assets/help.js
new file mode 100644
index 0000000000000000000000000000000000000000..475c5067898da7620ec1c94eb15fac2f4d6be0a6
--- /dev/null
+++ b/src/web/assets/help.js
@@ -0,0 +1,8 @@
+const yn = window.confirm(
+	'サーバー上に存在しないスクリプトがリクエストされました。お使いのMisskeyのバージョンが古いことが原因の可能性があります。Misskeyを更新しますか?');
+
+if (yn) {
+	location.reload(true);
+} else {
+	alert('問題が解決しない場合はサーバー管理者までお問い合せください。');
+}
diff --git a/src/web/server.ts b/src/web/server.ts
index e368d3e62d8a4705b9bec545f62ccfc4037e0b6e..791b75ce09407a0d01f64b0dee108dd69cb1dbb5 100644
--- a/src/web/server.ts
+++ b/src/web/server.ts
@@ -39,6 +39,7 @@ app.get('/apple-touch-icon.png', (req, res) => res.sendFile(`${__dirname}/assets
 app.use('/assets', express.static(`${__dirname}/assets`, {
 	maxAge: ms('7 days')
 }));
+app.use('/assets/*.js', (req, res) => res.sendFile(`${__dirname}/assets/help.js`));
 app.use('/assets', (req, res) => {
 	res.sendStatus(404);
 });