• DocsDocs
  • PricingPricing
Sign in
Get started
Sign in
Get started
    • Products
      • Sync
        Sync

        The sync engine for the agentic web

      • Comments
        Comments

        Contextual commenting

      • Notifications
        Notifications

        Smart alerts for your app

    • Platform
      • Realtime infrastructure

        Multiplayer sync for people and AI

      • SDKs & integrations

        Client libraries and framework adapters

      • Security & compliance

        SOC 2, HIPAA, GDPR

    • Agentic users

      Build agentic experiences

    • AI activity feed

      Surface AI activity in your app

    • Canvas

      Build collaborative canvases

    • Chat

      Create realtime chat experiences

    • Code editor

      Build collaborative coding experiences

    • Comments

      Add contextual discussion

    • Custom app

      Start with flexible building blocks

    • Forms

      Collect input together

    • Flowchart

      Diagram together

    • Inbox

      Keep users informed

    • Presence

      Show who is online

    • Slideshow

      Present together

    • Spreadsheet

      Collaborate on data

    • Text editor

      Edit documents together

    • Industries
      • Human resources

        Collaboration for HR & talent tools

      • Security & compliance

        Collaborative reviews for audits & evidence

      • Sales & marketing tools

        Engaging features that help sellers sell

      • Healthcare

        HIPAA-ready collaboration for care teams

      • Creative tools

        Multiplayer canvases for people & AI

      • Legal

        Secure drafting for firms & clients

      • AEC

        Collaboration for design & construction

      • Education

        Interactive realtime learning experiences

    • Users
      • Enterprise

        Realtime collaboration without a rewrite

      • Innovation

        Validate and ship multiplayer bets fast

      • Startups

        Build multiplayer products from day one

      • Individual builders

        Prototype multiplayer apps in minutes

    • Tools
      • Examples

        Gallery of open source examples

      • Showcase

        Gallery of collaborative experiences

      • Next.js Starter Kit

        Kickstart your Next.js collaborative app

      • DevTools

        Browser extension

      • Tutorial

        Step-by-step interactive tutorial

    • Company
      • Blog

        The latest from Liveblocks

      • Customers

        The teams Liveblocks empowers

      • Changelog

        Weekly product updates

      • About

        The story and team behind Liveblocks

  • Docs
  • Pricing
  • Products
    • Sync
    • Comments
    • Notifications
    Platform
    • Realtime Infrastructure
    • SDKs & integrations
    • Security & compliance
    Solutions
    • Human resources
    • Security & compliance
    • Sales & marketing tools
    • Healthcare
    • Creative tools
    • Legal
    • AEC
    • Education
    • Enterprise
    • Innovation
    • Startups
    • Individual builders
  • Use cases
    • Agentic users
    • AI activity feed
    • Canvas
    • Chat
    • Code editor
    • Comments
    • Custom app
    • Forms
    • Flowchart
    • Inbox
    • Presence
    • Slideshow
    • Spreadsheet
    • Text editor
    Technologies
    • Next.js
    • React
    • JavaScript
    • Redux
    • Zustand
    • Yjs
    • Tiptap
    • BlockNote
    • SuperDoc
    • Slate
    • Lexical
    • Quill
    • Monaco
    • CodeMirror
  • Resources
    • Documentation
    • Examples
    • Showcase
    • DevTools
    • React components
    • Next.js Starter Kit
    • Tutorial
    • Guides
    • Release notes
    Company
    • Pricing
    • Blog
    • Customers
    • Changelog
    • About
    • Contact us
    • Careers
    • Terms of service
    • Privacy policy
    • DPA
    • Security
    • Trust center
    • Subprocessors
  • HomepageSystem status
    • Github
    • Discord
    • X
    • LinkedIn
    • YouTube
    © 2026 Liveblocks Inc.
Blog/Engineering

We’ve open-sourced our customizable React emoji picker

Introducing Frimousse, a headless open-source emoji picker component for React.

Picture of Chris NicholasPicture of Marc BouchenoirePicture of Pierre Le Vaillant
Chris Nicholas, Marc Bouchenoire, Pierre Le Vaillant on March 20th, 2025
We’ve open-sourced our customizable React emoji picker
March 20th, 2025·3 min read
  • Picture of Chris NicholasChris Nicholas
  • Picture of Marc BouchenoireMarc Bouchenoire
  • Picture of Pierre Le VaillantPierre Le Vaillant
Share article
Product UpdatesCommentsOpen source

Ready to get started?

Join thousands of companies using Liveblocks to build multiplayer experiences for people and agents.

Get started for free

Related blog posts

  • How CRDTs and sync engines keep realtime lists ordered with fractional indexing

    How CRDTs and sync engines keep realtime lists ordered with fractional indexing

    Picture of Chris Nicholas
    Picture of Vincent Driessen
    April 23rd
    Engineering
  • Why WebSocket gets hard in multiplayer apps

    Why WebSocket gets hard in multiplayer apps

    Picture of Steven Fabre
    April 20th
    Engineering
  • Introducing Zen Router: our open-source type-safe router compatible with Cloudflare Workers

    Introducing Zen Router: our open-source type-safe router compatible with Cloudflare Workers

    Picture of Vincent Driessen
    February 26th
    Engineering

We’ve just released Frimousse, a new open-source emoji picker for React. Unstyled, designed to be lightweight and highly composable, the new component can seamlessly fit into any application.

Origin

We first felt the need for a new emoji picker when building Liveblocks Comments, which is where we built our first version.

The Liveblocks Comments emoji picker.

We built this because we discovered that there were no existing components that fit our specific needs:

  • It needed to be fully unstyled, so we could apply our styling from our existing components. For example, we use a number of complex CSS variables for sizing, colours, and more, and we needed the emoji picker to inherit these.
  • We wanted a small bundle, only requiring users to download emoji lists when the picker is used, caching data so re-downloads aren’t required.
  • We wanted it to always have the latest emojis, as other libraries often require you to install new versions to get updates.

Frimousse

We’d always loved the thought of open-sourcing our Comments emoji picker, and after two years of production use, we decided it was time to give back to the web community—try a demo below.

A live example of the emoji picker.

Loading…
Category

Primitives

Frimousse uses primitive components, similar to Radix UI, that essentially allow you to create an emoji picker out of building blocks.

import { EmojiPicker } from "frimousse";
export function MyEmojiPicker() { return ( <EmojiPicker.Root> <EmojiPicker.Search /> <EmojiPicker.Viewport> <EmojiPicker.Loading>Loading…</EmojiPicker.Loading> <EmojiPicker.Empty>No emoji found.</EmojiPicker.Empty> <EmojiPicker.List /> </EmojiPicker.Viewport> </EmojiPicker.Root> );}

Because each component is headless, you can apply your own styles, whilst Frimousse handles the functionality. For example, it’s compatible with Tailwind CSS, CSS-in-JS, and vanilla CSS. We also have a pre-built shadcn/ui component, with ready-made styles.

Comments primitives

If you’re using our Comments primitives, it’s now easy to add your own emoji picker. Check out our Tailwind CSS primitives example to learn how to set it up.

Get started

To build your custom emoji picker, visit our new mini-site for documentation and examples.

Get Frimousse

Comments primitives

If you’re already using our Comments primitives, it’s now easy to add your own emoji picker with Frimousse.

Our Comments primitives example.

You can find the source code in our examples gallery.

Contributors

Contributors include:marcbouchenoire

1 authors