Falco
(Falco)
November 12, 2022, 5:44pm
1
Starting today, the Discourse Chat notification allows users to reply inline in the notification itself
The UI for this is different on every OS, as it integrates into the native notification system.
Smartwatch Android Wear OS
Android
Windows
All going well, possible next steps for around this feature would be:
Adding support for inline reactions
Sending inline replies as “in reply to” to the message they are replying
Adding support for inline replies for topics / posts
Handling errors when sending inline replies, be it network or business logic errors.
i18n of the reply button and placeholder
27 Likes
This is a great addition. I was so confused when I thought, “wow, a dynamic example image showing my username”, and then realizing it was just a screenshot of my username.
I love how quickly this chat feature is growing–I can’t wait until the right time to add it to our community. As much as I love Discord, from our business use case, I really don’t want to have another platform to manage and to fragment my users into.
A nice feature to have would be to select one or more chat messages and break them off into a topic.
9 Likes
darkpixlz
(Pyx )
November 12, 2022, 10:45pm
6
When will iOS support happen? I still have to have a 3rd party app to get instant push notifications with content too.
2 Likes
Falco
(Falco)
November 12, 2022, 11:02pm
7
No idea, that’s on Apple. We implement against the open web standard and it works on every OS that implements the spec, like Windows, Android, Chrome OS, etc. One can hope that when/if Apple implements WebPush in 2023 they do it properly, but all we can do is hope.
15 Likes
Falco
(Falco)
May 11, 2026, 8:12pm
8
This was broken for a while, and I have re-added support for it in a more robust way
main ← chat-push-quick-reply
merged 03:36PM - 29 Apr 26 UTC
**Previously**, the "Reply" action on chat web push notifications was silently b… roken — the service worker's chat URL regex stopped matching when chat routes moved to `/chat/c/:slug/:id`, and the chat-specific code lived in core with no thread support, URL encoding, or error handling.
**In this update**, generalize the core service worker into a plugin-extensible action registry, move chat reply handling into the chat plugin with proper thread/encoding/fallback support, and convert single-emoji replies into reactions on the source message (falling back to a regular message post on any failure).
## Architecture
Core (`app/views/static/service-worker.js.erb`) now exposes:
```js
self.registerNotificationActionHandler(action, handler);
```
Push payloads can carry `actions` (Web Notifications API format) and `action_data` (an arbitrary object surfaced to the handler at `event.notification.data.actionData`). The click handler dispatches by `event.action` name and falls back to the existing focus-or-open behavior when no handler matches or a handler throws.
`PushNotificationPusher` forwards `actions` / `action_data` when present.
The chat plugin owns its own service worker (`plugins/chat/assets/javascripts/service-worker.js`), registered via `register_service_worker`. It registers a `chat-reply` handler that:
1. Fetches a CSRF token.
2. If the reply is a single emoji grapheme (detected via `Intl.Segmenter`, with a `\p{Extended_Pictographic}` regex fallback), `PUT`s to `/chat/:channel_id/react/:message_id`.
3. Otherwise — or if the reaction request fails — `POST`s to `/chat/:channel_id` with proper `URLSearchParams` encoding and the source `thread_id` if present.
4. If everything fails, opens the channel so the user can retype.
`Chat::Notifier.push_notification_reply_action(chat_message, user)` builds the payload in the user's locale with `channel_id`, `message_id`, and optional `thread_id`.
`Chat::MessageReactor#react!` resolves raw Unicode via `Emoji.unicode_replacements[emoji] || emoji` before validation, so smartwatch quick-reply chips (which send raw Unicode like `👍🏽` or ZWJ sequences) just work. Existing shortcode callers are unaffected.
## Why this matters
Smartwatch notification UIs expose a single "reply" affordance with canned chips that include short text and emoji. The user can't choose between "send as message" and "react"; they tap a chip and a string comes through. Treating a single-grapheme pictographic reply as a reaction matches user intent on the watch UX without any new product surface.
## Test plan
- [ ] On a chat-enabled site, subscribe to web push notifications.
- [ ] Have another user post a message that mentions you, or a watched channel message.
- [ ] On the resulting OS notification, confirm a "Reply" action button appears.
- [ ] Type a text reply and submit — verify it posts as a message in the right channel/thread.
- [ ] Submit a single emoji (e.g. 👍 or 👍🏽 with skin tone) — verify it lands as a reaction on the source message instead of posting a message.
- [ ] Submit a ZWJ sequence (e.g. 👨👩👧) — verify it lands as a reaction (or falls back to message post if not in the emoji DB).
- [ ] Sign out / let session expire and submit a reply — verify the channel opens as a fallback rather than silently failing.
- [ ] Watch via Wear OS / watchOS quick-reply chips and confirm the same behavior end-to-end.
Now we also capture replies that consist of a single emoji as a reaction, and support chat threads! .
5 Likes
Wow! This is really cool! Any plans to do the same for topics?
1 Like
gilles
May 16, 2026, 9:32am
10
Quick question: does it work on Apple?
Falco
(Falco)
Split this topic
May 16, 2026, 4:02pm
11