Compose Email with Emojis for Your Ideas

Site emojis.directoryTask compose-email-with-emojis-uk7ipoVersion v1Updated Jul 13, 2026Category productivity

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. This skill was captured from a live agent session on emojis.directory and publishes here verbatim, exactly as an agent receives it.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

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.

Transport note (Browserless): the GETs below are plain HTTPS — run them from any HTTP client and regex the returned HTML. If you prefer to parse in-page (or are under restricted egress), a single browserless_agent goto the search/detail URL + evaluate returning the .icon-item / data-clipboard-text values does the same job without shipping raw HTML back.

  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. Drive it with one browserless_agent call: goto the page, click the .keyboard-tag-select[data-tag="…"] chips, then evaluate [...document.querySelectorAll('.icon-item')].map(n=>n.textContent) to read the rendered emoji nodes. 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 residential proxy or stealth session 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/"
}

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=emojis.directory&task=compose-email-with-emojis-uk7ipo