This is a list of protocols and how they go about implementing emoji as well as custom emoji. This list is not meant to be exhaustive but perhaps over time it will become exhaustive.


alpha code: The text that is displayed or that a user types to display an emote. On Twitch this could be something like Kappa, LUL, rwgrimWave, etc.


Official twitch emotes come in a few varieties; global which are available to everyone at all times, special "cheermotes" that will donate Twitch bits to streamers, channel specific emotes available to subscribers (some at different levels), and other emotes that are unlocked via gifting from other events. At the time of this writing Twitch is running a special K-Pop emote give away that need to be unlocked but remain available forever. Other times the emotes are only available for a limited time.

For Talkatu's sake, cheermotes are no different than any other emote on Twitch, as their special behavior (sending bits to a streamer) would have to be implemented via the protocol plugin itself. That said, it looks like cheermotes are not rendered unless the ircv3 tag is on the privmsg.

Anyways, emotes come in from Twitch with a numeric identifier and boundaries of where it is used in a message; see the emotes section of the tags documentation for more information. This is the responsibility of the protocol plugin to replace before it ends up in Talkatu. However, since you need the identifier of the emote to get the pixel data (it's part of the URL) we should probably keep this around.

Also, as alluded to before, just because an emote exists does not mean a user can actually use it. We can ask Twitch which emotes the user can use but we will have to keep track of that somehow. However, incoming emotes from other users should be tagged as such for display.


  • Very large emote set.
  • Users can only use a subset of the emote set.
  • Must keep track of additional data (identifier).
  • Available emotes can change at any time (new subscriptions, emote unlocked, subscription expired, etc).
  • Emote location is provided in incoming messages.
  • Some animated emotes, namely cheermotes.


Discord causes a lot of scale issues due to its "one account, many servers" paradigm which is vastly different from just about every other chat network out there. Because of that, the emoji set is around the same order of magnitude as the Twitch emoji set.

Discord has a global emote set as well as per sever emotes that may or may not be available to be used on external servers.


  • Huge emoji set due to 1 account many servers.
  • Each sever has a limited number of custom emojis.
  • 100 static and 100 animated for non-partnered servers.
  • Animated emoji available to "Nitro Subscribers".
  • Emote location is provided in incoming messages.
  • Some servers don't allow emotes from other servers.


Slack's emoji are a lot easier to deal with than Twitch and Discord. There is a global list of emoji per instance and they can be used by anyone. I have not been able to find a limit to the number of custom emojis per server, but one slack I'm on currently has 2980 custom emojis. Also Slack keeps track of who added and emote and when.

One of the downsides to Slack's implementation is that there is no data passed to the client about the emote. It shows up like :rwgrimLOL: inline in the message.

I'm not aware of any mechanisms to tell clients about new emoji at this time, but I also haven't explicitly looked for it yet.


  • Potentially very large emote sets.
  • All users can use all emotes.
  • Additional data available (creator and creation date).
  • Emotes can be added and removed at any time by users/admins.