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
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
:smile: :heart: :thumbsup::smile: :heart: :thumbsup:
Insert emojis using shortcodes.
:tada: Shortcode — converted on GitHub, Slack, and Discord
🎉 Unicode — renders everywhere, no conversion needed:tada: Shortcode — converted on GitHub, Slack, and Discord
🎉 Unicode — renders everywhere, no conversion needed
## 🚀 Launch Guide
[Jump to the guide](#-launch-guide)🚀 Launch 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
: rocket : or :rokcet::rocket:Shortcodes must match a recognized name exactly, with no spaces inside the colons. Anything else renders as literal text.
Linking to #launch-guide for the heading "## 🚀 Launch Guide"Link to #-launch-guideGitHub strips emoji from anchor slugs but converts the following space to a hyphen, producing a leading hyphen in the anchor.
Using :shortcodes: in documents that move between platformsPaste the Unicode emoji character insteadEvery 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
Markdown Emoji Cheat Sheet
Searchable list of GitHub emoji shortcodes with click-to-copy
GitHub Profile README Generator
Create a personalized GitHub profile README
README Generator
Generate complete project README files with customizable sections
Markdown Cheat Sheet
Complete Markdown syntax reference with interactive examples