A small Chrome extension that gets AI Overview and AI Mode out of Google search.
DeSlop is a Manifest V3 browser extension (Chrome + Firefox) that removes Google's AI surfaces — the AI Overview block on the results page, the AI Mode tab in the SERP nav, the AI Mode pill on the homepage search bar, and (opt-in) every other piece of non-link cruft via the udm=14 Web filter. Four independent toggles, no telemetry, no network requests, no remote config.
The AI Overview block at the top of Google search results is gone. It's caught by a CSS rule the moment Google streams it in, and a localized DOM scanner walks up to the result-block boundary so the entire module disappears cleanly — without ever touching adjacent organic results.
| Before | After |
|---|---|
![]() |
![]() |
The AI Mode pill in the homepage search bar is gone too. Google puts a small AI-mód / AI Mode button right inside the search input. It's caught by Google's current jsname and a localized text-match fallback for when that rotates.
| Before | After |
|---|---|
![]() |
![]() |
Four independent toggles. Each one does exactly one thing.
| Toggle | Default | What it does |
|---|---|---|
| Hide AI Overview | on | Removes the AI summary block from the SERP. CSS + MutationObserver, catches the block as Google streams it in. |
| Hide AI Mode buttons | on | Removes the AI Mode tab from the SERP nav AND the AI Mode pill from the homepage search bar. Both surfaces become literally unclickable. |
| Skip AI Mode pages | on | If a URL has ?…&udm=50 (AI Mode), strip the param so you land on the regular All tab. Belt-and-braces with the previous toggle — covers cases where you're routed to AI Mode from outside Google. |
| Just the links | off | Adds ?…&udm=14 to every Google search, switching Google to its hidden Web filter view. No AI, no ads, no shopping, no knowledge panels. Opt-in. |
Hide AI Overview and Hide AI Mode buttons target different surfaces. AI Overview is the summary paragraph inside normal search results — you can scroll past it. AI Mode is a separate page where the entire UI becomes an AI chat. Some people are fine with one and want the other gone.
Hide AI Mode buttons and Skip AI Mode pages also do different things. The first hides the entry points (the SERP tab and the homepage pill) so you can't click into AI Mode. The second strips udm=50 from URLs so you don't land on AI Mode even if you arrive there from a direct link or from Google routing you there programmatically. Both default on is the safe combination.
Just the links is opt-in because Google's Web filter strips ads as a side effect. If you'd rather support sites with ad revenue, leave it off.
Listing pending review.
Listing pending review.
- Download or clone this repo.
- Open
chrome://extensions. - Toggle Developer mode at the top-right.
- Click Load unpacked and pick the
deslop/folder. - Pin the deslop icon from the toolbar puzzle-piece menu.
After any code change, hit the reload icon on the extension's card in chrome://extensions — Chrome doesn't auto-reload unpacked extensions on file change.
Firefox loads unpacked extensions slightly differently. They live until you restart the browser:
- Download or clone this repo.
- Run
python scripts/build.pyto producedeslop-firefox-v<version>.zipat the repo root. - Open
about:debugging#/runtime/this-firefox. - Click Load Temporary Add-on… and pick the Firefox zip (or pick
manifest.firefox.jsondirectly). - For a persistent install, you need an AMO-signed build — submit the same zip at https://addons.mozilla.org/developers/.
python scripts/build.py
Produces both deslop-chrome-v<version>.zip (uses manifest.json, service_worker background) and deslop-firefox-v<version>.zip (uses manifest.firefox.json, scripts background, browser_specific_settings.gecko.id).
| URL or element | Default settings | Just the links on |
|---|---|---|
| AI Overview block on regular SERP | hidden (CSS + DOM scanner) | gone (Google's Web filter excludes it) |
| AI Mode tab in SERP nav | hidden (CSS) | hidden (CSS) — and the URL would redirect anyway |
| AI Mode pill in homepage search bar | hidden (CSS + text-match scanner) | hidden (CSS + text-match scanner) |
AI Mode URL (udm=50) |
stripped → All tab | stripped → All tab → then rewritten to udm=14 |
| Ads | untouched | gone |
| Shopping / knowledge panels | untouched | gone |
| Image / video / news grids | untouched | gone |
udm=14 / udm=2 / tbm=isch (an explicit tab) |
untouched | untouched |
| Google homepage | search bar AI Mode pill hidden | search bar AI Mode pill hidden |
| Google Images / Maps / News at their own URLs | untouched | untouched |
| Non-Google search engines | untouched | untouched |
Three independent layers, each with strict guards against false positives.
1. URL redirection (declarativeNetRequest). Two rulesets are registered. ai_redirect_ruleset strips udm=50 from Google search URLs (escapes AI Mode). power_redirect_ruleset adds udm=14 to plain queries (forces the Web filter). The background service worker toggles each ruleset on or off based on the popup settings — the rules themselves are declarative, evaluated by Chrome's network stack, and never see the URL contents.
2. CSS hides (content.js). A <style> tag is injected at document_start. For AI Overview, the rule is #m-x-content, div[data-hveid]:has(#m-x-content) — Google's current ID plus the :has() parent-selector to nuke the result-block cleanly. For AI Mode entry points, the rule combines a[href*="udm=50"] (the SERP tab) with button[jsname="B6rgad"] (the homepage pill).
3. DOM scanner fallback (content.js). A MutationObserver watches for new nodes. For AI Overview, it scans for headings whose text matches localized "AI Overview" patterns across 11 locales (English, Hungarian, German, French, Spanish, Italian, Dutch, Polish, Japanese, plus regional variants), then walks up the DOM passing through 0-height pass-through wrappers until it hits either an explicit data-attrid marker, a data-hveid result-block boundary, or a hard guard like id="search" / role="main" / a height ceiling of max(1500px, viewport * 0.65). For AI Mode buttons, it scans for buttons whose full text matches localized "AI Mode" labels, gated by a 250×60 pixel size cap so it can never accidentally hit organic content.
Every guard is set up to err on the side of leaving an AI surface visible rather than ever blanking out the user's results region. The walker stops at the first hard guard. The scanner skips anything bigger than a button. The CSS uses exact attribute matches, not substring matches, on result-block attributes.
google.com, google.hu, google.de, google.co.uk, google.fr, google.es, google.it, google.nl, google.pl, google.com.au, google.ca, google.co.jp.
Localized AI Overview heading patterns ship for English, Hungarian, German, French (incl. Canada variant), Spanish (and Latin American alt), Italian, Dutch, Polish, and Japanese. Localized AI Mode button labels ship for the same set.
deslop/
├── manifest.json # Chrome MV3 manifest (service_worker background)
├── manifest.firefox.json # Firefox MV3 manifest (scripts background, gecko id)
├── background.js # Background — toggles each ruleset by storage key
├── content.js # CSS + MutationObserver for AI hiding
├── rules-ai.json # Strips udm=50 (Skip AI Mode ruleset)
├── rules.json # Adds udm=14 (Just-the-links ruleset, opt-in)
├── popup.html/.css/.js # Four-toggle popup
├── welcome.html/.css # Shown once after install
├── icons/ # 16/32/48/128 px trash-can icons
├── scripts/build.py # Produces deslop-chrome-v*.zip + deslop-firefox-v*.zip
├── scripts/make_icons.py # Regenerate icons (Python + Pillow)
├── docs/screenshots/ # 1280×900 README captures
└── docs/cws/ # 1280×800 Chrome Web Store assets + promo tiles
| Key | Type | Default | Read by |
|---|---|---|---|
hideOverview |
bool | true |
content.js |
hideAIModeTab |
bool | true |
content.js (covers both the SERP tab and the homepage pill) |
skipAIMode |
bool | true |
background.js — toggles ai_redirect_ruleset |
powerMode |
bool | false |
background.js — toggles power_redirect_ruleset |
Synced across Chrome profiles via chrome.storage.sync.
Google rotates the DOM and URL conventions of AI Overview and AI Mode frequently. The current implementation uses three defensive strategies (attribute matchers, :has() containers, and a text-content MutationObserver) for AI Overview hiding, so it should survive most attribute changes. If Google ever decides that the bare URL ?q=foo returns AI Mode by default instead of returning the All tab, the Skip AI Mode pages toggle stops being useful — there's no udm=50 to strip when the URL has no udm at all. The fallback is Just the links (which forces udm=14), or a future DOM-level detection that recognizes the AI Mode page and force-navigates away.
No network requests. No analytics. No page-content reads (the MutationObserver only scans the local DOM for AI Overview / AI Mode signatures, never the content of organic results). The only persisted data is the four toggle states in chrome.storage.sync.
MIT — see LICENSE.




