Open source - Chrome, Edge & Firefox

The ad break never gets scheduled.

AdPrune deletes ad metadata from YouTube's player response before the player reads it. Nothing to skip, nothing to wait out.

The AdPrune popup: status Active, 1,284 ads blocked, split into 312 video ads and 972 page ads, with toggles for blocking video ads, hiding page ads and dismissing anti-adblock popups.

Install

Build it yourself in three commands.

Not on the Chrome Web Store or addons.mozilla.org yet, so you load it unpacked - and the code you run is code you watched compile.

1

Clone and build

Node 22 or newer.

git clone https://github.com/achintha-ekanayake/AdPrune.git
cd AdPrune
npm install
npm run build:chrome
2

Chrome or Edge

Open chrome://extensions, enable Developer mode, choose Load unpacked, and select:

.output/chrome-mv3
3

Firefox

Open about:debugging, choose Load Temporary Add-on, and pick the manifest inside:

.output/firefox-mv3
With and without

What changes when AdPrune is running.

Same video, same player. AdPrune strips the ad fields out of YouTube's player response before the timeline is built, so there is no break left to skip.

YouTube playback with and without AdPrune, compared
Without AdPrune With AdPrune
Pre-roll ads Play before the video, skippable after five seconds Never scheduled
Mid-roll ads Interrupt playback part-way through Never scheduled
Post-roll ads Play once the video ends Never scheduled
When ads are handled After the player has built its timeline Before the player reads its config
What you see A countdown, a skip button, a visible stutter The first frame of the video
Page ad units Banners, promoted shelves and in-feed ad cards Hidden
Anti-adblock dialog Blocks playback until you dismiss it Dismissed for you
Server-stitched ads Play, with nothing to indicate why Still play, but reported in the popup
Permissions

Two permissions, three sites, a reason for each.

Permissions requested by AdPrune and the reason for each
Requested What it is for
storage Saves your toggles and blocked-ad counters. Local storage only, not sync, not a server.
declarativeNetRequest Lets the browser apply a pre-declared ad-network blocklist. The rules ship inside the extension and the browser enforces them. AdPrune never sees the requests they match.
youtube.com Where the pruning happens. Content scripts run only on YouTube, only at document start.
youtube-nocookie.com The same treatment for embedded players. Embeds carry pre-rolls too.
googlevideo.com Detecting server-stitched ads in media manifests. This powers the honest "we cannot remove this one" notice.
  • No access to any site but YouTube
  • No browsing history
  • No cookies or account access
  • No tabs or bookmarks
  • No third-party scripts
  • No analytics, ever
Straight answers

What AdPrune cannot do.

Server-stitched ads cannot be removed by anyone

When an ad is spliced into the media stream itself, it is video frames in the same bytes as your content. AdPrune detects this and says so, rather than looking broken.

Chrome is structurally weaker than Firefox

MV3 removed blocking webRequest from Chrome, so network rules there are static only. The JSON layer carries the load on both.

This is an arms race

YouTube rotates detection scripts, so the registries need periodic edits. Breakage is contained to two small files anyone can patch.

It does violate YouTube's Terms of Service

Client-side filtering is legal and long-established, but YouTube may degrade playback or act against accounts it detects. Install it knowing that.