EmoArt
Post
Glossary

Emoji shortcode - what :smile: actually means

Last updated: 2026-05-21·~4 min

This article takes about 4 minutes to read.

Type :fire: in Slack and 🔥 appears. The mechanism behind it is the emoji shortcode, a small but powerful conventions layer on top of Unicode.Emoji shortcodes are short, colon-delimited text strings that compatible apps automatically convert into emoji glyphs. They originated in chat applications and persist as a productivity-friendly alternative to clicking through emoji pickers.

Definition

An emoji shortcode is a text identifier wrapped in colons (e.g., :thumbsup:) that an application substitutes with the corresponding emoji during rendering or sending. The substitution happens at the application layer, not in Unicode. Different apps maintain different shortcode registries, with significant overlap on common emoji and divergence on less common ones.

History

Shortcodes evolved from earlier text-based emoticons (:), :D) and IRC-era nick-completion patterns. The colon-wrapped form was popularized by Campfire (an early chat app from 37signals) and adopted by Slack at its 2013 launch as a core input mechanism. From there, shortcodes spread to GitHub, Discord, Mattermost, Rocket.Chat, and beyond.

Major shortcode registries

CLDR Short Names

The Unicode Common Locale Data Repository (CLDR) provides official short names for every emoji, used as a reference shortcode set by many apps. CLDR names are localized for dozens of languages, so "smiling face" has equivalents in Japanese, French, Spanish, etc.

Slack

Slack maintains its own shortcode set, originally derived from EmojiOne (now JoyPixels). Slack added custom emoji uploaded per workspace, which use the same colon syntax as built-ins. :lgtm: in one workspace might render as a custom approval graphic, while in another it's just text.

Discord

Discord uses a similar shortcode model with autocomplete on the second character. Custom server emoji and animated emoji extend the syntax beyond Unicode glyphs.

GitHub

GitHub maintains a documented shortcode list used in issues, pull requests, comments, and commit messages. Common ones: :white_check_mark: ✅, :warning: ⚠️, :rocket: 🚀, :bug: 🐛. The list is similar but not identical to CLDR names.

Mattermost / Rocket.Chat

Open-source chat platforms maintain their own registries, usually compatible with Slack's set for migration ease.

Convention patterns

  • Lowercase, words separated by underscores: :smiling_face:
  • Aliases for popular emoji: :+1: and :thumbsup: both → 👍
  • Skin-tone variants: :wave: for default 👋, :wave::skin-tone-3: for 👋🏽 in some apps
  • Custom emoji follow the same syntax in apps that support them: :shipit:, :lgtm:, :partyparrot:

Where shortcodes work and don't

ContextShortcode supportNotes
Slack, Discord✅ NativeInline conversion as you type
GitHub markdown✅ NativeRendered when displayed
Notion, Linear✅ NativeInline picker triggered by colon
Plain text files❌ NoStays as literal text
iMessage, WhatsApp❌ NoUse the OS emoji picker instead
Email (most clients)❌ NoUse OS picker

Practical productivity gains

  • Stay on the keyboard, no mouse trips to a picker
  • Searchable by partial name as you type
  • Custom workspace emoji become first-class team vocabulary
  • Composability: shortcodes work in markdown, code reviews, async messages, and bot replies

Limitations

  • Names diverge between apps - :thumbsup: in one tool might be :+1: elsewhere
  • Copy-pasting between apps strips shortcodes (most apps render to Unicode emoji on save)
  • Plain-text exports lose custom emoji entirely - they show as raw :custom_name: text
  • Auto-completion can occasionally substitute a shortcode you didn't intend (especially short ones like :p)

Common misconceptions

  • ❌ "Shortcodes are part of Unicode" → ✅ They're an application-layer convention
  • ❌ "All apps recognize the same shortcodes" → ✅ Significant overlap, but many app-specific names
  • ❌ "Custom shortcodes are portable" → ✅ They depend on the app or workspace defining them

Related terms

  • Codepoint - the underlying Unicode value the shortcode resolves to
  • ZWJ - the joiner used in some shortcode-resolved sequences

Was this article helpful?