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.
What it looks like Β· Features Β· Supported sites Β· Install Β· Build from source Β· Contributing Β· Security Β· Support Β· Sponsors Β· Credits Β· License
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.
|
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. |
|
|
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. |
|
|
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. |
|
|
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. |
|
|
Counts match You see the same numbers everyone else sees, and anyone can prove they add up. |
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.
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 |
|---|---|
| Posts Β· Photos Β· Reels Β· Videos | |
| Posts Β· Reels | |
| Posts | |
| GitHub | Repos |
| GitLab | Repos |
| YouTube | Videos Β· Shorts |
| X | Posts Β· Photos |
| Threads | Posts |
| Amazon | Products |
250+ more sites on the roadmap.
Installing an extension is an act of trust. These questions get straight answers, each backed by something you can go and check for yourself.
- "Do I really have to install an extension?"
- "What permissions does it ask for?"
- "Is it going to read my pages?"
- "Do I have to sign up?"
- "How do I know it isn't tracking me?"
- "Almost nobody is on it yet. Why install?"
Chrome Web Store, Firefox Add-ons, and Edge Add-ons listings are coming soon.
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.
Builds for Chrome, Edge, Firefox, and Safari from one codebase.
- Node.js 24 or newer
- pnpm β pinned via
packageManagerinpackage.json;corepack enableprovisions the exact version automatically git
git clone https://github.com/khasky/emojery.git
cd emojery
pnpm installThe postinstall hook runs wxt prepare and copies the bundled emoji locales into public/emoji-data/ β no extra step required.
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" templateReproducing the Firefox package for AMO review? See docs/amo-reviewer-build.md.
Chromium-based browsers (Chrome, Edge, Brave, Arc, Opera, Vivaldi):
- Open
chrome://extensions(oredge://extensions,brave://extensions, ...). - Toggle Developer mode on (top-right).
- Click Load unpacked and pick the matching
.output/<target>folder.
Firefox:
- Open
about:debugging#/runtime/this-firefox. - Click Load Temporary Add-on... and pick any file inside
.output/firefox-mv2/(e.g.manifest.json). - 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.
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 FirefoxSee 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).
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.
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.
Found a vulnerability? Don't open a public issue β report it privately, see SECURITY.md.
If Emojery is useful to you, you can support development:
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.
- Emoji artwork β Noto Emoji Β© Google LLC, licensed under the SIL Open Font License 1.1. The picker and History tab bundle a WebP sprite sheet rasterized from Noto's SVG glyphs.
- Emoji names & search keywords β Unicode CLDR via
emojibase-data. See docs/localization.md.
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.
This project is licensed under GPL-3.0-or-later. See the LICENSE file for details.
