Emoji shortcode - what :smile: actually means
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 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). The colon-wrapped form spread through early chat apps and was adopted by Slack 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 short names for emoji, which some apps use as a reference shortcode set. CLDR names are localized for many languages, so "smiling face" has equivalents in Japanese, French, Spanish, etc.
Slack
Slack maintains its own shortcode set. 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 as you type. 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, with many names in common with Slack's set.
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
| Context | Shortcode support | Notes |
|---|---|---|
| Slack, Discord | ✅ Native | Inline conversion as you type |
| GitHub markdown | ✅ Native | Rendered when displayed |
| Notion | ✅ Native | Inline picker triggered by colon |
| Plain text files | ❌ No | Stays as literal text |
| iMessage | ❌ No | Use the OS emoji picker instead |
| Varies by client | Use 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 (whether the shortcode text or the Unicode emoji is stored varies by app)
- 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
Was this article helpful?