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.
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.
Clone and build
Node 22 or newer.
git clone https://github.com/achintha-ekanayake/AdPrune.git
cd AdPrune
npm install
npm run build:chrome
Chrome or Edge
Open chrome://extensions, enable Developer mode, choose
Load unpacked, and select:
.output/chrome-mv3
Firefox
Open about:debugging, choose Load Temporary Add-on, and
pick the manifest inside:
.output/firefox-mv3
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.
| 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 |
Two permissions, three sites, a 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
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.