Retort - a reaction-style plugin for Discourse

@gdpelican this is a repost from Reaction emoji seem to have no verification as it seems the reaction is not part of discourse I repost it here:

I think I have discovered a bug but I don’t have a proper reproduction, but I can easily show examples of the issue, and I think my theory might be right.

Here is the issue, you are able to add non existent emoji to the post reactions. it results in :whateverYouWant: reactions in posts.

You can see example of it on the Manjaro forum, where I noticed a specific user posts often have these non existent emojis. After asking him a few questions I concluded he’s using some kind of automatic translation extension in his browser, and that probably translates the emojis :code: to his language. Unfortunately I didn’t have a reply from this user to know exactly his setup on his browser. To back my theory, you can see when he quoted someone in the following thread linked, he had translation of the original message in his quote.

See this message/thread on Manjaro forum:

See an example in the reactions, you see the issue clearly with all the proper reactions next to the invalid one:

So it seems that a user can send non existent emojis through the process of no verification of the emoji code.

1 Like

Did anyone also run into this situation that the reactions misplaced on a small screen and on mobile?

1 Like

I’ve updated this plugin to work with the latest discourse code.

@th21 I’ve also updated the retort HTML structure to better accomodate long retort lists, particularly on mobile


Thank you, it works!


Retorts on Mobile are messed up for me in the latest update

1 Like

I think the retorts container should be above or below the toolbar, preferably above, this gives us a lot more room to work with CSS wise


Is it possible to use data explorer or console to find the most used emoji list? :thinking:I was looking into plugin_store_rows table but found nothing helpful.


Hi, the tooltip with which users reacted with retorts is now broken on mobile. I tried messing around with z-index but was unable to successfully fix it with custom CSS. Any chance anyone could take a look?

This plugin is #end-of-life. Please use the Reactions Plugin.


Discourse Reactions is a poor substitute for one key reason: it limits reactions to one per post. That’s a dramatic reduction in the utility of reactions compared to Retort which allows people to give multiple reactions to the same post.

I really wish Retort would be maintained for this reason. The better solution would be for Discourse Reactions to be updated to allow multiple reactions.


The other big deficit is that retort allows you to select from all available emojis while you have to define a set of emojis for discourse reactions. If discourse reactions had both of these features I would gladly drop retort, but until it does my users will not be happy if I tell them they’re losing access to 95% of emoji reactions.


There is a #feature topic which shows some promise…


Yes, if this is all implemented I think I could easily convince my user base to migrate. It just kinda sucks to retire the alternative before this is fully available.


I opened a new request Support multiple-reactions per post (Retort style) about multiple-reactions-per-post, since the other link is only for offering more reaction choices for the one-and-only reaction that Discourse Reactions allows.


The Retort plugin isn’t an #official one so we don’t have any say in when it stops being actively developed and maintained by the community. :man_shrugging: The best we can do is try and keep people informed where possible so they have some time to find an alternative (or at least give their members a heads-up to try and soften the disappointment).

Hopefully those two #feature requests will be adopted into the #reactions plugin at some point, but as yet they’re still in the ‘nice ideas’ stage. But I’ve got my fingers crossed. :crossed_fingers:


I understand where you’re coming from. The reality is that neither I or James have had the time to properly support Retort for some time. You’ll notice that the last commit on the repository is over a year ago (by me on 21 July 2021). It’s great that the plugin has continued to work this long and it is a testament to the quality of the work James put into building it.

When I say I don’t have the time, believe me, I wish I did! I feel sad every time I have to make one of these decisions (like with the Landing Pages Plugin). I didn’t build Retort, but I have invested time in it. When you decide to retire something, it’s like accepting that something you’ve created or loved, and spent many hours, days and weeks of your life with, must die. I know it was a tough decision for James to make when he felt he had to move on to other things.

By contrast, the Reactions Plugin is being maintained by, an organisation of over 60 people, on an active basis. It’s in use on a number of the servers used by’s clients. Yes, it doesn’t have the same features as Retort yet, but I would urge you to pursue that feature development as an avenue. Perhaps you could convince someone like me, or another member of Pavilion, to PR a missing feature into the plugin. That would be a smart avenue to achieve your long term goals here.


There is always #marketplace if you want to pay a developer to bring it back to life in the meantime. But you may end up having to do this multiple times or agree a maintenance retainer.


I guess the answer is No? I would like to migrate to reactions and try to find the popular ones…

1 Like

I imagine it would be possible as they’ll be stored in the database somewhere. Unfortunately I don’t have this plugin installed on my test site to check the specifics. Is there a discourse-retort-retorts table or similar?


Here’s how to get a |-separated string for the retorts you currently have in use:

# ./launcher enter app
# rails c
retorts = {}
PostDetail.where(extra: 'retort').each do |p|
  retort = p.key.split('|').first
  (retorts[retort] ||= []) << p

That gives you:

  • First the number of unique retort emoji used
  • Then the retorts in a form you could paste into Reaction configuration, perhaps after trimming if it’s too long to work for the Reactions UI.

For me, I get this string:


If you’d like to copy a list of existing retorts into a post in discourse to discuss what to keep when migrating to Reactions, you might instead use this:

":" + retorts.keys.join(': :') + ':'

For me, that’s currently this set:

:tada: :rage: :money_with_wings: :face_vomiting: :crossed_fingers: :grin: :vulcan_salute: :worried: :slightly_smiling_face: :dart: :+1: :relaxed: :star_struck: :upside_down_face: :sweat_drops: :astonished: :frowning_face: :champagne: :heavy_plus_sign: :bulb: :joy: :fireworks: :zap: :smile: :fast_forward: :grinning: :clap: :sandwich: :heart_eyes: :rofl: :smiley: :wave: :ice_cream: :sob: :mortar_board: :open_mouth: :pray: :grimacing: :roll_eyes: :arrow_right_hook: :brain: :wink: :cry: :nerd_face: :slight_smile: :confused: :ok: :thinking: :it: :heart: :smirk: :sleepy: :eyes: :disappointed: :question: :laughing: :man_shrugging: :drum: :shushing_face: :herb: :man_facepalming: :ear: :scream: :ok_hand: :mantelpiece_clock: :smiling_face_with_three_hearts: :confetti_ball: :sunglasses: :nose: :pirate_flag: :neutral_face: :sweat_smile: :gift: :pensive: :dark_sunglasses: :exclamation: :call_me_hand: :green_heart: :face_with_monocle: :blush: :boom: :hugs: :stuck_out_tongue: :zipper_mouth_face: :slightly_frowning_face: :face_with_raised_eyebrow: :exploding_head: :information_source: :sailboat: :fire: :gun: :carousel_horse: :sparkles: :hearts: :pizza: :frowning: :drooling_face: :-1: :100: :metal: :partying_face: :four_leaf_clover: :grinning_face_with_smiling_eyes: :scream_cat: :person_shrugging: :deciduous_tree: :sunflower: :see_no_evil: :hear_no_evil: :speak_no_evil: :微笑: :top: :face_with_peeking_eye: :face_with_hand_over_mouth: :stethoscope: :money_mouth_face:

To get a bullet list of emojis with the number of instances of each:

retorts.keys.sort.each do |k|
  puts "* :#{k}: #{retorts[k].length}"

I won’t paste the whole bullet list of emoji, but it starts like this:

  • :+1: 161
  • :-1: 1
  • :100: 1
  • :arrow_right_hook: 1
  • :astonished: 9
  • :blush: 2
  • :boom: 2
  • :brain: 23
  • :bulb: 3

If you want to see every post that exists for each emoji:

retorts.keys.sort.each do |k|
  puts "* :#{k}: #{retorts[k].length}"
  retorts[k].each do |r|
    p = Post.find_by(id: r.post_id)
    next if p.nil?
    puts "   * #{p.full_url}"

That’s way too long to paste here!

What I don’t know is how to migrate all — or some of — those retorts to reactions. There is no mention of retort in the reactions plugin so it doesn’t do it automatically. I have 927 reactions with 116 unique emoji that I’d like to migrate to reactions.

I expect that I’ll be faced with dealing this at some point, preferably before Retort just quits working; if I implement the migration I’ll plan to document it here. But at least knowing what you have might help you.