{"id":"51cdfd6f-e876-4aeb-999c-e09de4dee8d2","slug":"emojisense-emojisense","kind":"mcp","name":"emojisense","summary":"Emoji search by meaning, slang and intent: on the device first, by meaning when it needs to.","owner":"Emojisense","repoUrl":"https://github.com/Emojisense/emojisense","license":"MIT","licenseTier":"permissive","trust":"community","stars":2,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-10-03T16:06:19.000Z","addedAt":"2026-10-28T21:21:53.767Z","logoUrl":"https://avatars.githubusercontent.com/u/336988507?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["search"],"tags":[],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-28T21:22:43.149Z","sample":false,"url":"https://conduits.dev/tools/emojisense-emojisense","language":"TypeScript","transports":["stdio"],"install":{"npm":"@emojisense/mcp"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# Emojisense\n\nEmoji search for pickers, editors, and applications. Search with phrases, slang,\nshortcodes, or small spelling errors: \"jurassic park\" → 🦖, \"greatest of all time\" → 🐐,\n\"hallowelen\" → 🎃, \"kolay gelsin\" → 💪.\n\n- **Search on the device.** The engine searches local data packs on each keystroke.\n  Search works offline after the packs load. Bundle the packs for use without a first download.\n- **Optional search by meaning.** Precomputed answers from static files can answer uncertain\n  searches before the API. The API uses Workers AI embeddings and cached results.\n  The client combines these results with local matches and keeps confident local matches first.\n- **11 languages.** English, Chinese, Hindi, Spanish, Arabic, French, Bengali, Portuguese,\n  Russian, Indonesian, and Turkish. Load the packs for the languages your application needs.\n- **Multiple integrations.** Use the core without a framework, React hooks, picker and editor\n  adapters, extensions, or the Swift and Kotlin SDKs.\n\n[Documentation](https://emojisense.com/docs/) · [Playground](https://emojisense.com/playground/) ·\n[API reference](docs/API.md) · [Integrations](docs/INTEGRATIONS.md)\n\n## Hosted service\n\n| | URL |\n| - | --- |\n| Search API | [api.emojisense.com](https://api.emojisense.com) (HTTPS only) |\n| Dashboard (keys, usage, custom emoji) | [app.emojisense.com](https://app.emojisense.com) |\n| Website and docs | [emojisense.com](https://emojisense.com), [docs](https://emojisense.com/docs/) |\n\nPacks and precomputed answers require no key. API search without a key returns alias results\nwith a stricter rate limit and makes no model calls. Get a publishable key in the dashboard\nfor semantic search, and configure its allowed origins. Keep secret keys on the server.\n\n## Quickstart (React + Frimousse)\n\nUse React 18 or 19. Install the hook package and the picker:\n\n```bash\nnpm install @emojisense/react frimousse\n```\n\n```tsx\nimport { useEmojisense } from \"@emojisense/react\";\nimport { EmojisensePicker } from \"@emojisense/react/frimousse\";\n\nexport function Picker({ onSelect }: { onSelect: (emoji: string) => void }) {\n  const sense = useEmojisense({\n    packBaseUrl: \"https://api.emojisense.com/v1/pack/0.1.0\",\n    shardsUrl: \"https://api.emojisense.com/p/0.1.0\",\n    endpoint: \"https://api.emojisense.com\",\n    publishableKey: \"pk_live_REPLACE_WITH_YOUR_KEY\",\n  });\n\n  return <EmojisensePicker emojisense={sense} onEmojiSelect={({ emoji }) => onSelect(emoji)} />;\n}\n```\n\nReplace the key with your publishable key. For search on the device only, omit `shardsUrl`,\n`endpoint`, and `publishableKey`. The picker still downloads its packs and culture files.\nSee the [React README](packages/react/README.md) for language options, loading behavior, and styling.\n\n## Quickstart (without React)\n\n```bash\nnpm install emojisense\n```\n\n```ts\nimport { createEngine, loadPacks } from \"emojisense\";\n\nconst packs = await loadPacks({\n  baseUrl: \"https://api.emojisense.com/v1/pack/0.1.0\",\n  locales: [\"en\", \"tr\"],\n});\nconst engine = createEngine(packs);\nconst { results } = engine.search(\"ship it\", { locale: \"en\" });\nconsole.log(results[0]?.emoji); // 🚀\n```\n\n`loadPacks` downloads and validates the packs. `engine.search` runs synchronously without a\nnetwork request. English always loads because it contains the shortcodes.\nSee the [core README](packages/core/README.md) for search sessions and optional semantic search.\n\n## Develop\n\nUse Node.js 24 (see [.nvmrc](.nvmrc)) and pnpm 9.12.3 (see [package.json](package.json)).\n\n```bash\npnpm install --frozen-lockfile\npnpm build\npnpm lint\npnpm typecheck\npnpm test\npnpm eval:inhouse\n```\n\nTo run the API locally without a Cloudflare login, build the workspace first. Then prepare\nthe API assets and apply the local database migrations:\n\n```bash\npnpm --filter @emojisense/worker sync -- --placeholder\npnpm --filter @emojisense/worker db:migrate\npnpm --filter @emojisense/worker dev:offline\n```\n\n`--placeholder` permits an empty vector file when embeddings are missing. It keeps existing\nvectors when available. Without a local embedding server, offline development returns alias\nresults with `degraded: true`. See the [Worker README](packages/worker/README.md) for semantic setup.\n\nStart the website in another terminal:\n\n```bash\npnpm --filter @emojisense/web dev\n```\n\nOpen [localhost:4321](http://localhost:4321) or the [playground](http://localhost:4321/playground/).\nWebsite configuration is in [apps/web/.env.example](apps/web/.env.example).\nSee the [dashboard README](apps/dashboard/README.md) to run accounts, keys, and the waitlist locally.\n\n| Command | What it does |\n| ------- | ------------ |\n| `pnpm data:build` | Build packs from Emojibase, CLDR, and curated aliases in `packages/data/dist` |\n| `pnpm --filter @emojisense/data embed` | Embed the emoji documents with Workers AI (needs `wrangler login`) |\n| `pnpm --filter @emojisense/worker sync` | Copy packs, vectors, and culture files into the Worker. Defaults to EmbeddingGemma, 768 dimensions, from `packages/data/pack.config.json` |\n| `pnpm --filter @emojisense/worker dev` | Run the API at `http://localhost:8788` with Workers AI; requires Cloudflare authentication |\n| `pnpm eval` | Run the search benchmark; write results to `packages/eval/reports` |\n| `pnpm eval:inhouse` | Run the CI search benchmark offline, without the held-out dataset |\n\n## Deploy and CI\n\n| Command | What it does |\n| ------- | ------------ |\n| `pnpm deploy:dev` / `pnpm deploy:production` | Deploy the API Worker, dashboard and website (`scripts/deploy.sh`), then run the smoke test |\n| `pnpm smoke:dev` / `pnpm smoke:production` | Read-only checks of a deployed environment. Exit code 1 on a failed check |\n| `pnpm changeset` | Add a release note for a change to a public npm package |\n| `pnpm release:check` / `pnpm check:readmes` | Check the npm tarballs / compile the README samples. Publishing: [RELEASING.md](RELEASING.md) |\n| `pnpm package:chrome` / `pnpm package:raycast` | Build the Chrome Web Store zip / the Raycast Store project into `release/` |\n\nThe smoke test (`scripts/smoke.mjs`) checks the site pages, robots and noindex rules, search\nanswers with the site key (expected answers: `scripts/smoke.expected.json`), origin and key\nrefusals, CORS, pack and culture files, and the dashboard. When Playwright can be required (it\nis not a dependency; `NODE_PATH` works), it also opens the landing page in headless Chromium.\n\nCI ([.github/workflows/ci.yml](.github/workflows/ci.yml)) runs on pushes to `main` and on pull requests.\nIt checks formatting, lint, builds, types, tests, the core size budget, the search benchmark,\nand the culture ranking rules. A separate job tests Kotlin against reference results from\nthe TypeScript engine. CI uses no secrets and does not deploy.\n\n## Layout\n\n| Path | Purpose |\n| ---- | ------- |\n| `packages/core` | `emojisense`: zero-dependency engine, fusion, API client |\n| `packages/data` | Data pipeline. `enrichment/*.json` holds the curated aliases. |\n| `packages/eval` | Search benchmarks, regression checks, and culture ranking checks |\n| `packages/platform` | Shared contracts of the two Workers: D1 schema, plans, keys, webhooks |\n| `packages/worker` | Cloudflare Worker: the Search API |\n| `packages/react` | `@emojisense/react`: hooks + Frimousse adapter |\n| `packages/web-component`, `tiptap`, `lexical`, `ckeditor5`, `tinymce`, `emoji-mart`, `mcp` | Other integrations ([docs/INTEGRATIONS.md](docs/INTEGRATIONS.md)) |\n| `apps/dashboard` | Dashboard Worker and app: accounts, keys, usage, custom emoji, teams, webhooks |\n| `apps/chrome-extension`, `apps/raycast`, `sdks/swift`, `sdks/kotlin` | Chrome and Raycast extensions, Swift and Kotlin SDKs |\n| `apps/wordpress-plugin`, `apps/discourse` | WordPress plugin (bbPress, BuddyPress), Discourse theme component |\n| `apps/web` | Website, docs and the playground (`/playground/`): search inspector, reactions and photo labs |\n| `docs/` | [Architecture](docs/ARCHITECTURE.md), [pack format](docs/PACK_FORMAT.md), [API](docs/API.md), [research](docs/RESEARCH.md) |\n\n## Licenses\n\nCode uses the [MIT license](LICENSE). Emoji data comes from [Emojibase](https://emojibase.dev) (MIT) and\n[Unicode CLDR](https://cldr.unicode.org) (Unicode License v3). Emoji render with the system\nfont or a hosted set (Twemoji, Noto, Fluent; licenses in [NOTICE](NOTICE)).\nInclude the [data license notices](packages/data/licenses/README.md) when you redistribute packs.\nServer models run on Workers AI. Model weights are not included in this repository.\n"}