frimousse

A lightweight, unstyled, and composable emoji picker for React with virtualized rendering and auto-updating emoji data.

Library
npm
v0.4.0
1,799 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
57 /100 Fair
Development Activity 60
Maintenance 48
Community 40
Maturity 40
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
85 /100 Excellent
Architecture 85
Code Quality 90
Innovation 88
Learning Curve 75

Frimousse is a React emoji picker built as a set of composable, unstyled parts — Root, Search, Viewport, List, Loading, Empty — that you assemble and style yourself with Tailwind, CSS-in-JS, or plain classes. It ships with no runtime dependencies, is tree-shakable, and virtualizes the emoji grid so only visible rows are rendered, keeping re-renders minimal even with thousands of emoji.

Rather than bundling a static emoji dataset, Frimousse fetches the latest Emojibase data on demand and caches it in local/session storage, re-validating with ETags so repeat visits skip the network round trip. It automatically detects which emoji a user’s platform can render (hiding unsupported glyphs like tofu boxes) and supports 25+ locales, skin tone selection, and keyboard navigation out of the box.

For teams already using shadcn/ui, Frimousse also ships as an installable component via the shadcn CLI, pre-wired to shadcn’s design tokens. It was originally built internally for the Liveblocks Comments default UI before being extracted into its own standalone package.

What You Get

  • Unstyled, composable EmojiPicker.* parts (Root, Search, Viewport, List, Loading, Empty, ActiveEmoji, SkinToneSelector) you assemble into your own markup
  • Automatic Emojibase data fetching with localStorage/sessionStorage caching and ETag-based revalidation, so data loads once and stays fresh
  • Built-in virtualization of the emoji grid — only visible rows render, keeping the picker fast even with the full emoji set loaded
  • Automatic hiding of emoji unsupported on the current platform, avoiding blank tofu-box glyphs
  • Skin tone selection and 25+ locale support driven by Emojibase’s messages dataset
  • A pre-built shadcn/ui component installable via npx shadcn add, pre-wired to shadcn’s design tokens

Common Use Cases

  • Adding an emoji picker to a chat, comment box, or reaction UI without pulling in a heavyweight, pre-styled picker library
  • Building a custom-styled emoji picker inside a design system by composing Frimousse’s unstyled parts with existing component primitives (e.g. a Popover)
  • Shipping a shadcn/ui-based app that needs an emoji picker matching the rest of the app’s shadcn tokens, installed directly via the shadcn CLI
  • Supporting international users with locale-aware emoji labels/search and skin-tone-specific emoji rendering

Under The Hood

Architecture Frimousse is organized as a small monorepo (root package plus a site/ documentation app, wired together with Turborepo) with a clear internal layering: src/data/ handles fetching, parsing, and searching Emojibase datasets (emoji.ts, emoji-picker.ts), src/store.ts/src/utils/store.tsx implement a small custom pub/sub store with batched, rAF-scheduled updates and React context/selector hooks, and src/components/emoji-picker.tsx composes both into the public compound-component API (EmojiPicker.Root, .Search, .Viewport, .List, etc.) using forwardRef and a dedicated EmojiPickerDataHandler that fetches data in an effect and feeds it into the store off the main thread via requestIdleCallback. This separation means data-fetching/caching, state, and rendering can each be reasoned about independently.

Tech Stack The package itself has zero runtime dependencies — only React and TypeScript as peer dependencies — and is built with tsup into dual ESM/CJS output with generated type declarations. Development tooling is Biome for linting/formatting, Vitest (in both jsdom and Playwright-driven browser modes) for tests, and publint/arethetypeswrong for package-export correctness checks. The documentation site under site/ is a separate Next.js-based workspace consuming the built package as a live playground.

Code Quality The repository documents 95%+ test coverage and backs that with an extensive __tests__ suite covering data parsing, search scoring, the custom store, storage helpers, and browser-only behaviors (emoji-support detection) via Vitest’s browser mode with real Chromium through Playwright. TypeScript is configured in strict mode with noUncheckedIndexedAccess, noUnusedLocals/Parameters, and verbatimModuleSyntax, and CI runs type-checking, Biome linting, and package-export validation on every change (.github/workflows/tests.yml), plus continuous preview releases via pkg.pr.new on every PR.

API Design The public surface is deliberately small: a single EmojiPicker namespace export composed of a handful of primitive parts, each accepting standard HTML props plus a few picker-specific ones (locale, columns, skinTone, onEmojiSelect). Consumers get sensible defaults (English locale, 9 columns, no skin tone) and can override just what they need, with full TypeScript types exported for every prop shape. The shadcn CLI installation path lowers the barrier further for a large existing audience, and the parts expose [frimousse-*] data attributes as a built-in styling hook for consumers who don’t want to write custom class logic.

Used by 5 apps in this directory

TypeScript
100%
Other

Dub

Analytics · Marketing

24,835

The open-source link attribution platform for short links, conversion tracking, and affiliate programs — powering 100M+ clicks monthly.

View details
81
Repo Health
78
Technical
62
Dependency
Built with
TypeScript 100%
Updated 5 days ago
Clojure
56%
Other

Metabase

Analytics

49,438

The open-source BI platform that lets anyone ask questions and build dashboards without writing SQL — with an embedded analytics SDK and AI-powered query assistant included.

View details
95
Repo Health
84
Technical
64
Dependency
Built with
Clojure 56%
TypeScript 38%
Updated 5 days ago
TypeScript
97%
GPL 3.0

OpenKnowledge

Code Editors · Knowledge Management · Note Taking

4,337

A beautiful, local-first markdown IDE that turns any git repo into a live collaborative workspace for humans and AI coding agents like Claude, Codex, and OpenCode.

View details
79
Repo Health
89
Technical
64
Dependency
Built with
TypeScript 97%
Updated 5 days ago
TypeScript
69%
AGPL 3.0

Plane

Collaboration · Productivity · Project Management

59,964

Open-source project management platform to replace Jira, Linear, and ClickUp — with built-in cycles, real-time collaborative docs, and full self-hosting.

View details
90
Repo Health
82
Technical
77
Dependency
Built with
TypeScript 69%
Python 27%
Updated 6 days ago
Python
55%
Other

PostHog

Ab Testing Experimentation · Analytics · Developer Tools

39,975

The all-in-one open source product platform combining analytics, session replay, feature flags, error tracking, AI observability, and a built-in data warehouse in a single self-hostable stack.

View details
92
Repo Health
80
Technical
65
Dependency
Built with
Python 55%
TypeScript 36%
Updated 5 days ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers