emojis.directory

compose-email-with-emojis

Installation

Adds this website's skill for your agents

 

Summary

Look up matching emojis on emojis.directory for each idea in an email's copy, then return a structured email payload (subject + body + emojis_used audit) with emojis interleaved through the body for the caller to paste into their own mail client.

FIG. 01
FIG. 02
FIG. 03
FIG. 04
FIG. 05
SKILL.md
173 lines

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.

  1. 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.

  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. ideabulb, brain, think; targetdirect hit; emailmail or envelope). See the lexicon in the gotchas section.

  3. (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> — this data-clipboard-text attribute 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).
  4. (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 -emojis segment for those six). The same <span class="icon-item">…</span> selector applies.

  5. Assemble the email. Build the output object with subject, body, and a emojis_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-text value from step 3 — splitting the bytes will render as separate broken glyphs in most mail clients.
  6. 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. Use browse open + browse click on the .keyboard-tag-select[data-tag="…"] chips, then read <span class="icon-item"> nodes from the rendered DOM via browse 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=idea returns 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 (use mail or envelope instead — ?s=mail returns 📪📫📧📭📬, ?s=envelope returns ✉️📩📨🧧), target (use direct 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 is direct-hit-emoji-copy-paste, NOT target)
    • 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 (🔥)
  • 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-Status present, 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 / --verified flags needed.
  • data-clipboard-text is the authoritative bytes. Some emoji (variation-selector-16, skin-tone modifiers, flag regional-indicator pairs, ZWJ sequences like 👨‍👩‍👧) render as multiple Unicode codepoints. The data-clipboard-text attribute 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/"
}