How to Use Emoji in Markdown

Add emoji to Markdown either by typing a shortcode like :rocket: on platforms that support it, or by pasting the Unicode emoji character directly. Pasted Unicode works everywhere text works; shortcodes are a platform extension, not part of any Markdown spec.

Platform Support

GitHubsupportedGitLabsupportedObsidiansupportedDiscordsupportedSlacksupportedNotionsupported

Emoji shortcodes are not Markdown. Neither CommonMark nor GFM defines :smile: — the conversion is a text-replacement feature each platform layers on top, with its own list of recognized names. A pasted Unicode emoji, by contrast, is just a character: it survives every renderer, every converter, and every copy-paste, because there is nothing to parse. The practical rule: use Unicode when a document needs to travel between platforms, and shortcodes when you are staying inside one platform and want names that are searchable and consistent in the source.

Platform support splits cleanly. GitHub recognizes a large shortcode set (the gemoji list) in READMEs, issues, and comments, and typing a colon in the web editor opens an autocomplete picker. Slack has its own shortcode names — overlapping with GitHub's but not identical — plus custom workspace emoji, and converts codes as you type. Discord autocompletes :name: in the message box and supports custom server emoji. Obsidian is the notable holdout: it does no shortcode conversion at all, so :smile: stays literal text unless you install a community plugin — but Unicode emoji render perfectly and even work in note titles and filenames. The same is true of most static site generators and Markdown libraries: unless the pipeline explicitly adds an emoji plugin, shortcodes pass through to the published page as plain colon-delimited text.

The subtlest emoji gotcha lives in headings. GitHub generates anchor slugs from heading text by lowercasing, hyphenating spaces, and stripping characters that are not letters, numbers, or hyphens — and emoji get stripped. The space that separated the emoji from the text survives as a hyphen, so ## 🚀 Launch Guide gets the anchor #-launch-guide, not #launch-guide. Hand-written table-of-contents links that ignore this break silently. If you decorate headings with emoji, verify the generated anchor (hover the heading on GitHub and copy the link icon) rather than guessing, or keep emoji out of any heading you intend to link to.

Two more practical considerations. First, shortcodes fail loudly when unsupported and quietly when misspelled: :rokcet: renders as literal colon text on every platform, so proofread the names. Second, emoji are read aloud by screen readers using their Unicode names — a single 🎉 after a sentence is fine, but a row of ten decorative emoji becomes ten spoken descriptions, and emoji used in place of words ("ship it 🚀 today") interrupt the sentence flow. Rendering also varies by operating system font, so an emoji that looks subtle on macOS may look very different on Windows or Android.

Examples

Emoji
Markdown
:smile: :heart: :thumbsup:
Output

:smile: :heart: :thumbsup:

Insert emojis using shortcodes.

Shortcode vs Unicode
Markdown
:tada: Shortcode — converted on GitHub, Slack, and Discord

🎉 Unicode — renders everywhere, no conversion needed
Output

:tada: Shortcode — converted on GitHub, Slack, and Discord

🎉 Unicode — renders everywhere, no conversion needed

Emoji in a heading changes the anchor
Markdown
## 🚀 Launch Guide

[Jump to the guide](#-launch-guide)
Output

🚀 Launch Guide

Jump to the guide

GitHub strips the emoji from the slug but keeps a hyphen for the space — the anchor is #-launch-guide, not #launch-guide.

Common Mistakes

Wrong
: rocket : or :rokcet:
Right
:rocket:

Shortcodes must match a recognized name exactly, with no spaces inside the colons. Anything else renders as literal text.

Wrong
Linking to #launch-guide for the heading "## 🚀 Launch Guide"
Right
Link to #-launch-guide

GitHub strips emoji from anchor slugs but converts the following space to a hyphen, producing a leading hyphen in the anchor.

Wrong
Using :shortcodes: in documents that move between platforms
Right
Paste the Unicode emoji character instead

Every platform has its own shortcode list, and unknown codes render as literal colon text. Unicode emoji are plain characters that work everywhere.

Platform Notes

GitHub

Supports the full gemoji shortcode set in READMEs, issues, and comments. Typing : in the web editor opens emoji autocomplete, and the GitHub emoji API lists every supported code.

Slack

Uses its own shortcode names plus custom workspace emoji, converting as you type. Many names differ from GitHub's, so codes do not always transfer.

Discord

Autocompletes :name: while typing and supports custom server emoji. Pasted Unicode emoji work in all messages.

Obsidian

No shortcode conversion without a community plugin — :smile: stays literal. Unicode emoji render natively and can even appear in note titles and filenames.

Frequently Asked Questions

How do I add an emoji in Markdown?

Paste the Unicode emoji character directly — it works in any Markdown — or type a :shortcode: like :rocket: on platforms that support shortcode conversion (GitHub, Slack, Discord).

Why is my :shortcode: showing as literal text?

Either the platform does not convert shortcodes (Obsidian and many static site generators do not), or the name is misspelled or not in that platform's emoji list.

Are emoji shortcodes standard Markdown?

No. Neither CommonMark nor GFM defines them — shortcode conversion is a per-platform extension, each with its own list of recognized names.

Do GitHub, Slack, and Discord use the same shortcode names?

They overlap heavily but are not identical, and Slack and Discord add custom emoji with workspace-specific names. Verify codes on each platform rather than assuming they transfer.

Can I use emoji in Markdown headings?

Yes, but they change the auto-generated anchor: GitHub strips the emoji and leaves a hyphen for the space, so links to the heading need the adjusted slug (e.g. #-launch-guide).

Related Syntax

Related Tools