How to Use Emoji in Markdown
(Why :smile: Shows as Text)
There are two ways to put emoji in Markdown: paste the emoji character itself (π), which works everywhere because it is just text, or type a shortcode like :tada:, which only converts on platforms that support it. If you are looking at a literal :smile: right now, your renderer is one of the many that do not.
The reliable way: paste the emoji itself
An emoji is a normal Unicode character, the same as a letter or a Chinese character. Paste π into a .md file and every editor, viewer, and site will show it, because there is nothing to convert.
You do not need a cheat sheet to find one. Your OS has a picker built in:
- Windows: press
Win+.(the period key) and pick from the panel. - macOS: press
Ctrl+Cmd+Space.
The character lands in your file like any other text and is saved with it. This is the way to go whenever the file might be opened somewhere else later.
Why :smile: shows up as plain text
Shortcodes look like Markdown syntax, but they are not. Neither the CommonMark spec nor GFM has an emoji rule. :smile: converting into π is a feature that GitHub added on top for its own pages, and a handful of other platforms did the same with their own name lists.
So when a plain Markdown editor shows you the literal :smile:, nothing is broken. The editor is rendering the file correctly; the colons-and-name text is what the file actually contains. The same logic applies to the other cases where Markdown seems to not render: the first question is always whether the thing you typed is Markdown at all.
A misspelled name has the same symptom on platforms that do support shortcodes: :smiel: stays text on GitHub too, because the name has to match its list exactly.
Where shortcodes convert, and where they stay text
| Platform | :shortcode: | Pasted emoji π |
|---|---|---|
| GitHub (github.com) | Converted | Shown as emoji |
| GitLab | Converted | Shown as emoji |
| Slack, Discord (chat) | Converted (their own name lists) | Shown as emoji |
| VS Code preview | Plain text (needs an extension) | Shown as emoji |
| Obsidian | Plain text | Shown as emoji |
| NoteLoom | Plain text | Shown as emoji |
The pattern in the right column is the whole story: the pasted character works in every row, on every platform, with no exceptions to memorize.
What happens when the file travels
This difference only starts to matter when a .md file moves between tools, and that is exactly what AI-era Markdown does. A README you download from GitHub, a doc an AI wrote for you, notes you move from one app to another: any :tada: inside travels as eleven plain characters, and whether it ever becomes π again depends on where the file lands.
A pasted emoji has no such dependency. It is in the file, it stays in the file, and it looks the same at every stop.
NoteLoom is a case in point: it renders CommonMark and GFM from your local .md files, so shortcodes stay as text, honestly reflecting what is in the file. Pasted emoji show up fine in all three views (source, live, and reading), and when you edit and save, they are written back to your local file untouched.
FAQ
Why does :smile: work on GitHub but not in my editor?
How do I type an emoji without a cheat sheet?
Do emoji break .md files?
Does NoteLoom convert :shortcodes: into emoji?
Are shortcode names the same on every platform?
Will my emoji still be there after saving and reopening the file?
Check what your file really contains
Open your .md in NoteLoom in Chrome / Edge / Arc: the source view shows you the raw text (shortcodes and all), and the reading view shows it rendered. Local file in, local file out, nothing uploaded.