Quiet the web. A free, open-source browser extension that removes the noise you didn't ask for — forced AI features (Google AI Overviews, AI Mode, Gemini, Bing Copilot, DuckDuckGo/Brave/Yahoo AI answers), cookie-consent banners, and — if you want — newsletter pop-ups, chat widgets and "open in app" banners.
→ Install from the Chrome Web Store — for Chrome, Brave, Vivaldi and other browsers that install from the Chrome Web Store.
Chrome (and the other browsers that install from the Chrome Web Store) and Firefox (desktop and Android), from one source tree. Free. No account. No tracking. Made by Purple Directive.
Only ~30% of people find new AI features in their apps useful; 40%+ call them an annoyance or hype (Prophet 2026; Stanford HAI 2026). Existing "AI blockers" are either paywalled with dark patterns or fragile single-site hacks. Quell is the honest one: the blocking core is free forever, it collects nothing to run, it never hides a real search result (every surface has an organic-result guard with a regression test), and its blocklist is kept fresh by an automated pipeline so it doesn't rot when sites change.
The popup has three groups — Search, Cookie banners, Pop-ups — each with one switch for the group and plain-language switches for each surface, plus:
- This site — every per-site control in one card: Keep AI on this site, Allow cookie banners here, Allow pop-ups here, and This site looks broken (see below).
- On this page Quell hid N things — so you can see it working.
- It asks before AI comes back. Switching Quell off, or showing any AI surface again, asks for confirmation first; hiding more never asks.
- Off means off. Switching Quell off puts every open page back as the site serves it: what was hidden, the toolbar count, and any address Quell rewrote (Classic results, Off at the source). In Chrome the same happens when Quell is disabled, removed or updated — the copy left running in an open tab stops by itself. In Firefox, reload the tab. After an update, a Google or Bing tab that was already open shows AI until its next search or reload, because the browser only puts Quell into those pages when they load.
- A first-run page (once, on install — never on update) says what Quell does, what it will never do, and where the switches are.
- Google — AI Overviews and AI Mode, on all 190 Google country domains. Two modes:
- Hide AI — surgically removes the AI blocks, keeps the rest of Google.
- Classic results ("Clean Web" in the code) — forces Google's classic web results (
udm=14); selector-proof, so it does not depend on Google's markup staying the same. Per-surface switches: the AI Overview, AI Mode entry points, Gemini promos and People-also-ask answers are each independently controllable.
- People-also-ask — Google builds these answers with the same AI as the Overview, and renders them as the same object, so a single switch hides both. Quell tells them apart: an overview you did not ask for is hidden, an answer you clicked open is kept. Both are yours to change.
- Bing — hides the Copilot sidebar, its buttons, every
/copilotsearchentry point (the "Search" tab and any other link into Copilot search) and the Copilot suggestion chips, under one switch. Each chip routes into Copilot, not into a web search, so 0.6.0 treats it as the entry point it is. An organic result that links to/copilotsearchis still never touched. - DuckDuckGo, Brave, Yahoo (opt-in) — these three are off until you
switch them on, because reaching them needs site access Quell does not ship
with. Quell's required access is frozen at Google and Bing: Chrome disables an
extension for every existing user when an update widens its required hosts, so
every engine added from here on is an optional permission you grant with one
click, and updates stay silent.
Once enabled, each engine offers Hide it (the default) or Off at the
source. Off-at-the-source uses the engine's own no-AI parameter — DuckDuckGo
assist=false, Bravesummary=0— which is selector-proof and so does not depend on their markup staying the same, but it redirects the page, so it is a choice rather than a default. Quell only ever adds that parameter: if you have set it yourself, or toggled the engine's own AI switch, Quell leaves your value alone. Yahoo publishes no such parameter, so the option is absent rather than inert. On Yahoo, Hide it also covers Yahoo Scout, its AI chat: the Scout tab, the "Try Yahoo Scout" promo and the right-rail "Explore AI results" panel (Yahoo's own "People also ask" answers, inside the results, are left alone). Ecosia is unverified (bot-walled) and deliberately ships no selectors. - Cookie banners (beta, opt-in) — blocks consent platforms at the network
layer (337 rules) and hides banners with the full EasyList Cookie List:
~15,000 generic selectors plus domain-specific rules for ~16,000 sites. Rules
derive from the open EasyList Cookie list (CC BY-SA 3.0 — see NOTICE).
If a site misbehaves, Allow cookie banners here (in the popup's This
site card) turns the cookie layer off for that site only — network and
cosmetic layers both.
All three cosmetic layers lift immediately on the open page, and the same
goes for switching Cookie banners or Quell itself off. The generic EasyList
sheet is injected natively by Chrome and cannot be pulled back out of a
loaded page, so every rule in it is written to apply only while the page's
root element is not marked
data-quell-cookies="off"; Quell sets that mark whenever the layer is down. Say "reject all" for me (opt-in, off by default) clicks the consent platform's own Reject all button, so the choice is actually recorded rather than left unmade. Strictly scoped to recognised consent platforms — Quell never clicks a site's own controls. A platform has to load to record a refusal, so with this switch on Quell stops blocking the four it can press that its network layer otherwise blocks (OneTrust, Cookiebot, Didomi, Osano — one dynamic allow rule, removed again when the switch goes off); every other consent platform stays blocked. Before 0.6.0's live verification this was missed: the network layer blockedcdn.cookielaw.organd the reject click had nothing to press. The click waits until the page has finished parsing (so the platform's own script is listening), counts only once the platform hides its banner or records the choice, and is retried at most twice if it did not — including when the platform re-renders its banner (a replaced banner is followed to its replacement, not taken as an answer). A choice you already made is never overridden: before every click Quell checks the platform's own saved-choice cookie (OneTrust, Cookiebot, Didomi, CookieYes, cookie-law-info, Complianz, Borlabs), so a banner re-opened to review consent is left alone; a banner the site has dismissed — by inline style, attribute, or a recognised vendor state class — is left alone; and for the two platforms whose saved choice Quell cannot read (Osano, Termly), a banner that appears after being hidden is hidden, never clicked. - Pop-ups (opt-in, off by default) — newsletter sign-up modals, chat-widget
launchers and "open in app" banners, each with its own switch. Rules derive
from EasyList's Newsletter Notices, Chat Widgets and (app-banner rules
only) Notifications lists via the same pipeline, plus a short curated list of
chat-vendor launchers and sign-up vendors EasyList misses (Attentive's
e-mail/SMS sign-up). Cosmetic only — Quell blocks no requests here — and
it can never hide page content: the pipeline drops any structural selector
(
main,article,#content,.wrapper…), any rule aimed athtmlorbodyin any form (body.newsletter-openincluded), and any rule that is only a site's generic modal shell (.modal,.modal-backdrop,#popup,.ui-widget-overlay…). At run time nothing that is or holdsmain,article,[role=main], an<h1>, an article's worth of text, a password field, or a sign-in / cart / checkout form or dialog is ever hidden; and a per-site rule hides an element only once it looks like what this layer is for — an e-mail field or sign-up wording, a known chat widget, or an app-install banner. If a hidden overlay left the page scroll-locked, the lock is released (and handed back when you pause the site). Needs the same all-sites access as cookie banners.
One button in the popup. It opens a dialog showing exactly what will be
sent — {"host": "<the site's domain>", "version": "<Quell version>"} — and
sends only that, only when you press Send report. No page address, no page
content, no identifier. The button is only offered for a public website's
address (the same host rule the endpoint enforces, in
extension/src/shared/report-host.js), and the endpoint only accepts reports
from Quell's own extension origins. The endpoint (server/report-worker, a small
Cloudflare Worker) stores a count per domain, per version, per day; it does not
log or keep IP addresses. The weekly rules job reads the counts
(pipeline/fetch_reports.py). The endpoint URL is one constant,
REPORT_ENDPOINT in extension/src/shared/config.js. On Firefox the browser
also asks the user's permission (an optional data-collection permission) the
first time.
extension/ the extension: manifest.json, src/, generated rules/
pipeline/ build_rules.py, package.sh, bump.sh, make_manifest.py, fetch_reports.py, weekly-refresh.sh
server/report-worker/ the "This site looks broken" Cloudflare Worker (deploy.sh supplies ids from the environment)
store/ LISTING.md, privacy-policy.md, make-assets.mjs, assets/, logo-v2/
tests/ Playwright suite (run.sh)
docs/ RUNTIME-RULES-POLICY.md
tools/ compliant-claims linter
Contributor and agent rules: DIRECTIVE.md.
pipeline/build_rules.py regenerates the cookie rules from the EasyList Cookie
List (and, since 0.6.0, rules/popups.json for the pop-ups layer): network block rules (rules/cookie-cmp-easylist.json), a generic hide
stylesheet Chrome injects natively (rules/cookie-generic.css), and a
domain-specific selector map (rules/cookie-domains.json) that the background
serves to each page one host-slice at a time — pages never see the whole map,
and the files aren't web-accessible (sites can't fingerprint Quell). Only filter
syntax that translates with full confidence is converted; everything else is
dropped and counted, and the build fails loudly if output shrinks
suspiciously. A weekly GitHub Action (quell-rules-refresh) opens a PR when
upstream rules change.
- More AI surfaces — Gemini in Gmail/Docs/Drive, Meta AI, Grok on X, YouTube AI.
- A device-wide DNS option, and "Do Not Train" / opt-out signals.
Not on the roadmap: ad-blocking. uBlock Origin already does that better than anyone, for free. For ads, we recommend uBlock Origin — pointing you to the better tool is the honest thing to do.
- It does not "delete your data from AI servers" — no client tool can. The honest version (send opt-out signals, surface every platform's opt-out controls) ships in a later phase.
- It does not stop AI globally — only in your browser, on your device.
- It does not track you or phone home. The only thing it ever sends is a breakage report you choose to send (a domain and a version number).
Chrome and other Chromium browsers:
- Open
chrome://extensions. - Enable Developer mode.
- Load unpacked → select the
extension/folder. - Pin Quell, run a Google search, open the popup to toggle modes.
Firefox: bash pipeline/package.sh, then about:debugging → This Firefox →
Load Temporary Add-on → dist/build/firefox/manifest.json.
extension/manifest.json is the Chrome manifest. pipeline/make_manifest.py
derives the Firefox one (event-page background instead of a service worker,
browser_specific_settings.gecko with id [email protected],
strict_min_version 140.0 desktop / 142.0 Android, Firefox's optional
data-collection permission for the breakage report, and a ≤45-character name).
pipeline/package.sh emits dist/quell-<v>-chrome.zip
and dist/quell-<v>-firefox.zip; npx web-ext lint passes on the Firefox build.
Firefox closes a toolbar popup when its permission prompt opens, so on Firefox
the switches that need a grant open the same settings page in a tab and ask
there.
tests/run.sh loads the real extension into Playwright's Chromium and verifies
every surface against local fixtures (no live Google/Bing traffic): AI-block
hiding, the organic-result false-positive guard, clean-web redirect, master-switch
gating of the network ruleset, cookie-banner hiding and reject-all, the pop-ups
layer and its content guard, scroll-lock release, the per-site pauses, the popup
(confirmations, site card, breakage report), the welcome page, the settings
migration to storage.sync, and the report Worker. Requires a global
playwright install (npm i -g playwright + playwright install chromium).
tests/firefox.mjs runs the Firefox build in a real headless Firefox when
QUELL_FIREFOX_BIN and QUELL_PUPPETEER are set (it skips otherwise).
No analytics, no telemetry, no account. Your choices are kept in the browser's
extension sync storage, so the browser syncs them to your own browser
account (Google / Mozilla) when you are signed in with sync on —
Purple Directive never receives them. Firefox for Android and Opera do not sync
extension settings, so there they stay on the device. Three grant-bound switches (other engines,
cookie banners, pop-ups) and the hidden-items counter stay on each device.
Settings from 0.5.x move from storage.local to storage.sync on update without
loss. The only thing sent to Purple Directive is a breakage report you choose
to send.
The base install requests only storage, declarativeNetRequest (rule-based
blocking Quell can't read your traffic through), and scripting. The broad
all-sites permission is optional — it's requested only if you turn on
Cookie banners or Pop-ups, and only then can those layers run on the
pages you visit. Switch both off and Quell hands the access back
(permissions.remove, from the popup on that click, and on browser start for
state that is already off — except while the DuckDuckGo / Brave / Yahoo switch is
on, because in Chrome removing all-sites access takes those hosts with it and only
a click in the popup may ask for them back; then it is handed back the next time
you switch Cookie banners or Pop-ups off in the popup); switching either on again
asks again. Leave both
off and Quell never touches a page outside Google/Bing search.
If the access is revoked from the browser's extensions page instead, both
switches go off with it, so the popup never shows a feature as on that cannot
run.
Store data declarations (0.6.0): Chrome Web Store — Web history,
limited to the hostname the user chooses to report; Firefox —
data_collection_permissions required none, optional browsingActivity +
technicalAndInteraction. Used only for fixing site breakage; never sold,
shared, or used for unrelated purposes or creditworthiness. Full answers in
store/LISTING.md. The breakage report needs no extra permission (it is a
plain CORS request).
Quell uses semantic versioning. pipeline/bump.sh patch|minor|major is the only way the version
changes:
- patch (0.6.0 → 0.6.1): fixes, and updated blocking rules (including the weekly EasyList refresh).
- minor (0.6.x → 0.7.0): something you'll notice as new, such as a feature, a switch, a search engine, a browser, an optional permission or a new kind of data sent.
- major (0.x → 1.0.0): a change that breaks existing installs, such as a new required permission, a removed feature or reset settings.
Every version sent to a store is published here as a tagged release, with notes and the exact packages that were submitted.
MIT — see LICENSE.
Quell stays free. If it's useful, you can support the work that keeps its rules current at github.com/sponsors/TyrianMurex.