PIONEERING

Docs/Extensions/Sodium

Sodium

What it does#

Three things, in order:

  1. Blocks ads and trackers at the network level. The request is refused before it is sent, using Chrome's own rule engine — so nothing is downloaded and nothing gets a chance to run.
  2. Clears what they leave behind. Blocking a banner leaves the hole it sat in. Sodium collapses the empty containers, the sticky bars and the overlays that have nothing left to show.
  3. Preloads links you are about to open. The page you are heading for starts loading while the pointer is still travelling.

Why there is no panel#

There is nothing to set. Sodium has a toolbar badge with a count and a tooltip, and that is deliberate — a blocker with a control panel is a blocker asking you to tune it, and every dial is a way to break a page without knowing you did.

The badge is the interface. It shows how many requests it refused on the page you are looking at. Zero on a page that should have ads usually means the page is serving them from its own domain, not that Sodium is off.

What it cannot do#

  • It cannot remove an ad the site serves from its own domain as part of the page. Nothing that blocks by request can.
  • It does not stop fingerprinting. That is Argon.
  • It does not change how a page behaves when you look away. That is Anti-Blur.

What it can see#

The rules run inside Chrome, and Sodium has no network access of its own. Nothing about your browsing leaves the machine.

On every site but one it never reads the page. The one is YouTube, where ads arrive inside the same data as the video itself, so no rule that blocks a request can tell them apart. There Sodium reads that data inside the page, removes the ad schedule before the player sees it, and keeps the rest.

On YouTube#

YouTube watches for blockers. So on YouTube Sodium is built to leave as little as possible for the page to notice — no extra globals, nothing written into the page, and it lets a YouTube page's own requests to Google's ad hosts complete instead of failing, because a request that fails is the oldest test there is. The ads are still gone; they are removed from the video data, not from the network.

3.5's version of that had a gap, and it was not subtle: the video would not play at all. Two things in it were exactly what an anti-blocker check looks for — a CSS rule hiding #player-ads, a bait element ID common enough that checking whether it is hidden is a standard test, and a global replacement of JSON.parse, which YouTube's own code calls more than any other built-in on the page, often enough that swapping it out is measurable even when its toString() is made to look native. 3.6 removes both: that CSS rule is gone, and ad data arriving through fetch().then(r => r.json()) is still cleaned the same way it always was, but data parsed through a raw JSON.parse call is not — a narrower net, not a removed one, and the one that stopped the false positive.

Last updated 30 Oct 2026