A lightweight Manifest V3 Chrome extension that bundles small quality-of-life fixes for Google Search and everyday browsing. Every feature is an individual checkbox in one popup, with a master on/off at the top. No accounts, no servers, no telemetry — everything runs locally.
See PRD.md for the full spec and TASKS.md for the build plan.
dist/ — the Chrome Web Store build (this is what’s in
sidekick-v0.1.0.zip). It omits two features that conflict with Google’s Terms
of Service: Endless scroll (automated fetching of results pages) and the
Lens thumbnail-upload path of Reverse image search (undocumented endpoint).dist-full/ — the full local build with those two power-user features
included. Load this unpacked if you want them; it is not intended for the
store.Feature entries below marked (full build only) exist only in dist-full/.
The toggle in the popup header is the global on/off. When it is off, every feature below is inert no matter how its own checkbox is set — nothing is injected, redirected, hidden, or blocked. Turn it back on and your individual checkbox choices are restored exactly as you left them.
Settings are saved instantly and apply on the next page load (reload the tab to see a change take effect).
The list below is in the same order as the popup. Each entry says what it does, where it applies, its default, and any caveats. In the popup, hover any row to see a one-line summary as a tooltip.
Where: Google Search results pages.
Re-adds a Maps tab to the row of result tabs (AI Mode · All · Maps ·
Videos · …), positioned right after All. Clicking it opens
google.com/maps/search/<your query> in the same tab, so you jump straight from
a search to Maps for that query.
Why it exists: under the EU Digital Markets Act (DMA), Google removed the integrated Maps shortcut from Search in Europe.
Limitation: this restores the link / entry point only. It cannot rebuild Google’s server-rendered local “map pack” (the embedded map with business pins and listings) — that content is generated on Google’s servers and is never sent to the page, so an extension has nothing to work with.
Where: Google Images results (udm=2, and the legacy tbm=isch).
Adds an Image size dropdown to the right of the tabs/Tools row with the size
filters Google buried: Any size, Larger than 2 / 4 / 6 / 8 / 10 / 12 / 15
/ 20 / 40 / 70 MP, plus Large / Medium / Icon.
Picking an option rewrites Google’s tbs URL parameter (e.g.
tbs=isz:lt,islt:10mp) and reloads, keeping the rest of your search intact. The
dropdown pre-selects whatever size filter is already active.
Where: every site. Stops “popunder” ad tabs that shady sites open the first time you click anywhere on the page. It works two ways:
window.open so it only succeeds within ~1 second of a
genuine mouse click on a real link — programmatic/background opens return
nothing.target="_blank" overlay links
(the classic popunder trap).What keeps working: your own deliberate new tabs — Ctrl-click, middle-click,
and normal links that legitimately open in a new tab — because those are handled
by the browser, not by window.open.
Caveat: this is heuristic. On rare sites it may block a popup you actually wanted; turn the checkbox off for those.
Where: Google Images results. Adds a small View button on thumbnail hover that links directly to the full-resolution source image (new tab) — the “View image” shortcut Google removed in 2018.
Layout caveat: this only works on the legacy Images layout, where the
result link (/imgres?…) still carries the original image URL. On Google’s
current udm=2 layout, tiles link to the source page and the original image
URL is not present anywhere in the page (thumbnails are inline base64), so a
View button cannot be added there. See Reverse image search for what works
on the new layout.
Where: Google Search results pages. Makes result links point straight at the destination:
/url?q=… redirect links so you (and your history) get the
real URL, not a Google tracking hop.utm_*, fbclid, gclid, mc_eid, igshid,
yclid, msclkid, and similar) from the result URLs.This only rewrites links on the Google results page; it does not touch the pages you land on (see Strip UTM everywhere for that).
Where: Google Search results pages. Cosmetically removes the AI-generated answer block at the top of results by hiding the whole block it lives in (so no empty gap is left behind).
Important: this only hides the AI Overview — Google still generates and sends it. If you want it to never be generated at all, use Web results only (udm=14) instead. The selectors are best-effort and may need updates when Google changes its markup; if a label match fails the block simply stays visible (the page is never broken).
Where: Google Search, the default “All” tab.
Redirects your search into Google’s plain Web results vertical by adding
udm=14 to the URL. That view contains no AI Overview at all, so it is
never generated or streamed (and there is no gap to hide). Only the default tab
is affected — Images, Videos, News, and AI Mode (which carry their own udm/
tbm parameter) are left alone.
Trade-off: the Web vertical is only classic blue-link results. You lose the rich extras — knowledge panels, the image pack, featured snippets, etc. Use this if you want the leanest, AI-free Google; otherwise use Hide AI Overview. (Recommendation: enable this or Hide AI Overview, not both.)
Where: Google Search results pages.
Hides Google’s ad blocks (top, bottom, and inline “Sponsored” results) via their
container IDs (#tads, #tadsb, #bottomads) and the data-text-ad marker.
This is a light-touch cleanup of Search ads, not a full ad blocker — for
comprehensive blocking across the web, use a dedicated tool like uBlock Origin.
Where: any Google country domain.
Redirects regional Google domains (e.g. google.de, google.fr,
google.co.uk) to www.google.com, preserving your query. Useful for dodging
region-specific removals/behavior. It runs once per page (guarded against
redirect loops via sessionStorage).
Note: Google may still re-localize based on your IP/account; this changes the domain, it cannot override server-side geolocation.
Where: Google’s cookie consent interstitial (incl. consent.google.com).
Automatically clicks through Google’s “before you continue” cookie wall. It
prefers a Reject all button when present, otherwise the Accept all /
continue button (matching common English, German, French, and Dutch labels). It
tries once, then watches briefly for the dialog to appear, then stops.
Where: Google Search web results. Auto-loads the next page of results and appends it as you scroll near the bottom, so you don’t have to click “Next”. It does this by fetching the page behind Google’s own Next link and appending the new results.
Not in the store build: programmatically fetching Google results pages
conflicts with Google’s Terms of Service (automated access), so this feature
ships only in dist-full/.
Where: every site.
Removes tracking parameters (utm_*, fbclid, gclid, dclid, gbraid,
wbraid, mc_eid, igshid, yclid, msclkid, and similar) from the address
bar of any page you visit, cleaning the URL in place via history.replace
without reloading. This is the site-wide counterpart to Clean links (which
only cleans links shown on Google’s results page).
Where: Google Images results. Adds a Lens button on thumbnail hover that opens a Google Lens reverse-image search.
dist/): works on legacy tiles, where the result link
(/imgres?…) carries the original image URL — the button just opens
lens.google.com with that URL (an ordinary link, no special access). On the
current udm=2 layout, where the original URL isn’t exposed, no button is
added.dist-full/): additionally handles udm=2 tiles by uploading
the thumbnail to Google Lens via a background service worker. That path
uses an undocumented endpoint and conflicts with Google’s ToS, so it is kept
out of the store build.chrome://extensions.dist (store build) — or dist-full
if you want the two extra power-user features
(G:\Code\Chrome Extensions\Sidekick\dist).The store build is in
dist/(packaged assidekick-v0.1.0.zip); the full local build is indist-full/. The repo root holds docs and the zip.
Changes apply on the next page load.
storage — to remember your toggle states (chrome.storage.sync).<all_urls> content scripts — required by the popup blocker (must run at
document_start on every page to override window.open before page scripts)
and by the optional site-wide UTM stripper. No page data is read or
transmitted; these scripts only modify behavior locally.lens.google.com host access + a background service worker
— used by Reverse image search to upload a thumbnail to Google Lens. Not
present in the store build.Sidekick has no analytics and stores nothing beyond your feature toggles in Chrome’s settings sync.
dist/): makes no external network requests at all.dist-full/): the two optional, off-by-default extras contact
Google only when used — Endless scroll fetches the next results page, and
Reverse image search uploads a clicked thumbnail to lens.google.com.No browsing data is collected, profiled, or sent anywhere else.