Compose Email with Emojis for Your Ideas
Purpose
Look up emojis on emojis.directory that match the key ideas/concepts in an email body, then assemble an email-ready text payload (subject + body) with those emojis interleaved through the copy. The site itself is a static emoji lookup directory — it does not send mail, and it does not expose any mailto: composer; the deliverable of this skill is structured text ({subject, body, emojis_used[]}) that the caller is expected to paste into their own mail client (Gmail compose, Outlook, Apple Mail, etc.). Read-only: never submits, posts, or interacts with anything beyond GETting public HTML.
When to Use
- A user has draft email copy (or a topic + tone) and wants suggested emojis sprinkled through the body to emphasize ideas.
- You need to look up the canonical Unicode emoji character (not an image) for a specific concept ("brainstorm", "celebrate", "next steps") to drop into outgoing text.
- You need a batch of conceptually-related emojis (e.g. all the "mailbox / envelope" variants) and want a stable, JS-free source that doesn't require an API key.
- You want to avoid hallucinating wrong code points — emojis.directory page URLs map 1:1 to Unicode CLDR short-names, so fetched results are verifiable.
Workflow
emojis.directory is a static Astro site fronted by Cloudflare. There is no API, but the search results page and every emoji detail page are fully server-rendered HTML — no JS execution required to extract emoji characters. The optimal path is direct HTTPS GETs against three URL shapes; a browser session is only needed when the caller wants visual confirmation or to use the dynamic Emoji Keyboard tool.
-
Decompose the email idea-by-idea. Take the draft body (or topic if no draft) and produce an ordered list of 3–8 concept tokens — single words or short phrases that name an idea per sentence/paragraph. Examples for a launch email:
["new product", "team effort", "rocket / launch", "feedback request", "thanks"]. These tokens become your search queries in step 2. -
Resolve each concept → emoji via the search endpoint.
GET https://emojis.directory/?s={query}The query matches as a substring against the emoji's Unicode CLDR short-name (the same string used in the URL slug). It is not semantic — see the "semantic queries fail" gotcha below. Parse the response HTML:
- Emoji characters appear as:
<span class="icon-item">{emoji}</span>in the results grid. - The link/label next to each is:
<a href="/{slug}-emoji-copy-paste/">{human-readable name}</a>. - Regex:
/icon-item">([^<]+)<\/span>[\s\S]*?<a href="(\/[a-z0-9-]+-emoji-copy-paste\/)">([^<]+)<\/a>/g. - "No matches" response: the page renders
<p>No emojis found matching <strong>{query}</strong>. Try a different search.</p>— detect that string before iterating results.
If a query returns zero results, retry with a different word-stem from the same concept (e.g.
idea→bulb,brain,think;target→direct hit;email→mailorenvelope). See the lexicon in the gotchas section. - Emoji characters appear as:
-
(Optional) Pull the canonical character from the detail page. When you need exactly one emoji for a concept and the search returns several, GET the specific detail page:
GET https://emojis.directory/{slug}-emoji-copy-paste/The page exposes the canonical character in two redundant places:
<span class="icon-item">{emoji}</span>inside<div class="single-icon">.<button class="btn cpybtn copy-btn ..." data-clipboard-text="{emoji}">Copy</button>— thisdata-clipboard-textattribute is the byte-for-byte string the site itself ships to the clipboard, including any variation-selector / ZWJ sequences. Prefer it over scraping the<span>when codepoint exactness matters.- Page
<title>is"{Name} Emoji Copy Paste ― {emoji}"(em-dash separator―, U+2015).
-
(Optional) Browse a category for thematic packs. For sets-of-related emojis (holiday card, food-themed newsletter, country flags), GET a category page instead of running multiple searches:
GET https://emojis.directory/{category}-emojis/Known categories:
person,country-flags,animals-and-nature,food-and-drinks,travel-and-places,hands-and-other-body-parts,christmas,thanksgiving,halloween,cursed,cute. Plus/kaomoji/,/kawaii/,/emoticons/,/lenny-faces/,/text-faces/,/shrug-faces/(no trailing-emojissegment for those six). The same<span class="icon-item">…</span>selector applies. -
Assemble the email. Build the output object with
subject,body, and aemojis_used[]audit trail. Sensible interleaving conventions:- Subject: one leading emoji + space + headline. Example:
🚀 Launching next Tuesday. - Body: place one emoji before the sentence that introduces each idea (not at the end — leading emojis are more accessible for screen readers and don't collide with terminal punctuation). Keep density to ≤ 1 emoji per ~25–40 words; more reads as spammy.
- For multi-codepoint emojis (skin-tone modifiers, flags, ZWJ family sequences), always use the exact
data-clipboard-textvalue from step 3 — splitting the bytes will render as separate broken glyphs in most mail clients.
- Subject: one leading emoji + space + headline. Example:
-
Return the assembled payload to the caller. Do not attempt to open Gmail / Outlook / Apple Mail to actually send — this skill is text-generation only.
Browser fallback
A residential proxy / stealth session is not required for any of the above (Cloudflare serves cached HTML at the edge). Use a browser only when:
- The caller wants screenshots of the rendered detail page (e.g. to confirm Apple-style vs. Google-style emoji rendering — both are just font fallbacks; the underlying codepoint is identical).
- You need to use the Emoji Keyboard at
/emoji-keyboard/, where the random-emoji grid is populated client-side via JS on tag click. Usebrowse open+browse clickon the.keyboard-tag-select[data-tag="…"]chips, then read<span class="icon-item">nodes from the rendered DOM viabrowse snapshot. Detail pages and search results do not need this — they are fully server-rendered.
Site-Specific Gotchas
- Search is substring-on-slug, not semantic.
?s=ideareturns zero results — no Unicode emoji has "idea" in its CLDR short-name. To find idea-related emojis you must query stem keywords:bulb→ 💡,brain→ 🧠,think→ 🤔. Other dead-end semantic queries observed:email(usemailorenvelopeinstead —?s=mailreturns 📪📫📧📭📬,?s=envelopereturns ✉️📩📨🧧),target(usedirect hit, the actual CLDR name of 🎯),idea,success,productivity. Build a small per-call concept→stem lexicon before issuing searches. - Concept → known-good stem cheatsheet (verified 2026-05-19):
- idea / insight →
bulb(💡),brain(🧠),think(🤔),sparkle(✨) - launch / start →
rocket(🚀) - target / goal →
direct hit(🎯 — slug isdirect-hit-emoji-copy-paste, NOTtarget) - check / approve →
check(✅ ☑️),thumbs up - celebrate / win →
party(🎉🥳),tada,clap,trophy - email itself →
mail(📧 e-mail, 📪📫📭📬 mailboxes),envelope(✉️📩📨) - team / collaboration →
handshake,people,family - thanks →
pray,bow,heart - calendar / scheduling →
calendar,clock,alarm clock(⏰) - urgent / warning →
warning,siren,fire(🔥)
- idea / insight →
- URL slug naming uses Unicode CLDR short-names with spaces → hyphens. "E-mail" is
/e-mail-emoji-copy-paste/(note the hyphen inside the name). "Light bulb" is/light-bulb-emoji-copy-paste/. "Direct hit" is/direct-hit-emoji-copy-paste/. Guess-and-fetch is risky for compound names; prefer search-then-follow over hand-crafting detail URLs. - The site is fully cached at the Cloudflare edge (HTTP
Server: cloudflare,Cf-Cache-Statuspresent, content served from PDX POP in our trace). No rate-limiting observed on direct GETs from a sandbox IP at < 5 rps. No anti-bot challenge. No--proxies/--verifiedflags needed. data-clipboard-textis the authoritative bytes. Some emoji (variation-selector-16, skin-tone modifiers, flag regional-indicator pairs, ZWJ sequences like 👨👩👧) render as multiple Unicode codepoints. Thedata-clipboard-textattribute on the Copy button on each detail page is what the site itself puts on the clipboard — copy that string verbatim. Extracting from the visible<span class="icon-item">…</span>also works but is one step further from the canonical source and risks dropping a VS16 if your HTML parser normalizes whitespace.- There is no
mailto:or compose action on emojis.directory itself. Anyone reading this skill expecting to "send" an email through the site is wrong — the skill's deliverable is text. The actual email-send must happen elsewhere (caller's MUA, an SES/Postmark API in the caller's stack, etc.) and is out of scope. - Don't waste turns on the Emoji Merge / Guess / Blog pages.
/emoji-merge/is a Genmoji-style toy (random-pair generator),/guess/is a game,/blog/is editorial — none expose emoji data in a structured way. Stick to search + detail + category. /emoji-keyboard/is JS-rendered, unlike everything else. The tag chips at the top (<li class="keyboard-tag-select" data-tag="…">) populate the grid only after a client-side click handler runs. Use a browser session if you must use this tool; otherwise prefer the static category pages (same data, no JS).- No emoji has CLDR name "idea" / "success" / "target" / "email" / "happy". Be ready to fail-soft: when a search returns the no-results sentinel, fall back to a stem from the cheatsheet rather than retrying close variants.
Expected Output
{
"input_topic": "Pitching a new feature idea to the team",
"emojis_used": [
{
"concept": "idea / insight",
"query_used": "bulb",
"name": "light bulb",
"emoji": "💡",
"slug_url": "https://emojis.directory/light-bulb-emoji-copy-paste/"
},
{
"concept": "team / collaboration",
"query_used": "handshake",
"name": "handshake",
"emoji": "🤝",
"slug_url": "https://emojis.directory/handshake-emoji-copy-paste/"
},
{
"concept": "launch / next steps",
"query_used": "rocket",
"name": "rocket",
"emoji": "🚀",
"slug_url": "https://emojis.directory/rocket-emoji-copy-paste/"
},
{
"concept": "feedback request",
"query_used": "mail",
"name": "e-mail",
"emoji": "📧",
"slug_url": "https://emojis.directory/e-mail-emoji-copy-paste/"
}
],
"email": {
"subject": "💡 New feature idea — would love your take",
"body": "Hi team,\n\n💡 I've been turning over a small idea I think could move the needle on retention — short version below, full doc linked at the bottom.\n\n🤝 I'd really value a sanity-check from each of you before I bring it to the wider product review; you've all shipped enough of these to know where the cliffs are.\n\n🚀 If the gut-check goes well, I'd love to scope a 2-week spike for the next cycle and report back at the following team sync.\n\n📧 Hit reply with thoughts (even one-liners are great), or grab 15 min on my calendar this week — link in my signature.\n\nThanks!\n— Alex"
}
}
Alternative success shape — concept that hit the no-results path and required a stem fallback:
{
"concept": "target / goal",
"query_used": "target",
"search_result": "no_match",
"fallback_query": "direct hit",
"name": "direct hit",
"emoji": "🎯",
"slug_url": "https://emojis.directory/direct-hit-emoji-copy-paste/"
}