Filter & Control Anything on YouTube or YouTube Kids
See the codeFilterTube is a browser extension that gives you control over your YouTube feed. Filter videos, shorts, channels, and comments using keywords and smart rulesβall processing happens privately on your device.
The public website now also acts as the download hub for browser releases, Android phone/tablet builds, and future store links:
The current v3.3.7 post-v3.3.5 source checkpoint is documented in the changelog history index, with the runtime, category, language, Nanah, app-sync, and website contracts kept in the existing documentation map. Native Android/iOS parity and installed-device behavior remain evidence-gated; the extension is still the runtime source of truth.
Identifier ... has already been declared failures./shorts/<videoId> identity resolver when channel rules or whitelist mode are active, so known blocked-channel Shorts hide without waiting for hover/menu interaction..shortsLockupViewModelHost and .ytGridShelfViewModelGridShelfItem now participate in the dedicated Shorts fallback/enrichment path.FilterTube now includes a device-to-device sync system powered by Nanah.
What it is:
Plain-language model:
That means:
Public relay page:
Simple Nanah flows:
SEND THIS PROFILE ONCE
[Device A] -> pair -> [Device B]
| |
+-- verify phrase ---+
|
+-- send once ------> [Device B reviews and applies]
FAMILY DEVICE UPDATES
[Parent / Caregiver] -> choose protected profile
|
+-- Send Update -----> pair, verify phrase, send while both devices are open
+-- Internet Pickup -> optional encrypted pickup service for a device that opens later or away
+-- Home Pickup -----> optional explicit home/school pickup service
Important protected-profile rules:
Send update, then choose exactly one available path: live, Home Pickup, or encrypted Internet PickupInternet Pickup can hold unreadable signed updates for away/opens-later devices, but it cannot edit profiles, PINs, trusted links, viewing access, or time limits by itselfHome Pickup is an explicitly configured same-network pickup service, not automatic Wi-Fi scanningSelf-hosted pickup provider:
FILTERTUBE_PROVIDER_HOST=0.0.0.0 \
FILTERTUBE_PROVIDER_STORE=.filtertube/managed-delivery-store.json \
npm run managed:provider
http://<this-computer-lan-ip>:8787/filtertube on the trusted home/school network/filtertube in a browser shows a safe FilterTube Pickup Provider status page; API callers can request the JSON status payload; rule contents, PINs, private keys, and profile policy are never shown therePer-profile time limits:
Docs:
@handle, UCID, or even c/CustomURLβFilterTube normalizes them all.prefers-color-scheme; explicit light/dark toggles remain sticky.console.log / console.debug output is muted outside explicit debug mode, keeping YouTube hot paths from paying logging overhead during normal browsing.FilterTube prefers intercepted YouTube JSON and ytInitial* payloads when they
expose stable channel identity, then carries that identity through learned maps,
DOM extraction, and bounded fallback resolvers when a route exposes only weak
surface data:
/youtubei/v1/next, /browse, and /player payloads when YouTube provides useful identity.channelMap, videoChannelMap, and videoMetaMap so later DOM/menu paths can join a visible video id back to a stronger source.Learn more in Proactive Channel Identity.
The easiest way to install FilterTube is via our official website: π Install FilterTube.in (browser builds and the public Android phone/tablet Google Play listing)
Prefer a direct store link? Pick your browser:
If you want to contribute or build from source:
Clone the repository
git clone https://github.com/varshneydevansh/FilterTube.git
cd FilterTube
npm install
Run in Developer Mode
npm run dev:chromenpm run dev:firefoxLoad Extension
chrome://extensions, enable Developer mode, click Load unpacked, and select the FilterTube folder.about:debugging, click This Firefox, then Load Temporary Add-on, and select manifest.json.npm run build:firefox.web-ext or remote debugging.https://www.youtube.com/@HandleName β Use @HandleNamehttps://www.youtube.com/channel/UCxxxxxxxx β Use UCxxxxxxxx or channel/UCxxxxxxxxFilterTube filters unwanted content as early as supported YouTube surfaces expose enough data, then uses DOM fallback for content that appears later or arrives with weaker identity.
Under the hood, FilterTube also maintains lightweight identity caches:
channelMap: @handle / c/<slug> / user/<slug> β UC...videoChannelMap: videoId β UC...On both YouTube Main and YouTube Kids, FilterTube can often learn the
canonical channel ID without extra page fetches by harvesting ownership data
from the same JSON payloads YouTube already loads (notably
ytInitialPlayerResponse and /youtubei/v1/player). Once learned, Shorts and
Watch surfaces can often resolve identity from the local map on later
encounters. Some route-specific surfaces still need DOM enrichment or a bounded
background resolver when the page exposes only a video id or weak display text.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β YouTube loads video data β
β β β
β FilterTube reads supported JSON when it has enough fields β
β β β
β Checks against your keywords & channels β
β β β
β ββββββββββββββββ ββββββββββββββββ β
β β Matches your β β HIDDEN β Doesn't matchβ β SHOWN β
β β filters β β your filters β β
β ββββββββββββββββ ββββββββββββββββ β
β β
β Result: Clean YouTube feed with only content you want β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Fast on proven data - JSON-backed cards can be filtered early, while later DOM insertions are handled by fallback scans
Local-first privacy - Extension rules and profiles stay in browser storage; there is no FilterTube account dashboard or extension analytics pipeline
Comprehensive - Filters videos, shorts, playlists, channels, comments, and more across all YouTube pages
Reliable by layers - Uses JSON-first data, learned maps, DOM fallback, and bounded resolvers for surfaces that do not expose enough identity immediately
We believe in privacy by design.
FilterTube uses a robust hybrid blocking mechanism for YouTube Shorts.
Current behavior: Shorts blocking is fastest when FilterTube already has a
stable videoId -> UC... mapping from intercepted YouTube JSON, player data,
or a learned map. Some Shorts surfaces still expose only /shorts/VIDEO_ID at
first, so that video id is treated as a join key until a stronger owner source
is available.
[User Clicks "Block"]
|
v
+-------------------------------+
| 1. Resolve UC ID (fast path) |
| - DOM /channel/UC... OR |
| - videoChannelMap cache OR |
| - Main-world JSON harvest |
+-------------------------------+
|
v
+-----------------------+
| 2. Block & Hide |
+-----------------------+
UC... channel ID whenever possible so blocking applies across Shorts + long-form + posts.[!NOTE] What if the channel ID isn't available yet? When the card does not expose a
UC...link and no learned mapping is available yet, FilterTube may use a bounded watch/Shorts resolver. That path is slower, route-specific, and still needs the same source-confidence and side-effect proof as the rest of the identity waterfall.
Found a bug or have a feature request? Open an issue on GitHub.
Want to support the project? You can donate on Ko-fi:
This project is licensed under the MIT License - see the LICENSE file for details.
See CHANGELOG.md for a detailed history of changes and improvements.
YouTube's recommendation algorithms can sometimes surface unwanted content. FilterTube gives you control over what appears in your feed, allowing for a more focused and pleasant viewing experience without distractions or unwanted content.
It all started with this thread on Google's support forum: When a parent said that he is helpless and his kid is just kept crying and screaming because of the content on YouTubeKids, and he asked me if I can create a tool to block videos by keyword or tag. And when Later YouTube Forum maintaner deleted mine and other parents comments and locked the thread, I decided to create FilterTube.
https://support.google.com/youtubekids/thread/54509605/how-to-block-videos-by-keyword-or-tag?hl=en
Perfect for:
# Install dependencies
npm install
# Develop for Chrome/Edge/Brave/Opera
npm run dev:chrome
# Develop for Firefox
npm run dev:firefox
# Build packages for distribution
npm run build # All browsers
npm run build:chrome # Chrome only
npm run build:firefox # Firefox only
For detailed technical documentation, see docs/ARCHITECTURE.md and docs/TECHNICAL.md.
FilterTube runs code in two JavaScript contexts on YouTube:
The following scripts are loaded as content scripts (see manifest*.json for the authoritative load order):
js/shared/identity.js β Shared channel identity helpers exposed as window.FilterTubeIdentity.js/content/menu.js β Menu styles + menu DOM helpers.js/content/dom_helpers.js β Small DOM helpers used by fallback logic.js/content/dom_extractors.js β DOM extraction helpers (video IDs, durations, card lookup).js/content/dom_fallback.js β DOM fallback filtering layer.js/content/block_channel.js β 3-dot menu observer/entry-point (detect dropdown + locate clicked card).js/content_bridge.js β Settings sync, bridge messaging, menu rendering/click handling, and blocking orchestration.js/seed.js β Hook/override entry points for ytInitialData, fetch, and XHR.js/injector.js β Coordinator + main-world search helpers (e.g., ytInitialData lookups).js/filter_logic.js β Filtering engine that removes blocked content from YouTubeβs JSON before render.JavaScript
95.1%
CSS
3.0%
HTML
1.9%
Filter & Control Anything on YouTube or YouTube Kids
See the codeFilterTube is a browser extension that gives you control over your YouTube feed. Filter videos, shorts, channels, and comments using keywords and smart rulesβall processing happens privately on your device.
The public website now also acts as the download hub for browser releases, Android phone/tablet builds, and future store links:
The current v3.3.7 post-v3.3.5 source checkpoint is documented in the changelog history index, with the runtime, category, language, Nanah, app-sync, and website contracts kept in the existing documentation map. Native Android/iOS parity and installed-device behavior remain evidence-gated; the extension is still the runtime source of truth.
Identifier ... has already been declared failures./shorts/<videoId> identity resolver when channel rules or whitelist mode are active, so known blocked-channel Shorts hide without waiting for hover/menu interaction..shortsLockupViewModelHost and .ytGridShelfViewModelGridShelfItem now participate in the dedicated Shorts fallback/enrichment path.FilterTube now includes a device-to-device sync system powered by Nanah.
What it is:
Plain-language model:
That means:
Public relay page:
Simple Nanah flows:
SEND THIS PROFILE ONCE
[Device A] -> pair -> [Device B]
| |
+-- verify phrase ---+
|
+-- send once ------> [Device B reviews and applies]
FAMILY DEVICE UPDATES
[Parent / Caregiver] -> choose protected profile
|
+-- Send Update -----> pair, verify phrase, send while both devices are open
+-- Internet Pickup -> optional encrypted pickup service for a device that opens later or away
+-- Home Pickup -----> optional explicit home/school pickup service
Important protected-profile rules:
Send update, then choose exactly one available path: live, Home Pickup, or encrypted Internet PickupInternet Pickup can hold unreadable signed updates for away/opens-later devices, but it cannot edit profiles, PINs, trusted links, viewing access, or time limits by itselfHome Pickup is an explicitly configured same-network pickup service, not automatic Wi-Fi scanningSelf-hosted pickup provider:
FILTERTUBE_PROVIDER_HOST=0.0.0.0 \
FILTERTUBE_PROVIDER_STORE=.filtertube/managed-delivery-store.json \
npm run managed:provider
http://<this-computer-lan-ip>:8787/filtertube on the trusted home/school network/filtertube in a browser shows a safe FilterTube Pickup Provider status page; API callers can request the JSON status payload; rule contents, PINs, private keys, and profile policy are never shown therePer-profile time limits:
Docs:
@handle, UCID, or even c/CustomURLβFilterTube normalizes them all.prefers-color-scheme; explicit light/dark toggles remain sticky.console.log / console.debug output is muted outside explicit debug mode, keeping YouTube hot paths from paying logging overhead during normal browsing.FilterTube prefers intercepted YouTube JSON and ytInitial* payloads when they
expose stable channel identity, then carries that identity through learned maps,
DOM extraction, and bounded fallback resolvers when a route exposes only weak
surface data:
/youtubei/v1/next, /browse, and /player payloads when YouTube provides useful identity.channelMap, videoChannelMap, and videoMetaMap so later DOM/menu paths can join a visible video id back to a stronger source.Learn more in Proactive Channel Identity.
The easiest way to install FilterTube is via our official website: π Install FilterTube.in (browser builds and the public Android phone/tablet Google Play listing)
Prefer a direct store link? Pick your browser:
If you want to contribute or build from source:
Clone the repository
git clone https://github.com/varshneydevansh/FilterTube.git
cd FilterTube
npm install
Run in Developer Mode
npm run dev:chromenpm run dev:firefoxLoad Extension
chrome://extensions, enable Developer mode, click Load unpacked, and select the FilterTube folder.about:debugging, click This Firefox, then Load Temporary Add-on, and select manifest.json.npm run build:firefox.web-ext or remote debugging.https://www.youtube.com/@HandleName β Use @HandleNamehttps://www.youtube.com/channel/UCxxxxxxxx β Use UCxxxxxxxx or channel/UCxxxxxxxxFilterTube filters unwanted content as early as supported YouTube surfaces expose enough data, then uses DOM fallback for content that appears later or arrives with weaker identity.
Under the hood, FilterTube also maintains lightweight identity caches:
channelMap: @handle / c/<slug> / user/<slug> β UC...videoChannelMap: videoId β UC...On both YouTube Main and YouTube Kids, FilterTube can often learn the
canonical channel ID without extra page fetches by harvesting ownership data
from the same JSON payloads YouTube already loads (notably
ytInitialPlayerResponse and /youtubei/v1/player). Once learned, Shorts and
Watch surfaces can often resolve identity from the local map on later
encounters. Some route-specific surfaces still need DOM enrichment or a bounded
background resolver when the page exposes only a video id or weak display text.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β YouTube loads video data β
β β β
β FilterTube reads supported JSON when it has enough fields β
β β β
β Checks against your keywords & channels β
β β β
β ββββββββββββββββ ββββββββββββββββ β
β β Matches your β β HIDDEN β Doesn't matchβ β SHOWN β
β β filters β β your filters β β
β ββββββββββββββββ ββββββββββββββββ β
β β
β Result: Clean YouTube feed with only content you want β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Fast on proven data - JSON-backed cards can be filtered early, while later DOM insertions are handled by fallback scans
Local-first privacy - Extension rules and profiles stay in browser storage; there is no FilterTube account dashboard or extension analytics pipeline
Comprehensive - Filters videos, shorts, playlists, channels, comments, and more across all YouTube pages
Reliable by layers - Uses JSON-first data, learned maps, DOM fallback, and bounded resolvers for surfaces that do not expose enough identity immediately
We believe in privacy by design.
FilterTube uses a robust hybrid blocking mechanism for YouTube Shorts.
Current behavior: Shorts blocking is fastest when FilterTube already has a
stable videoId -> UC... mapping from intercepted YouTube JSON, player data,
or a learned map. Some Shorts surfaces still expose only /shorts/VIDEO_ID at
first, so that video id is treated as a join key until a stronger owner source
is available.
[User Clicks "Block"]
|
v
+-------------------------------+
| 1. Resolve UC ID (fast path) |
| - DOM /channel/UC... OR |
| - videoChannelMap cache OR |
| - Main-world JSON harvest |
+-------------------------------+
|
v
+-----------------------+
| 2. Block & Hide |
+-----------------------+
UC... channel ID whenever possible so blocking applies across Shorts + long-form + posts.[!NOTE] What if the channel ID isn't available yet? When the card does not expose a
UC...link and no learned mapping is available yet, FilterTube may use a bounded watch/Shorts resolver. That path is slower, route-specific, and still needs the same source-confidence and side-effect proof as the rest of the identity waterfall.
Found a bug or have a feature request? Open an issue on GitHub.
Want to support the project? You can donate on Ko-fi:
This project is licensed under the MIT License - see the LICENSE file for details.
See CHANGELOG.md for a detailed history of changes and improvements.
YouTube's recommendation algorithms can sometimes surface unwanted content. FilterTube gives you control over what appears in your feed, allowing for a more focused and pleasant viewing experience without distractions or unwanted content.
It all started with this thread on Google's support forum: When a parent said that he is helpless and his kid is just kept crying and screaming because of the content on YouTubeKids, and he asked me if I can create a tool to block videos by keyword or tag. And when Later YouTube Forum maintaner deleted mine and other parents comments and locked the thread, I decided to create FilterTube.
https://support.google.com/youtubekids/thread/54509605/how-to-block-videos-by-keyword-or-tag?hl=en
Perfect for:
# Install dependencies
npm install
# Develop for Chrome/Edge/Brave/Opera
npm run dev:chrome
# Develop for Firefox
npm run dev:firefox
# Build packages for distribution
npm run build # All browsers
npm run build:chrome # Chrome only
npm run build:firefox # Firefox only
For detailed technical documentation, see docs/ARCHITECTURE.md and docs/TECHNICAL.md.
FilterTube runs code in two JavaScript contexts on YouTube:
The following scripts are loaded as content scripts (see manifest*.json for the authoritative load order):
js/shared/identity.js β Shared channel identity helpers exposed as window.FilterTubeIdentity.js/content/menu.js β Menu styles + menu DOM helpers.js/content/dom_helpers.js β Small DOM helpers used by fallback logic.js/content/dom_extractors.js β DOM extraction helpers (video IDs, durations, card lookup).js/content/dom_fallback.js β DOM fallback filtering layer.js/content/block_channel.js β 3-dot menu observer/entry-point (detect dropdown + locate clicked card).js/content_bridge.js β Settings sync, bridge messaging, menu rendering/click handling, and blocking orchestration.js/seed.js β Hook/override entry points for ytInitialData, fetch, and XHR.js/injector.js β Coordinator + main-world search helpers (e.g., ytInitialData lookups).js/filter_logic.js β Filtering engine that removes blocked content from YouTubeβs JSON before render.JavaScript
95.1%
CSS
3.0%
HTML
1.9%