Skip to content

Implement reacting to messages and stories with stickers#6229

Closed
diaruga777 wants to merge 31 commits intosignalapp:mainfrom
diaruga777:diaruga777/stickerReactions
Closed

Implement reacting to messages and stories with stickers#6229
diaruga777 wants to merge 31 commits intosignalapp:mainfrom
diaruga777:diaruga777/stickerReactions

Conversation

@diaruga777
Copy link
Copy Markdown

@diaruga777 diaruga777 commented Mar 25, 2026

First time contributor checklist

Contributor checklist

  • My commits are rebased on the latest main branch
  • My commits are in nice logical chunks
  • My contribution is fully baked and is ready to be merged as is
  • I have tested my contribution on these devices:
  • iPhone 17, iOS 26.2
  • iPad A16, iOS 26.2

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 OWSReaction
    This 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 reactionRowId
    In 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-download
    I 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 emoji
    Emoji are used as fallbacks at client and protocol level, so I needed something when no emoji is present.
  • Call reactions only have access to emoji
    I 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 Screenshot - iPhone 17 - 2026-03-25 at 21 30 13
Simulator Screenshot - iPhone 17 - 2026-03-25 at 21 24 20

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

…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
@diaruga777 diaruga777 force-pushed the diaruga777/stickerReactions branch from c7c6b4f to 5db65a1 Compare March 26, 2026 06:07
@sashaweiss-signal
Copy link
Copy Markdown
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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants