Skip to content

Instantly share code, notes, and snippets.

@georges
Created July 4, 2026 00:24
Show Gist options
  • Select an option

  • Save georges/290cf883902dceebe0610683dac530d2 to your computer and use it in GitHub Desktop.

Select an option

Save georges/290cf883902dceebe0610683dac530d2 to your computer and use it in GitHub Desktop.
Emoji shortcodes catalog for RadioMail
# Emoji shortcodes catalog for RadioMail
# Winlink messages support only ISO-8859-1 characters and do not allow Unicode.
# To enable emoji usage, RadioMail maps emojis to plain-text shortcodes for transmission.
# The following emojis are supported and automatically transcoded.
module EmojiShortcodesCatalog
# Canonical shortcodes (prefer GitHub/gemoji + common Slack names).
# Keep this intentionally small and explicit so it can be shared with other clients.
CANONICAL_SHORTCODE_TO_EMOJI = {
":+1:" => "👍",
":-1:" => "👎",
":slightly_smiling_face:" => "🙂",
":neutral_face:" => "😐",
":frown:" => "🙁",
":thinking:" => "🤔",
":grinning:" => "😀",
":rofl:" => "🤣",
":roll_eyes:" => "🙄",
":grimacing:" => "😬",
":nauseated_face:" => "🤢",
":vomiting_face:" => "🤮",
":open_mouth:" => "😮",
":joy:" => "😂",
":wink:" => "😉",
":sunglasses:" => "😎",
":nerd_face:" => "🤓",
":partying_face:" => "🥳",
":upside_down_face:" => "🙃",
":zipper_mouth_face:" => "🤐",
":angry_face:" => "🤬",
":zany_face:" => "🤪",
":cry:" => "😢",
":sob:" => "😭",
":heart_eyes:" => "😍",
":star_struck:" => "🤩",
":scream:" => "😱",
":cold_face:" => "🥶",
":skull:" => "💀",
":poop:" => "💩",
":clown_face:" => "🤡",
":namaste:" => "🙏",
":v:" => "✌️",
":shaka:" => "🤙",
":star:" => "⭐",
":sheep:" => "🐑",
# Branding: always render hearts as yellow.
":heart:" => "💛",
":rainbow:" => "🌈",
":100:" => "💯",
":fire:" => "🔥",
":snowflake:" => "❄️",
":sunny:" => "☀️",
":partly_sunny:" => "🌤️",
":cloud:" => "☁️",
":cloud_with_rain:" => "🌧️",
":hamburger:" => "🍔",
":beer:" => "🍺",
":ramen:" => "🍜",
":birthday:" => "🎂",
":coconut:" => "🥥",
":pineapple:" => "🍍",
":car:" => "🚗",
":police_car:" => "🚓",
":ambulance:" => "🚑",
":fire_engine:" => "🚒",
":rotating_light:" => "🚨",
":airplane:" => "✈️",
":rocket:" => "🚀",
":helicopter:" => "🚁",
":motor_boat:" => "🛥️",
":ring_buoy:" => "🛟",
":moyai:" => "🗿",
":desert_island:" => "🏝️",
":mountain:" => "⛰️",
":camping:" => "🏕️",
":house:" => "🏠",
":hospital:" => "🏥",
":iphone:" => "📱",
":computer:" => "💻",
":phone:" => "☎️",
":microphone:" => "🎙️",
":hibiscus:" => "🌺",
":battery:" => "🔋",
":satellite_antenna:" => "📡",
":battery_low:" => "🪫",
":electric_plug:" => "🔌",
":bulb:" => "💡",
":fire_extinguisher:" => "🧯",
":gift:" => "🎁",
":key:" => "🔑",
":tada:" => "🎉",
":white_check_mark:" => "✅",
":x:" => "❌",
":warning:" => "⚠️",
":sos:" => "🆘",
":round_pushpin:" => "📍",
":radio:" => "📻",
}
# Alias -> canonical. Used to accept multiple common spellings/names, and to
# migrate older stored shortcodes forward.
SHORTCODE_ALIASES = {
# thumbs up/down
":thumbsup:" => ":+1:",
":thumbsdown:" => ":-1:",
# smiley
":smile:" => ":slightly_smiling_face:",
# eyes
":rolling_eyes:" => ":roll_eyes:",
# surprised
":surprised:" => ":open_mouth:",
# check mark
":ok:" => ":white_check_mark:",
":heavy_check_mark:" => ":white_check_mark:",
":ballot_box_with_check:" => ":white_check_mark:",
# location
":location:" => ":round_pushpin:",
# heart variants in shortcode form
":yellow_heart:" => ":heart:",
# poop
":hankey:" => ":poop:",
# gestures
":peace:" => ":v:",
":folded_hands:" => ":namaste:",
":call_me_hand:" => ":shaka:",
# flags (US lives in EmojiFlagsCatalog as :flag_us:)
":us:" => ":flag_us:",
":usa:" => ":flag_us:"
}
# Additional emoji sequences that we want to accept & canonicalize.
EXTRA_EMOJI_TO_CANONICAL_SHORTCODE = {
# allow non-variation form too
"✌" => ":v:",
# accept skin tone variations, but canonicalize to base emoji (yellow default) for branding/consistency.
"👍🏻" => ":+1:",
"👍🏼" => ":+1:",
"👍🏽" => ":+1:",
"👍🏾" => ":+1:",
"👍🏿" => ":+1:",
"👎🏻" => ":-1:",
"👎🏼" => ":-1:",
"👎🏽" => ":-1:",
"👎🏾" => ":-1:",
"👎🏿" => ":-1:",
"🤙🏻" => ":shaka:",
"🤙🏼" => ":shaka:",
"🤙🏽" => ":shaka:",
"🤙🏾" => ":shaka:",
"🤙🏿" => ":shaka:",
"✌🏻" => ":v:",
"✌🏼" => ":v:",
"✌🏽" => ":v:",
"✌🏾" => ":v:",
"✌🏿" => ":v:",
# closely related emoji aliases (normalize to our canonical subset)
"⛰" => ":mountain:",
"🏔" => ":mountain:",
"🏔️" => ":mountain:",
"🗻" => ":mountain:",
"📞" => ":phone:",
"☎" => ":phone:",
"🎤" => ":microphone:",
"☑️" => ":white_check_mark:",
"✔️" => ":white_check_mark:",
"✖️" => ":x:",
"❎" => ":x:",
"🌞" => ":sunny:",
"🌥️" => ":partly_sunny:",
"🌦️" => ":cloud_with_rain:",
"☔" => ":cloud_with_rain:",
"🌨️" => ":snowflake:",
"🧊" => ":cold_face:",
"🛫" => ":airplane:",
"🛬" => ":airplane:",
"🚙" => ":car:",
"🚘" => ":car:",
"🚔" => ":police_car:",
"🚤" => ":motor_boat:",
"🏡" => ":house:",
"🗝️" => ":key:",
"🎊" => ":tada:",
"🌟" => ":star:",
"😃" => ":grinning:",
"😛" => ":zany_face:",
"😜" => ":zany_face:",
"😝" => ":zany_face:",
"😋" => ":zany_face:",
"😊" => ":slightly_smiling_face:",
"😆" => ":grinning:",
"😠" => ":angry_face:",
# accept common heart emoji variants, but canonicalize to :heart: so they render as 💛.
"❤️" => ":heart:",
"🧡" => ":heart:",
"💛" => ":heart:",
"💚" => ":heart:",
"💙" => ":heart:",
"💜" => ":heart:",
"🖤" => ":heart:",
"🤍" => ":heart:",
"🤎" => ":heart:"
}
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment