Menu β–Ύ β–΄

#408 feat(notifications): React and Mark as Read actions, and group pictures on macOS

closed
nobody
None
2026-11-07
2026-11-07
Anonymous
No

Originally created by: kristofferR

Notifications offered Reply, πŸ‘ and Mute. There was no way to mark a conversation read from its notification, the reaction was always πŸ‘, and πŸ‘ found its message by matching the notification's text in the open conversation, so it needed an English Messenger UI and a navigation of the hidden page. On macOS, group notifications showed the group's name but not its picture.

Mark as Read and React (Ref [#368]). Both call Messenger's own code from the page, never navigate, and never show the window:

  • Mark as Read calls MWLSMarkThreadAsRead, the function behind the inbox's "Mark as read", then confirms the thread's read watermark reached its last activity.
  • React adds the configured reaction to the exact message the notification announced, by Messenger's message id (the notification's tag). Encrypted chats send through the MAW bridge's sendReactionMsg, the way MAWSendOrRemoveReaction does. Regular chats run LSOptimisticUpsertReaction, the way useMWPSendOrUnsendReaction does. Community and channel threads (Reactions V2) are refused. A message from this account, or one from another conversation, is never reacted to.
  • Settings β†’ Notifications β†’ Notification Reaction picks one of Messenger's six default reactions (πŸ‘ by default). The button shows it.
  • The buttons are offered on macOS (one category per action combination, re-registered when the reaction changes), Windows (Reply, React, Mark as Read, Mute, Open: Windows' five-button limit) and Linux, wherever quick actions already were. Mute still needs an English UI; the new actions don't.
  • An action never runs after native has given up on it; a failure opens the conversation as before.
  • The old text-matching πŸ‘ flow and its helpers are removed.

Group pictures on macOS (Ref [#366]). A group notification's INSendMessageIntent now carries the group's own picture as the image for speakableGroupName. It comes from Messenger's getLSMediaThreadPictureUrl (https only), is converted like the sender avatar, and is decoded and limited natively by the same path. A group without its own photo gets no image, so macOS draws it from its members; a member's face is never used for the group.

Testing. Live, against a real encrypted one-to-one chat, with Carrier's window hidden:

  • Linux (Omarchy, freedesktop actions through the desktop's notification server): the notification offered React (πŸ‘), Mark as Read and Mute. React put πŸ‘ on exactly the announced message, seen from the other account. Mark as Read turned the conversation read on this account; the row's unread state changed, while a React-only notification left it unread. This account doesn't send read receipts, so the other side's "Seen" can't confirm it. Carrier never took focus.
  • macOS (CI-signed debug build with the communication entitlement): the one-to-one notification was still a communication notification with the sender's face (INSendMessageIntent, MessagingDirect, sender image) in the new carrier.message.react.read.mute category. Banners can't be clicked over SSH, so the buttons were pressed through a debug-only hook that runs the same native action with that notification's own target: React (527 ms) and Mark as Read (53 ms) both succeeded with the window closed, with the same results as on Linux.
  • Not live-tested: the group picture (no suitable group chat; unit tests only), regular (unencrypted) chats' reaction path, Windows (its VM can't load Facebook; covered by cross-clippy and the toast tests), and a reaction other than πŸ‘ (unit tests).

Related

Tickets: #366
Tickets: #368

Discussion

  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: kristofferR

    [!NOTE]
    πŸ€– Claude Opus 5.5 responding on behalf of Kristoffer

    @codex review

     
  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: chatgpt-codex-connector[bot]

    Codex Review Summary: βœ… Completed This comment shows the latest Codex review activity on this pull request. | Review | Status | Commit | Review trigger | | --- | --- | --- | --- | | πŸ“ **Code Review** | βœ… **Completed** <relative-time datetime="2026-11-07T22:40:19.130094Z">2026-11-07T22:40:19.130094Z</relative-time> | `b11f1e9` | Manual request |
    ℹ️ About Codex in GitHub
    [Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you - Open a pull request for review - Mark a draft as ready - Comment "@codex review" or "@codex security review". Codex reacts with πŸ‘€ while any review is running, comments if it has suggestions, and reacts with πŸ‘ once all reviews finish with no findings.
     
  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: chatgpt-codex-connector[bot]

    Codex Review: Didn't find any major issues. You're on a roll.

    Reviewed commit: 6d5d6a3302

    ℹ️ About Codex in GitHub
    [Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you - Open a pull request for review - Mark a draft as ready - Comment "@codex review". If Codex has suggestions, it will comment; otherwise it will react with πŸ‘. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
     
  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: kristofferR

    [!NOTE]
    πŸ€– Claude Opus 5.5 responding on behalf of Kristoffer

    @codex review

     
  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: chatgpt-codex-connector[bot]

    Codex Review: Didn't find any major issues. Bravo.

    Reviewed commit: b11f1e94d8

    ℹ️ About Codex in GitHub
    [Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you - Open a pull request for review - Mark a draft as ready - Comment "@codex review". If Codex has suggestions, it will comment; otherwise it will react with πŸ‘. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
     
  • Anonymous

    Anonymous - 2026-11-07

    Ticket changed by: kristofferR

    • status: open --> closed
     

Log in to post a comment.