Implement reacting to messages and stories with stickers#6229
Closed
diaruga777 wants to merge 31 commits intosignalapp:mainfrom
Closed
Implement reacting to messages and stories with stickers#6229diaruga777 wants to merge 31 commits intosignalapp:mainfrom
diaruga777 wants to merge 31 commits intosignalapp:mainfrom
Conversation
…l to always auto-download; requires more UX treatment to do otherwise
…y replies have no attachment and sticker messages arent story replies
…red the skin-tone-applied emoji anyway and not the base emoji, so there was never any need to split into components when comparing raw emoji strings has the same end result. This simplifies thinking about future commit diffs
c7c6b4f to
5db65a1
Compare
Contributor
|
Thanks for your interest in contributing! This is a neat feature, and it's something we've discussed periodically internally. Unfortunately, this is too large of a change for us to accept as an external contribution. Beyond just the changes on iOS, as you noted this would require substantial changes on other clients and rigorous evaluation of the opinionated decisions you listed. I appreciate the effort you put into this, and hopefully we'll have space in our roadmap to implement this in the future! Thanks again, and as always for being a Signal user. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
First time contributor checklist
Contributor checklist
Hello Signal team! This is a speculative implementation of Discord-like or Slack-like custom reactions in Signal. It adds the ability to react with stickers in addition to emoji across the board*. This includes animated stickers!
The implementation is, in my opinion, production-ready. By necessity, I have made opinionated decisions on some details both from an engineering and a UX design perspective. I’ve tried to document the main ones below.
It works by adding a Sticker proto field to Reaction proto(s). Reaction sticker sending and receiving works the same as for sticker messages; sticker image data is uploaded to cdn and sent as an attachment alongside sticker identifier info, and the receiver either uses a locally installed sticker pack if available or downloads from CDN.
The protocol changes are backwards compatible; clients without sticker reaction proto fields silently fall back to treating the sticker as its associated emoji. Of course implementations on the other client platforms would be necessary to actually ship this, but I hope these changes are simple enough at a protocol level, and compelling enough at the iOS client level, to inspire that work to happen! :)
That said, I will not be offended if this goes nowhere, please take it or leave it! I just want this feature as a user, and had my own extrinsic reasons for working on an open source app feature.
Some decisions I made which a reasonable person could disagree with:
Reaction stickers’ Attachments are owned by the TSMessage being reacted to, not the OWSReactionThis was to avoid the overhead of a new ReactionAttachmentReference table. But it does mean the cascade delete when an OWSReaction is deleted is handled in Swift, not using SQL triggers.
Relatedly: no index on MessageAttachmentReference reactionRowIdIn the typical case there aren’t that many reactions on a single message; doing O(n) lookup should be fine. But it would also be okay to add an index at any point in the future.
Reaction stickers always auto-downloadI didn't add a UX hook for the user to manually download reaction stickers. Failures fall back to the sticker’s emoji.
This is probably the most frail part of the system, though I’m not sure how to do it properly, since tapping reaction pill views already opens the reaction sheet. I made tapping stickers in the sheet launch the sticker pack install sheet; perhaps tapping undownloaded stickers can trigger a download? That's buried several taps deep, which is why I didn't do it.
Use 💌 as the emoji for stickers with no emojiEmoji are used as fallbacks at client and protocol level, so I needed something when no emoji is present.
Call reactions only have access to emojiI think a different protocol would be necessary to handle upload and transmission of stickers during a call. (Would it upload at all, or just send the sticker image data in the call audio/video stream?) So for now its untouched and just uses emoji.
Here’s some screenshots of all of it working (lightly edited for privacy):
Simulator.Screen.Recording.-.iPhone.17.-.2026-03-25.at.21.28.09ex.mov
Simulator.Screen.Recording.-.iPhone.17.-.2026-03-25.at.21.31.41ex.mov
Simulator.Screen.Recording.-.iPhone.17.-.2026-03-25.at.21.31.09.MOV
Simulator.Screen.Recording.-.iPhone.17.-.2026-03-25.at.21.24.29.mov