Skip to content

Latest commit

Β 

History

196 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Emojery

A free, open source browser extension that turns Likes, Stars and upvotes into the full emoji set on GitHub, Reddit, YouTube, Amazon, Facebook, Instagram and more.

License: GPL-3.0-or-later Version GitHub issues Downloads CI Security Chrome Web Store Firefox Add-ons Edge Add-ons Sponsor Emojery

What it looks like Β· Features Β· Supported sites Β· Install Β· Build from source Β· Contributing Β· Security Β· Support Β· Sponsors Β· Credits Β· License

What using Emojery looks like

Most platforms hand you a short list of approved reactions: like, upvote, heart, star. Sometimes that's all you need. But plenty of the time the thing you feel isn't on the menu, and you're left picking the closest button instead of the right one. Emojery adds an independent emoji layer on top, so you can react with what you actually mean.

The Emojery button in YouTube's action row, next to Like, Dislike and Share

Open a page you already use

Watch a video, read a post, browse a product β€” anywhere Emojery already works.

Find it next to the site's own buttons

A reaction button sits right beside the native controls you already know, showing the top 3 emoji and the total so far.

A close-up of the Emojery button showing the top 3 emoji and the running total
The Emojery picker open on a YouTube video, listing the top reactions with counts

Open the picker with one click

One click opens the dropdown, and how everyone is reacting is right there.

See what everyone else picked

The top 3 come first. Tap "Show more" for the top reactions, or search the whole emoji palette.

The open Emojery picker zoomed in, showing the top reactions with their counts
Searching the picker for 'thumbs up' and hovering the πŸ‘ reaction, about to add it

Pick your emoji and it counts for everyone

Tap any emoji and the public count updates for everyone in real time.

Find every reaction in your history

Open Emojery from the browser toolbar and the popup lists everything you've reacted to. Click any entry to jump back to the page and change or remove your reaction. Nothing's ever locked in.

The Emojery popup opened from the browser toolbar, showing your reaction history
A sealed record, with copies running out to GitHub, Bitcoin, Sigstore Rekor and Software Heritage

Your reaction gets sealed in public

Every reaction joins a public record. It's regularly published to GitHub, sealed into Bitcoin and copied to independent logs and archives no single party runs.

Anyone can check the math

A free, open-source tool adds every reaction back up and confirms the totals match. You can find your own in the record.

The published record beside the one an open-source tool recomputes, confirmed identical
Two independently drawn counts landing on exactly the same rings

Counts match

You see the same numbers everyone else sees, and anyone can prove they add up.

Features

Counts you can actually believe, in a picker you'll actually enjoy.

  • πŸ›‘οΈ Real people behind every count β€” the count is continuously protected against manipulation. Bots and scripted padding are kept out, and anything fake that slips through is removed from the totals.
  • πŸ”Ž Counts you can check yourself β€” don't take our word for the numbers. Every reaction lands in a public, add-only record, sealed into Bitcoin, watched by independent witnesses, and recountable by a free, open-source tool anyone can run.
  • πŸ”’ Private by design β€” change or take back reactions whenever you want. Delete your account and they are removed from the totals, leaving only the reversal needed to keep the record accurate. Your history stays on your device β€” no ads, profiling, or tracking.
  • 🎨 A full emoji palette β€” over 600 emoji, not the site's defaults. Pick the one that actually fits, or type a word and the picker finds it, with your recently used kept one tap away, all rendered from the same art on every device.
  • 🧩 Fits every page β€” takes on the page's styling and slots into the existing button row, like it always belonged there. And you decide where: switch it off per site, or swap out the native Like/Star entirely.
  • πŸ‘ Auto-press original buttons β€” your emoji can also press the site's own control. A positive pick presses Like or upvote, a negative one Dislike or downvote where the site has it. You sort which emoji count as which by dragging them between lists.
  • 🌐 Speaks your language β€” emoji labels and search work in 26 languages. Type amour, ζ„›, or love: all of them find ❀️.
  • πŸŒ™ Adapts to your theme β€” light or dark, the picker follows along and blends into the page instead of clashing with it.
  • πŸ”„ Never loses a reaction β€” tap on patchy wifi and it still lands: reactions are queued and delivered when you reconnect. React in one tab and the count ticks up live in every other tab you have open.
  • πŸ“Š Keeps your history β€” browse your own reaction history in the popup: search it, narrow it down by site, emoji, or date, and export the whole thing as one file to restore on another browser.

Supported sites

Curious what's next? Check the roadmap for upcoming site support and planned features. Want a site added? See how to request one in the FAQ.

Site Reacts on
Facebook Posts Β· Photos Β· Reels Β· Videos
Instagram Posts Β· Reels
Reddit Posts
GitHub Repos
GitLab Repos
YouTube Videos Β· Shorts
X Posts Β· Photos
Threads Posts
Amazon Products

250+ more sites on the roadmap.

The questions you're right to ask

Installing an extension is an act of trust. These questions get straight answers, each backed by something you can go and check for yourself.

Install

From the stores

Chrome Web Store, Firefox Add-ons, and Edge Add-ons listings are coming soon.

From source

Emojery is in public-unlisted beta. Until the stores go live, build it from source and load it as an unpacked add-on β€” see Build from source and development below.

Build from source and development

Tech stack

Builds for Chrome, Edge, Firefox, and Safari from one codebase.

Prerequisites

  • Node.js 24 or newer
  • pnpm β€” pinned via packageManager in package.json; corepack enable provisions the exact version automatically
  • git

Clone & install

git clone https://github.com/khasky/emojery.git
cd emojery
pnpm install

The postinstall hook runs wxt prepare and copies the bundled emoji locales into public/emoji-data/ β€” no extra step required.

Build for your browser

Pick the target that matches your browser. pnpm dev runs a live HMR watcher, pnpm build makes an unpacked production build, and pnpm zip packages it for upload.

# Chrome / Edge / Brave / Arc / Opera / any Chromium fork (MV3)
pnpm dev          # dev with HMR, opens a Chrome dev profile
pnpm build        # production build β†’ .output/chrome-mv3
pnpm zip          # package          β†’ .output/emojery-v<version>-chrome-mv3.zip

# Firefox / Firefox-based browsers (Manifest V2)
pnpm dev:firefox       # dev with HMR
pnpm build:firefox     # β†’ .output/firefox-mv2
pnpm zip:firefox       # β†’ .output/emojery-v<version>-firefox-mv2.zip

# Safari (requires macOS + Xcode)
pnpm build:safari      # β†’ .output/safari-mv2
pnpm zip:safari        # β†’ .output/emojery-v<version>-safari-mv2.zip
# Then wrap .output/safari-mv2 with Xcode's "Safari Web Extension" template

Reproducing the Firefox package for AMO review? See docs/amo-reviewer-build.md.

Load it unpacked

Chromium-based browsers (Chrome, Edge, Brave, Arc, Opera, Vivaldi):

  1. Open chrome://extensions (or edge://extensions, brave://extensions, ...).
  2. Toggle Developer mode on (top-right).
  3. Click Load unpacked and pick the matching .output/<target> folder.

Firefox:

  1. Open about:debugging#/runtime/this-firefox.
  2. Click Load Temporary Add-on... and pick any file inside .output/firefox-mv2/ (e.g. manifest.json).
  3. The add-on stays loaded until you restart Firefox β€” repeat after every restart while side-loading.

Don't use Install Add-on From File... with the packaged Firefox zip: release/beta Firefox reject unsigned packages ("could not be verified"). Load the unpacked folder as a temporary add-on instead.

Testing

Unit tests run under Vitest in a jsdom environment for extension-owned behavior: URL and ID parsing, target-key derivation, host matching, settings/storage, vote flow, shared registries, and Emojery UI components. They do not simulate supported-site page DOM; real placement, native-button replacement, theme/contrast, and browser integration are covered by the e2e suites.

pnpm test                          # run the unit suite once
pnpm test:watch                    # re-run on change while developing
pnpm test src/adapters/x.test.ts   # run a single file
pnpm test:browser                  # real-browser (WebKit + Firefox) tests: picker/popup UI + IndexedDB stores
pnpm test:coverage                 # unit coverage report (informational, no thresholds)

End-to-end tests (Playwright) drive the built extension against the real sites. They need a Chromium download and, for the signed-in flows, test credentials, so they live apart from the fast unit loop. The suites load .output/chrome-mv3-staging, so build it first β€” without that folder every browser run fails at launch:

pnpm build:staging                 # required first: the build the suites load
pnpm test:e2e                      # full E2E suite (live sites)
pnpm test:e2e:ci                   # signed-out placement + auth-click loop (no credentials)
pnpm test:e2e:hermetic             # the browser-free project (runs on every PR; needs no build)
pnpm build:staging:firefox         # then E2E_BROWSER=firefox pnpm test:e2e β€” the same suite in Firefox

See e2e/README.md for E2E setup, docs/adding-a-site.md for how to write adapter tests, and CONTRIBUTING.md for the full pre-PR gates (pnpm check).

Dev workflow & hot reload

pnpm dev runs a long-lived WXT watcher with HMR for the popup and auto-reload for content scripts and the background worker. See docs/development.md for what to reload when, auto-reload prerequisites, and watcher troubleshooting.

Contributing

Contributions are welcome β€” bug reports, site requests, and pull requests. See CONTRIBUTING.md for where each one goes, and docs/adding-a-site.md for the end-to-end checklist behind the most common contribution: support for a new site. Taking part is covered by the Code of Conduct.

Security

Found a vulnerability? Don't open a public issue β€” report it privately, see SECURITY.md.

Support

If Emojery is useful to you, you can support development:

Sponsors

No sponsors yet β€” the first spot is open. Sponsoring pays for the servers that keep public reaction counts online; where each tier appears, what artwork I need, and what won't be accepted are in SPONSORS.md.

Credits

Full notices for everything shipped inside the extension package (Noto Emoji, emojibase-data, Preact) live in public/licenses/, which WXT copies into every browser build.

License

This project is licensed under GPL-3.0-or-later. See the LICENSE file for details.

About

A free, open source browser extension that turns Likes, Stars and upvotes into the full emoji set on GitHub, Reddit, YouTube, Amazon, Facebook, Instagram and more.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages