Frequently asked questions
Short answers to the questions we hear most often.
About Better Likes
What is Better Likes?
Better Likes is a browser extension that adds an emoji-reaction picker to pages on supported websites. You react with any emoji from the full Unicode set, and you see aggregate counts of how everyone else reacted to the same page, post, or item. The counts are public; the identities behind them are not.
Is it free?
Yes. Better Likes is free to install, free to use, and there are no paid tiers. The project accepts donations to cover server costs, but every feature is available to every user.
Is it open source?
Yes — the extension code is licensed under GPL-3.0. The source lives on GitHub. You can read the code, build it yourself, file issues, and send pull requests.
Who builds Better Likes?
A solo developer. There is no parent company, no investor, and no advertiser relationship. The project is funded by donations and operated to break even on infrastructure.
How is Better Likes different from the site's own Like button?
Native buttons give you one or a handful of choices and feed the host platform's algorithm. Better Likes gives you the full emoji palette, shows counts that nobody can manipulate by paying for promotion, and works across every supported site with the same UI. You can keep the native button or hide it from the extension settings. For the broader idea behind the product, read Freedom of expression needs more than a Like button.
Using it
How do I add a reaction?
Open any supported page. A small "React" trigger appears next to the site's existing action row. Click it, pick an emoji (or type a word to search), and you're done. The picker also shows the most recently used emojis.
Can I change my reaction?
Yes — click the picker again and choose a different emoji. The previous one is removed from your record and the counters update accordingly. Only one reaction per item per account.
Can I remove my reaction entirely?
Click the same emoji you already picked, or use the picker's highlighted entry to toggle it off. Removing it decrements the aggregate count by one.
Where do my reactions show up?
Right next to the original buttons on the page — a thumbs-up row on Facebook, the action row next to Star on GitHub, the rating area on Amazon, and so on. The extension's popup also keeps a personal History tab so you can revisit what you reacted to.
Can I search for an emoji by name?
Yes. The picker has a search bar that matches Unicode CLDR labels and tags. love, amour, and 愛 all find ❤️; fire finds 🔥; idea finds 💡. Search works in the same language your browser is set to.
How do I hide the native Like / Star button?
Open the extension popup → Settings → "Replace original buttons". When on, the site's native button is hidden in favour of the picker. The setting is global; you can flip it back any time. A reload of open tabs is needed for the change to take effect.
Can I disable Better Likes on a specific site?
Yes. The popup has a per-site toggle for every supported site, plus a global "Enabled" switch. Disabling a site hides the picker there without uninstalling the extension.
Account & sign-in
Why do I need to sign in to react?
So one person counts as one vote. Reading reactions is fully anonymous and requires no account; only submitting one needs a verified identity, which is what makes the counts meaningful instead of botted. The full reasoning is on Why Better Likes asks for an email.
Why email — why not Google / GitHub / device ID?
Social sign-in would tell the social provider every site you react on. Device IDs are trivial to mint by the thousand and would make counts as fake as the platforms we're trying to fix. Email is the one identifier almost everyone already has and that costs real effort to mass-produce.
Do you store my email?
No. Your email is sent over TLS, used once to deliver a six-digit code, and
then discarded. The only long-lived value is an irreversible salted hash (sha256(server_salt || lowercase(email))) that becomes your account identifier. Even we cannot look up an account by
email — only by hash.
How does sign-in work?
Enter your email; we mail you a 6-digit one-time code that expires in 10 minutes; enter the code and you're signed in for 30 days. No password to remember, no password to leak. When the session expires, the next reaction will reopen the sign-in tab.
I never received the code.
Check your spam folder first — transactional one-time codes are sometimes filtered. Delivery can take up to 10 minutes depending on your mail provider, so wait that long before requesting a new one. If nothing arrives after that, open the extension popup → Report tab and submit the issue with details about your email provider (Gmail, Outlook, ProtonMail, iCloud, a corporate server, etc.) so we can investigate the delivery path. Some corporate mail servers and a handful of mail providers block automated mail; if yours does, try a different address.
Can I use a disposable / temporary email?
No. The extension and the server both reject known disposable-mail domains. Temporary inboxes would let a single person mint unlimited accounts, which is exactly the abuse the email check exists to prevent.
How do I sign out?
Open the extension popup → Account → Sign out. Your local session is cleared immediately; your past reactions and counters are untouched.
How do I delete my account?
Popup → Account → Delete. Your user record is erased, every reaction you submitted is decremented from the aggregate counters, and your local session is cleared. Deletion is immediate and irreversible — there is no queue, no review, and no soft-delete.
Privacy & data
What data do you collect?
The reactions you submit, the public target you reacted to (e.g. a GitHub repo URL), a salted hash of your email as your account identifier, a 30-day signed session token, and a day-rotated salted hash of your IP used only for rate-limiting. That's it. Full list on the privacy page.
What do you NOT collect?
No name, no persisted email, no raw IP, no browser fingerprint, no hardware identifiers, no analytics, no tracking cookies, no third-party marketing SDKs, no data from pages you didn't react on, and no password.
Do you sell or share my data?
No. We don't sell data, share it with advertisers, or hand it to data brokers. The subprocessors we rely on (Cloudflare, Neon, Resend) act as data processors under GDPR — they store or transmit on our behalf and cannot use the data for their own purposes.
Are my reactions public?
The aggregate counts on each item are public. The individual mapping of "which account picked which emoji" is never exposed through the API and is held only long enough to prevent double-voting before it is deleted.
Can someone tell I reacted to a particular post?
No. The API exposes aggregate counts and your own reaction (only to you, only when signed in). There is no "who reacted" endpoint and there will never be one.
Does Better Likes work in private / incognito mode?
The extension runs in private mode if you allow it in your browser's extension settings. Reads work as usual. Writes require a signed-in session, which lives in extension storage — most browsers keep extension storage scoped per profile, so you may need to sign in again from a private window depending on the browser.
Counts & voting
How are the counts calculated?
Each verified account contributes at most one reaction per target. The displayed number is the sum across all such accounts. There is no weighting, no algorithm, and no "trending" boost — one person, one count.
Can the same person vote multiple times?
No. Each account is allowed exactly one reaction per item; changing it replaces the previous one rather than adding a new vote. The server enforces this on submit, so a malicious client can't bypass it.
What about bots and fake accounts?
The email-OTP requirement makes mass account creation expensive, and the disposable-domain check rules out the cheapest way to automate it. Rate limits and replay-protection nonces stop a single account from spamming. Nothing eliminates abuse entirely, but the bar is set high enough that the counts mean something.
The counts I see don't match what I expect.
The extension caches counts for up to a minute to keep things snappy and to be kind to the API. Refresh the page after that window and you'll see the latest server values. After your own vote, the counter updates locally right away; the broadcast to other tabs of the same site is instant.
I voted but the count didn't change.
Most often this is a stale cache — wait a few seconds or reload. If you signed out between viewing and reacting, the click opens the sign-in tab instead of voting; sign in and click again. Persistent failures are worth reporting from the extension's Report tab.
Sites & browsers
Which sites are supported?
Today: Facebook, GitHub, and Amazon. The list grows over time and new sites ship as data-only updates — no reinstall needed when one lands.
Can I request a new site?
Yes. Open an issue on GitHub with a few example URLs and screenshots of where the picker should sit. Sites with stable, public, addressable item URLs are the easiest to add.
What happens when a site redesigns and the reaction picker breaks?
Sites we support change their HTML constantly — sometimes overnight, without warning. The extension finds the right place to inject the picker using a small set of CSS selectors per site, and those selectors stop matching the moment a site ships a layout change. Historically, that means an extension update, a store review wait, and a few days of broken-looking pages for users.
Better Likes avoids that loop entirely. The selectors don't live inside the extension binary — they live on our server, behind a small public endpoint the extension fetches on startup and re-checks regularly. The extension itself is just the runtime; the site-specific knowledge it uses is data, served fresh.
To keep that data correct, a scheduled worker runs every day. It opens each supported site in a real headless browser, checks whether the current selectors still find the buttons they're supposed to find, and if anything looks off it hands the rendered DOM to an AI model that proposes a new selector for the same element. A human-readable diff is generated, a quick automated sanity check confirms the new selector picks the right thing, and the updated manifest is published to the same endpoint the extension already polls.
In practice this means a site redesign is usually fixed within 48 hours — without you reinstalling anything, without a store review queue, and without us shipping a new extension version. On the rare occasions where the change is too structural for the AI to handle alone, the daily probe alerts a maintainer so the fix lands by hand instead of silently rotting.
Which browsers does it run on?
Any Chromium-based desktop browser (Chrome, Brave, Vivaldi, Opera, Arc, Edge, …) via the Chrome Web Store, and Firefox 115+ via AMO. See Install for the full matrix including mobile and forks.
Will it work on mobile?
On Android, yes — through Firefox for Android (recommended) or Kiwi Browser. On iOS, a Safari Web Extension is planned but not yet shipping. Until then, mobile Safari is unsupported.
Does my reaction sync between my devices?
Yes. Your account lives on the server, so signing in on a second browser shows the same reactions and the same history. Local settings (which sites are enabled, "replace native", etc.) are per-install today.
Troubleshooting
The reactions block isn't appearing.
Check the popup: the master "Enabled" switch should be on, and the per-site toggle for the site you're on should also be on. If the site recently changed its layout, the adapter may need updating — use the Report tab to let us know.
I can't see the reactions button on a particular website.
Stay on the page where the button is missing and open the extension popup → Report tab from there. Submitting the report directly from the broken page attaches the exact URL so we can reproduce the layout and ship an adapter fix. If the site is supported but the picker is hidden, double-check that both the global "Enabled" switch and the per-site toggle are on, then reload the tab before reporting.
I get "Too many wrong codes — try again in an hour".
That's a per-email lockout after several incorrect codes in a row. Wait an hour and request a fresh code. It exists to make brute- forcing other people's accounts impractical.
I get "Too many requests".
The OTP request endpoint is rate-limited per email and per IP to stop someone from mailbombing strangers with codes. Wait a few minutes and try once more.
How do I report a bug or a missing site?
The extension popup has a Report tab that captures the current URL, your free-text note, and sends it to us. Alternatively, open an issue on GitHub.
Does the extension slow down pages?
The content script renders only when the picker comes into view (200px below the fold) and uses a shadow DOM so it can't leak styles into the page. Reads are batched and cached for a minute. On normal pages the cost is unmeasurable.
The project
What makes Better Likes unique?
You can view and submit reactions on every supported site without ever signing in to that site itself. A single Better Likes account — verified once by email — works across Facebook, GitHub, Amazon, and every site we add later. No host-platform login, no per-site account, and no caps on how often you can react. Our promise is simple: react everywhere, with no limits.
How is Better Likes funded?
Donations. There is no advertising, no paid tier, no data monetisation, and no investor with a return to chase. The donate page lists current ways to chip in.
What's the license?
GPL-3.0-or-later for the extension source code. You can self-host, fork, study, and redistribute under the same terms.
How do you compare to other reaction extensions?
See the compare page and the individual head-to-heads against AllReacts, FB Purity, Return YouTube Dislike, Social Fixer, and others.
I have a question that isn't here.
Open a discussion on GitHub or file an issue — we update this page as new questions come up.