diff --git a/src/api/endpoints/posts/reactions/create.ts b/src/api/endpoints/posts/reactions/create.ts
index eecb92812..d537463df 100644
--- a/src/api/endpoints/posts/reactions/create.ts
+++ b/src/api/endpoints/posts/reactions/create.ts
@@ -7,7 +7,9 @@ import Post from '../../../models/post';
 import Watching from '../../../models/post-watching';
 import notify from '../../../common/notify';
 import watch from '../../../common/watch-post';
-import { publishPostStream } from '../../../event';
+import { publishPostStream, pushSw } from '../../../event';
+import serializePost from '../../../serializers/post';
+import serializeUser from '../../../serializers/user';
 
 /**
  * React to a post
@@ -87,6 +89,12 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
 		reaction: reaction
 	});
 
+	pushSw(post.user_id, 'reaction', {
+		user: await serializeUser(user, post.user_id),
+		post: await serializePost(post, post.user_id),
+		reaction: reaction
+	});
+
 	// Fetch watchers
 	Watching
 		.find({
diff --git a/src/web/app/common/scripts/compose-notification.ts b/src/web/app/common/scripts/compose-notification.ts
index 181dca734..d0e0c2098 100644
--- a/src/web/app/common/scripts/compose-notification.ts
+++ b/src/web/app/common/scripts/compose-notification.ts
@@ -1,4 +1,5 @@
 import getPostSummary from '../../../../common/get-post-summary';
+import getReactionEmoji from '../../../../common/get-reaction-emoji';
 
 type Notification = {
 	title: string;
@@ -39,6 +40,13 @@ export default function(type, data): Notification {
 				icon: data.user.avatar_url + '?thumbnail&size=64'
 			};
 
+		case 'reaction':
+			return {
+				title: `${data.user.name}: ${getReactionEmoji(data.reaction)}:`,
+				body: getPostSummary(data.post),
+				icon: data.user.avatar_url + '?thumbnail&size=64'
+			};
+
 		case 'unread_messaging_message':
 			return {
 				title: `${data.user.name}さんからメッセージ:`,