├── .gitattributes ├── .github └── workflows │ └── update-docs.yaml ├── LICENSE ├── README.md ├── docs ├── README.md ├── filters │ ├── hyper.md │ ├── misc.md │ ├── nolive.md │ ├── nomusic.md │ ├── noshorts.md │ ├── notrack.md │ ├── noview.md │ ├── premium.md │ ├── requests.md │ ├── sponsorblock.md │ └── ytkids.md ├── gendocs.js ├── nofont.md └── yt-neuter.md ├── filters ├── hyper.txt ├── misc.txt ├── nolive.txt ├── nomusic.txt ├── noshorts.txt ├── notrack.txt ├── noview.txt ├── premium.txt ├── requests.txt ├── sponsorblock.txt └── ytkids.txt ├── icons ├── ytn-favicon.png ├── ytn-favicon.psd ├── ytn.png └── ytn.psd ├── require ├── flag-pull.js ├── nofont.otf ├── nofont.woff ├── nofont.woff2 └── wfke.js ├── scriptlets.js ├── style ├── old-red-quality.json └── persist-controls.json ├── userscripts ├── broken │ └── reflow.user.js ├── flag-remover.user.js ├── mute-subscribe.user.js ├── no-emoji.user.js ├── no-link-path.user.js ├── no-trailer.user.js ├── old-red-quality.user.js └── yt-no-autoplay.user.js └── yt-neuter.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | *.txt linguist-language=AdBlock linguist-detectable -------------------------------------------------------------------------------- /.github/workflows/update-docs.yaml: -------------------------------------------------------------------------------- 1 | name: Update docs 2 | on: 3 | workflow_dispatch: 4 | push: 5 | paths: 6 | - filters/** 7 | - yt-neuter.txt 8 | 9 | jobs: 10 | update-docs: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | - run: mkdir -p docs/filters && node docs/gendocs.js 15 | - uses: stefanzweifel/git-auto-commit-action@v5 16 | with: 17 | commit_message: Automated docs update 18 | commit_author: github-actions[bot] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Aggressive YouTube uBlock filter list 2 | 3 | Originally on a [gist](https://gist.github.com/mchangrh/a51e72bb36a492bfda37a6a9fa537f22) but ported over to better track new elements to block 4 | 5 | if you like this, you'll probably also like [blocktube](https://github.com/amitbl/blocktube) (no affiliation) 6 | 7 | ----- 8 | 9 | ## Install 10 | 11 | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter&title=YouTube%20Neuter) 12 | 13 | Filter URLs 14 | GitHub: `https://raw.githubusercontent.com/mchangrh/yt-neuter/main/yt-neuter.txt` 15 | Serverless Redirect: `https://neuter.mchang.xyz/filter` 16 | 17 | ### SponsorBlock sub-list 18 | Less aggressive in elements to block 19 | - product shopping/ merch (Creator) 20 | - paid comments (Creator) 21 | - membership (Creator) 22 | - tickets (YT + Creator) 23 | - generic popup (YT) 24 | - brand features (YT) 25 | 26 | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter/sponsorblock&title=yt-neuter%20sponsorblock) 27 | 28 | Filter URLs 29 | GitHub: `https://raw.githubusercontent.com/mchangrh/yt-neuter/main/filters/sponsorblock.txt` 30 | Serverless Redirect: `https://neuter.mchang.xyz/filter/sponsorblock` 31 | 32 | ### noview 33 | Hide force-pushed low-view videos 34 | 35 | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter/noview&title=YouTube%20Neuter%20noview) 36 | 37 | Filter URLs 38 | GitHub: `https://raw.githubusercontent.com/mchangrh/yt-neuter/main/filters/noview.txt` 39 | Serverless Redirect: `https://neuter.mchang.xyz/filter/noview` 40 | 41 | ## Userscripts 42 | - Disable recommended and playlist AutoPlay [Install](https://neuter.mchang.xyz/script/yt-no-autoplay) 43 | - Change "Subscribe" background to blend in with the rest of the theme [Install](https://neuter.mchang.xyz/script/mute-subscribe) 44 | - Make YT Quality icons red again [Install](https://neuter.mchang.xyz/script/old-red-quality) 45 | - Remove everything from description links but hostname [Install](https://neuter.mchang.xyz/script/no-link-path) 46 | - Remove Emojis in Titles [Install](https://neuter.mchang.xyz/script/no-emoji) 47 | - Remove channel trailers [Install](https://neuter.mchang.xyz/script/no-trailer) 48 | - Remove Experiment Flags [Install](https://neuter.mchang.xyz/script/flag-remover) 49 | - Persist YT Controls [Install](https://uscript.mchang.xyz/yt/yt-persist-ctrl.user.js) 50 | - Replaces YouTube rounded views and relative date with absolute values [Install](https://uscript.mchang.xyz/yt/yt-absview-date) 51 | - ~~Force YouTube grid to fit more elements per row [Install](https://neuter.mchang.xyz/script/reflow)~~ 52 | - broken due to YouTube changes with static values 53 | - Replacment script: [Roki100/YouTube-rows-fix](https://github.com/Roki100/YouTube-rows-fix) 54 | 55 | More scripts at [mchangrh/uscripts](https://github.com/mchangrh/uscripts/tree/main/yt) 56 | 57 | ## Filters 58 | More specific or generic filters [docs](./docs) 59 | 60 | ## Scriptlets 61 | Addon scriptlets for uBlock Origin to block/replace elements [Instructions](https://github.com/gorhill/uBlock/wiki/Advanced-settings#userresourceslocation) 62 | `https://raw.githubusercontent.com/mchangrh/yt-neuter/main/scriptlets.js` -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | ## yt-neuter 2 | The main filter list 3 | [docs](./yt-neuter.md) | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter&title=YouTube%20Neuter) 4 | 5 | ## nolive 6 | Hide all Live/ Upcoming/ Premiere/ Streamed videos 7 | [docs](./filters/nolive.md) | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter/nolive&title=YouTube%20Neuter%20-%20nolive) 8 | 9 | ## nomusic 10 | Hide all videos by verified artists and Music recommendations 11 | [docs](./filters/nomusic.md) | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter/nomusic&title=YouTube%20Neuter%20-%20nomusic) 12 | 13 | ## noshorts 14 | Block YouTube Shorts 15 | This works best alongside [BlockTube](https://github.com/amitbl/blocktube)'s shorts blocking feature, adds some filters on channel pages 16 | [docs](./filters/noshorts.md) | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter/noshorts&title=YouTube%20Neuter%20-%20noshorts) 17 | 18 | ## notrack 19 | Block video tracking endpoints 20 | !! Will break history and recommendations !! 21 | [docs](./filters/notrack.md) | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter/notrack&title=YouTube%20Neuter%20-%20notrack) 22 | 23 | ## premium 24 | Exclusion List for YT Premium Members 25 | Un-hides some premium features 26 | [docs](./filters/premium.md) | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter/premium&title=YouTube%20Neuter%20-%20premium) 27 | 28 | ## misc 29 | Extremely aggressive misc filters 30 | [docs](./filters/misc.md) | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter/misc&title=YouTube%20Neuter%20-%20misc) 31 | 32 | ## sponsorblock 33 | Conservative subset of yt-neuter for SponsorBlock (PRs require additional scrutiny) 34 | [docs](./filters/sponsorblock.md) | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter/sponsorblock&title=YouTube%20Neuter%20-%20SponsorBlock) 35 | 36 | ## noview 37 | Hide forced low-view videos from browse feeds 38 | [docs](./filters/noview.md) | [add to uBo](https://subscribe.adblockplus.org/?location=https://neuter.mchang.xyz/filter/noview&title=YouTube%20Neuter%20-%20noview) 39 | 40 | ## requests 41 | niche transformative filters requested 42 | 43 | ## excluding filter 44 | to add an exclusion for a costmetic filter, copy the offending filter to "Your Filters" and replace the `##` after youtube.com with `#@#` 45 | 46 | to add an exclusion for a URL filter, replace `||` with `@@` 47 | 48 | example: 49 | ```diff 50 | ! block subscribe button 51 | - youtube.com###subscribe-button 52 | + youtube.com#@##subscribe-button 53 | 54 | ! block endscreen 55 | - ||www.youtube.com/s/player/*/player_ias.vflset/*/endscreen.js^$script 56 | + @@www.youtube.com/s/player/*/player_ias.vflset/*/endscreen.js^$script 57 | ``` -------------------------------------------------------------------------------- /docs/filters/hyper.md: -------------------------------------------------------------------------------- 1 | ## This is a hyper-aggressive block list, use very sparingly. This is more aggressive than the misc list 2 | ## This list is not for ANYONE. It will break a lot of things, sometimes intentionally. 3 | ## network requests 4 | * images 5 | * remove banner, channel emojis, uploader profile in comments (https://github.com/iv-org/invidious/issues/3796) 6 | * remove user profile images 7 | * lottie 8 | * remove lottie renderer 9 | * remove lottie animations 10 | ## /video 11 | ### comments 12 | * remove comment author images 13 | * paid comments 14 | * remove all paid comments 15 | * channel member comments 16 | * remove all member comments -------------------------------------------------------------------------------- /docs/filters/misc.md: -------------------------------------------------------------------------------- 1 | # Install 2 | 3 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Ffilter%2Fmisc&title=yt-neuter%20misc) | [View List](https://neuter.mchang.xyz/filter/misc) 4 | 5 | ## network requests 6 | * remove offline service worker 7 | * disable installable progressive web app functionality 8 | * chromecast 9 | * block chromecast cast_sender module 10 | * remove chromecast cast_sender backups 11 | * remove mobile chromecast remote 12 | * alternative players 13 | * remove miniplayer restrictions - makes miniplayer fully featured 14 | * remove inline player restrictions - makes inline player fully featured 15 | ## generics 16 | * remove verified badges 17 | * learning playlists ([#25](https://github.com/mchangrh/yt-neuter/issues/25)) 18 | * shelves 19 | * block all shelves 20 | * block rich grid sections containing shelves 21 | ## video browsing 22 | * video previews 23 | * visually hide video previews 24 | * remove inline video previews 25 | * remove hover tooltips 26 | * make thumbnails square again 27 | * badges 28 | * closed captioning badge 29 | * "New" badge (subscriptions feed) 30 | ## /video 31 | ### in-player 32 | * paused/ stopped overlay 33 | * remove annotations module 34 | * make all video info visible 35 | ### controls 36 | * settings 37 | * make quality selector superscript red again 38 | ### comments 39 | * channel member comments 40 | * channel member emoji 41 | * remove emoji 42 | * comment creation 43 | * remove emoji shortcuts for comments 44 | ### under-player 45 | * title 46 | * remove highlights for tagged channels 47 | * owner/ channel 48 | * subscribe 49 | * unhide unsubscribe button 50 | * subscribe animation (smartimation) 51 | * makes subscribe button blend in with other buttons (scriptlet) 52 | ### description box 53 | * creator description 54 | * remove mention highlights 55 | * remove hashtags in description 56 | * blocks external links in description 57 | * remove store links in description 58 | * remove description video link highlights 59 | * remove external link highlights (comments, descriptions) 60 | * youtube injected 61 | * live chat replay prompt [#72](https://github.com/mchangrh/yt-neuter/issues/72) 62 | * under-description shelves 63 | * licenced doctor box 64 | * remove chapter infocard previews 65 | * remove infocards section 66 | * people box 67 | ### recommendations sidebar 68 | * video-specific sidebar 69 | * remove all offers 70 | ## /channel page 71 | * channel header / homepage 72 | * hide large avatar 73 | * remove tagline 74 | * shelves 75 | * remove featured video 76 | ## /results - search 77 | * key moments/chapters -------------------------------------------------------------------------------- /docs/filters/nolive.md: -------------------------------------------------------------------------------- 1 | # Install 2 | 3 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Ffilter%2Fnolive&title=yt-neuter%20nolive) | [View List](https://neuter.mchang.xyz/filter/nolive) 4 | 5 | ## global elements 6 | ### sidebar navigation 7 | * live tab 8 | * channels 9 | * channel is live indicator 10 | ## homepage 11 | * video 12 | * channel live badge 13 | ## /channel page 14 | * tabs 15 | * live tab 16 | ## video browsing 17 | * remove live videos 18 | * remove streamed videos 19 | * remove upcoming videos 20 | * header 21 | * live chips 22 | ## /video 23 | * live chat replay prompt 24 | * paused/ stopped overlay 25 | * video endscreen -------------------------------------------------------------------------------- /docs/filters/nomusic.md: -------------------------------------------------------------------------------- 1 | # Install 2 | 3 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Ffilter%2Fnomusic&title=yt-neuter%20nomusic) | [View List](https://neuter.mchang.xyz/filter/nomusic) 4 | 5 | ## global elements 6 | ### sidebar navigation 7 | ## video browsing 8 | * header 9 | * recommendations chip 10 | * badgess 11 | * videos by verified artists -------------------------------------------------------------------------------- /docs/filters/noshorts.md: -------------------------------------------------------------------------------- 1 | # Install 2 | 3 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Ffilter%2Fnoshorts&title=yt-neuter%20noshorts) | [View List](https://neuter.mchang.xyz/filter/noshorts) 4 | 5 | ## generics 6 | * shelves 7 | * generic shorts shelf (channel, search) 8 | ## global elements 9 | ### sidebar navigation 10 | * sidebar 11 | * homepage tab (mobile) 12 | ## /homepage 13 | ### shelves 14 | * homepage shelf ([#15](https://github.com/mchangrh/yt-neuter/issues/15)) 15 | ## /channel page 16 | * tabs 17 | * shorts tab 18 | ## video browsing 19 | * videos that resolve to /shorts/ 20 | * videos with shorts icons 21 | * video title with #shorts 22 | ## /video 23 | * paused/ stopped overlay 24 | * video endscreen -------------------------------------------------------------------------------- /docs/filters/notrack.md: -------------------------------------------------------------------------------- 1 | # Install 2 | 3 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Ffilter%2Fnotrack&title=yt-neuter%20notrack) | [View List](https://neuter.mchang.xyz/filter/notrack) 4 | 5 | ## network requests 6 | * quality of experience 7 | * stats 8 | * periodic stat pings 9 | * ? generic stats ping -------------------------------------------------------------------------------- /docs/filters/noview.md: -------------------------------------------------------------------------------- 1 | # Install 2 | 3 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Ffilter%2Fnoview&title=yt-neuter%20noview) | [View List](https://neuter.mchang.xyz/filter/noview) 4 | 5 | ## video browsing 6 | * remove forced low view count videos [#62](https://github.com/mchangrh/yt-neuter/issues/62) -------------------------------------------------------------------------------- /docs/filters/premium.md: -------------------------------------------------------------------------------- 1 | # Install 2 | 3 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Ffilter%2Fpremium&title=yt-neuter%20premium) | [View List](https://neuter.mchang.xyz/filter/premium) 4 | 5 | ## video browsing 6 | * 3-dot dropdown ([#38](https://github.com/mchangrh/yt-neuter/issues/38)) 7 | * download button 8 | ## /video 9 | ### controls 10 | * settings 11 | * enhanced bitrate selector 12 | ### under-player 13 | * action row 14 | * download button 15 | * download worker -------------------------------------------------------------------------------- /docs/filters/requests.md: -------------------------------------------------------------------------------- 1 | # Install 2 | 3 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Ffilter%2Frequests&title=yt-neuter%20requests) | [View List](https://neuter.mchang.xyz/filter/requests) 4 | 5 | ## /video 6 | ### in-player 7 | * no captions 8 | ### under-player 9 | * action row 10 | * remove background for youtube buttons, excludes subscribe button 11 | * remove button text labels 12 | * center buttons without text -------------------------------------------------------------------------------- /docs/filters/sponsorblock.md: -------------------------------------------------------------------------------- 1 | ### Subset of yt-neuter for sponsorblock 2 | * product shopping/ merch (Creator) 3 | * paid comments (Creator) 4 | * membership (Creator) 5 | * tickets (YT + Creator) 6 | * generic popup (YT) 7 | * brand features (YT) 8 | # Install 9 | 10 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Ffilter%2Fsponsorblock&title=yt-neuter%20sponsorblock) | [View List](https://neuter.mchang.xyz/filter/sponsorblock) 11 | 12 | ## global elements 13 | ### popups 14 | * generic surveys ([#24](https://github.com/mchangrh/yt-neuter/issues/24)) 15 | * generic surveys 16 | * survey answer card/ thanks 17 | * checkbox survey? 18 | * feedback survey? 19 | * follow up survey? 20 | * multistage survey? 21 | * ratings survey? 22 | * RED exit survey 23 | * "how are your recommendations" survey 24 | * targeted/ specific popups 25 | * "feedback shared" / "experiencing interruptions" toasts 26 | * "change your subtitle settings" popup 27 | * popup z-index fix 28 | * payment nags 29 | * premium enhanced bitrate nag ([#49](https://github.com/mchangrh/yt-neuter/issues/49)) 30 | * become a member of this channel 31 | ## homepage 32 | * youtube 33 | * brand featured banner/ shelf ([#40](https://github.com/mchangrh/yt-neuter/issues/40)) 34 | ## video browsing 35 | * members-only videos 36 | ## /video 37 | ### controls 38 | * progress bar 39 | * pink gradient [#72](https://github.com/mchangrh/yt-neuter/issues/72) 40 | ### under-player 41 | * chips/ badges 42 | * buy product badge 43 | * title 44 | * product count 45 | * owner/ channel 46 | * member/ join button 47 | * free trial/ tv subscription 48 | ### description box 49 | * under-description shelves 50 | * merch shelf 51 | * ticket shelf 52 | * products in current video 53 | ### comments 54 | * paid (thanks) comment highlight 55 | ### recommendations sidebar 56 | * watch on youtube 57 | * nudges (recommendation/ turn on watch history) 58 | * video-specific sidebar 59 | * ads 60 | * shop products in this video 61 | ## /channel page 62 | * tabs 63 | * channel store tab 64 | * shelves 65 | * recognized channel member 66 | * members only videos - disabled ([#85](https://github.com/mchangrh/yt-neuter/issues/85)) -------------------------------------------------------------------------------- /docs/filters/ytkids.md: -------------------------------------------------------------------------------- 1 | ### yt-neuter for yt kids 2 | # Install 3 | 4 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Ffilter%2Fytkids&title=yt-neuter%20ytkids) | [View List](https://neuter.mchang.xyz/filter/ytkids) 5 | 6 | ## /video 7 | ### metadata 8 | * owner/ channel 9 | * subscribe button 10 | ### description box 11 | * loading overlay -------------------------------------------------------------------------------- /docs/gendocs.js: -------------------------------------------------------------------------------- 1 | const { readFileSync, writeFileSync } = require('fs') 2 | 3 | const getName = (filter) => 4 | filter == 'yt-neuter' 5 | ? filter 6 | : `yt-neuter ${filter.replace('filter/', '')}` 7 | 8 | function generateInstallLink(filter) { 9 | filter = filter.replace('filters/', 'filter/') 10 | const listURL = `https://neuter.mchang.xyz/${filter}` 11 | const installURL = `https://subscribe.adblockplus.org/?location=${encodeURIComponent(listURL)}&title=${encodeURIComponent(getName(filter))}` 12 | return `# Install\n\n[Subscribe](${installURL}) | [View List](${listURL})\n` 13 | } 14 | 15 | function syncReadFile(filter) { 16 | const filename = `./${filter}.txt` 17 | const contents = readFileSync(filename, 'utf-8') 18 | const arr = contents.split(/\r?\n/) 19 | // remove header 20 | arr.shift() 21 | while (arr[0].startsWith('!') && arr[0] !== '') arr.shift() 22 | const commentLines = arr.filter(line => line.startsWith('!')) 23 | // format comments into markdown 24 | const comments = commentLines.map(line => line 25 | .replace(/\#(\d+)/, '[#$1](https://github.com/mchangrh/yt-neuter/issues/$1)') 26 | .replace(/\! install link/, generateInstallLink(filter)) 27 | .replace(/\!\!\!\!/, '##') 28 | .replace(/\!\!\!/, '###') 29 | .replace(/\!\!/, '*') 30 | .replace(/\!/, ' *') 31 | ) 32 | return comments.join('\n') 33 | } 34 | 35 | const filters = [ 36 | "yt-neuter", 37 | "filters/hyper", 38 | "filters/misc", 39 | "filters/nolive", 40 | "filters/nomusic", 41 | "filters/noshorts", 42 | "filters/notrack", 43 | "filters/noview", 44 | "filters/premium", 45 | "filters/requests", 46 | "filters/sponsorblock", 47 | "filters/ytkids" 48 | ] 49 | 50 | for (const filter of filters) { 51 | const result = syncReadFile(filter) 52 | writeFileSync(`./docs/${filter}.md`, result) 53 | } 54 | -------------------------------------------------------------------------------- /docs/nofont.md: -------------------------------------------------------------------------------- 1 | # NoEmoji userscript 2 | 3 | The NoEmoji userscript installs a `nofont` font - generated from a fork of Adobe NotDef ([mchangrh/nofont](https://github.com/mchangrh/nofont)) 4 | 5 | All characters in the [SMP plane](https://en.wikipedia.org/wiki/Plane_(Unicode)) (10000-1FFFF range) are replaced with this undefined/blank font. This also includes some other language symbols. 6 | 7 | The otf, woff and woff2 fonts are also generated in [require](../require) -------------------------------------------------------------------------------- /docs/yt-neuter.md: -------------------------------------------------------------------------------- 1 | # Install 2 | 3 | [Subscribe](https://subscribe.adblockplus.org/?location=https%3A%2F%2Fneuter.mchang.xyz%2Fyt-neuter&title=yt-neuter) | [View List](https://neuter.mchang.xyz/yt-neuter) 4 | 5 | ## generics 6 | * shelves 7 | * game shelf 8 | * playbables shelf 9 | ## global elements 10 | ### header 11 | * icon 12 | * country code 13 | * yoodle ([#20](https://github.com/mchangrh/yt-neuter/issues/20)) 14 | * block image/animations from being fetched (falls back to normal logo) 15 | * block child elements of yoodle 16 | * search 17 | * voice search button 18 | * voice search response noises 19 | * action buttons 20 | * create button 21 | ### popups 22 | * generic surveys ([#24](https://github.com/mchangrh/yt-neuter/issues/24)) 23 | * generic surveys 24 | * survey answer card/ thanks 25 | * checkbox survey? 26 | * feedback survey? 27 | * follow up survey? 28 | * multistage survey? 29 | * ratings survey? 30 | * RED exit survey 31 | * "how are your recommendations" survey 32 | * targeted/ specific popups 33 | * "feedback shared" / "experiencing interruptions" toasts 34 | * "change your subtitle settings" popup 35 | * popup z-index fix 36 | * payment nags 37 | * premium enhanced bitrate nag ([#49](https://github.com/mchangrh/yt-neuter/issues/49)) 38 | * 2025 bitate nag ([#79](https://github.com/mchangrh/yt-neuter/issues/79)) 39 | * become a member of this channel 40 | ### sidebar navigation 41 | * "you" section 42 | * sign in nag 43 | * your clips 44 | * premium 45 | * explore section 46 | * browse channels 47 | * more from youtube 48 | * footer 49 | ## homepage 50 | ### shelves ([#15](https://github.com/mchangrh/yt-neuter/issues/15)) 51 | * youtube movies 52 | * free movies (targets movies channelid) 53 | * Free movies with ads 54 | * youtube 55 | * mixes 56 | * breaking news shelf 57 | * brand featured banner/ shelf ([#40](https://github.com/mchangrh/yt-neuter/issues/40)) 58 | * new to you ([#2](https://github.com/mchangrh/yt-neuter/issues/2)) 59 | * explore categories 60 | * creator 61 | * community posts 62 | ## video browsing 63 | * members-only videos - disabled ([#85](https://github.com/mchangrh/yt-neuter/issues/85)) 64 | * video-attached survey 65 | * header 66 | * recommendations categories 67 | * compact blocks 68 | * mixes 69 | * movie suggestions 70 | * yt music 71 | * badges 72 | * fundraiser 73 | * new 74 | * 4k 75 | * Related 76 | * 3-dot dropdown ([#38](https://github.com/mchangrh/yt-neuter/issues/38)) 77 | * download button 78 | * share button 79 | ## /video 80 | ### multi-purpose 81 | * rolling/animated views, likes 82 | ### player background 83 | * ambient mode 84 | ### in-player 85 | * in-video overlays 86 | * fast forward icon 87 | * info card 88 | * annotations 89 | * watermark 90 | * cultural moment ([#46](https://github.com/mchangrh/yt-neuter/issues/46)) 91 | * paused/ stopped overlay 92 | * endscreen 93 | * recommendation pause overlay (seen in /embed/) 94 | * mixes 95 | ### controls 96 | * progress bar 97 | * pink gradient [#72](https://github.com/mchangrh/yt-neuter/issues/72) 98 | * options buttons 99 | * autoplay button 100 | * settings 101 | * enhanced bitrate selector 102 | ### under-player 103 | * chips/ badges 104 | * fundraiser tag 105 | * buy product badge 106 | * title 107 | * supertitle (trending for x) or #hashtags 108 | * collection badge 109 | * supertitle for location 110 | * location pin 111 | * product count 112 | * hashtags in description 113 | * owner/ channel 114 | * member/ join button 115 | * free trial/ tv subscription 116 | * channel name tooltip 117 | * outlink badges 118 | * action row 119 | * download button 120 | * download worker 121 | * clip button 122 | * clip overflow menu 123 | * thanks button 124 | * thanks overflow menu 125 | * share button 126 | * save button 127 | * hide disabled buttons (download for non-premium, save for yt kids), exclude comment save/submit ([#36](https://github.com/mchangrh/yt-neuter/issues/36)) 128 | ### description box 129 | * stop scrolling on "show less" (ubo only) 130 | * info box 131 | * remove hashtags 132 | * under-description shelves 133 | * merch shelf 134 | * ticket shelf 135 | * clarify / covid-19 box 136 | * topic (kids/ gaming) 137 | * box art (game being played) 138 | * show metadata 139 | * featured music 140 | * featured playlist ([#37](https://github.com/mchangrh/yt-neuter/issues/37)) 141 | * products in current video 142 | * suggested channels 143 | * suggested videos 144 | * age restricted notice 145 | * featured places 146 | * large channel infocard ([#35](https://github.com/mchangrh/yt-neuter/issues/35)) 147 | * ai summary 148 | ### comments 149 | * translate button 150 | * paid comments 151 | * paid (thanks) comment badge 152 | * paid (thanks) comment highlight 153 | * channel member comments 154 | * channel member comment badge 155 | ### recommendations sidebar 156 | * watch on youtube 157 | * nudges (recommendation/ turn on watch history) 158 | * video-specific sidebar 159 | * fundraiser 160 | * other sponsored videos ([#1](https://github.com/mchangrh/yt-neuter/issues/1)) 161 | * ads 162 | * shelves in watch-next recommendations (shorts shelf) 163 | * shop products in this video 164 | * channel 165 | ## /shorts player 166 | * share button ([#38](https://github.com/mchangrh/yt-neuter/issues/38)) 167 | ## /channel page 168 | * tabs 169 | * channel store tab 170 | * community tab 171 | * channels 172 | * channel header / homepage 173 | * channel banner 174 | * home page links 175 | * channel handle 176 | * shelves 177 | * recognized channel member 178 | * members only videos - disabled ([#85](https://github.com/mchangrh/yt-neuter/issues/85)) 179 | * channel scroller 180 | * about 181 | * about > links 182 | ## live chat 183 | * premiere chat 184 | * hide "chat replay is disabled" 185 | * chat window 186 | * chat header 187 | * superchat/member ticker 188 | * superchat/ donate button 189 | ### chat messages 190 | * user badges 191 | * paid badges 192 | * chat member badge 193 | * revert member color 194 | * message content 195 | * custom emojis 196 | * emoji-only messages 197 | * non-text messages 198 | * superchats 199 | * memberships 200 | ## /results - search 201 | * shelves 202 | * channel mix 203 | * channel results 204 | * channel description 205 | ## embed 206 | * info panel 207 | * watch on youtube overlay -------------------------------------------------------------------------------- /filters/hyper.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - hyper aggressive 3 | ! Last modified: 2024/10/01 4 | ! Expires: 10 days 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | !!!! This is a hyper-aggressive block list, use very sparingly. This is more aggressive than the misc list 10 | !!!! This list is not for ANYONE. It will break a lot of things, sometimes intentionally. 11 | 12 | !!!! network requests 13 | !! images 14 | ! remove banner, channel emojis, uploader profile in comments (https://github.com/iv-org/invidious/issues/3796) 15 | ||yt3.googleusercontent.com$image,domain=youtube.com 16 | ! remove user profile images 17 | ||yt3.ggpht.com$image,domain=youtube.com 18 | !! lottie 19 | ! remove lottie renderer 20 | ||www.gstatic.com/external_hosted/lottie/lottie_light.js$script,domain=youtube.com 21 | ||www.youtube.com/s/desktop/*/jsbin/lottie-light.vflset/lottie-light.js$script,domain=youtube.com 22 | ! remove lottie animations 23 | ||www.gstatic.com/youtube/img/lottie/*$domain=youtube.com 24 | 25 | !!!! /video 26 | !!! comments 27 | ! remove comment author images 28 | www.youtube.com###author-thumbnail 29 | !! paid comments 30 | ! remove all paid comments 31 | www.youtube.com##ytd-comment-thread-renderer:has(#paid-comment-chip[role=button]) 32 | !! channel member comments 33 | ! remove all member comments 34 | www.youtube.com##ytd-comment-thread-renderer:has(>ytd-comment-view-model[has-sponsor-badge]) 35 | -------------------------------------------------------------------------------- /filters/misc.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - misc 3 | ! Last modified: 2024/11/29 4 | ! Expires: 10 days 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | ! install link 10 | 11 | !!!! network requests 12 | ! remove offline service worker 13 | ||www.youtube.com/sw.js$script 14 | ! disable installable progressive web app functionality 15 | ||www.youtube.com/manifest.webmanifest 16 | !! chromecast 17 | ! block chromecast cast_sender module 18 | ||www.gstatic.com/*/cast_sender.js$script 19 | ! remove chromecast cast_sender backups 20 | ||www.youtube.com/s/desktop/*/jsbin/www-tampering.vflset/www-tampering.js$script 21 | ! remove mobile chromecast remote 22 | ||www.youtube.com/s/player/*/player_ias.vflset/*/remote.js$script 23 | !! alternative players 24 | ! remove miniplayer restrictions - makes miniplayer fully featured 25 | ||www.youtube.com/s/player/*/player_ias.vflset/*/miniplayer.js$script 26 | ! remove inline player restrictions - makes inline player fully featured 27 | ||www.youtube.com/s/player/*/player_ias.vflset/*/inline_preview.js$script 28 | 29 | !!!! generics 30 | ! remove verified badges 31 | www.youtube.com##.badge-style-type-verified 32 | www.youtube.com##a.yt-core-attributed-string__link--call-to-action-color span[style="color: rgb(170, 170, 170);"] 33 | m.youtube.com##ytm-metadata-badge-renderer ytm-badge[data-type="BADGE_STYLE_TYPE_VERIFIED"] 34 | ! learning playlists (#25) 35 | www.youtube.com##ytd-grid-playlist-renderer:has(.ytd-badge-supported-renderer:has(>span:has-text("Learning playlist"))) 36 | !! shelves 37 | ! block all shelves 38 | www.youtube.com##ytd-rich-shelf-renderer 39 | m.youtube.com##ytm-rich-section-renderer 40 | ! block rich grid sections containing shelves 41 | www.youtube.com##ytd-rich-section-renderer:has(>#content>ytd-rich-shelf-renderer:only-child) 42 | 43 | !!!! video browsing 44 | !! video previews 45 | ! visually hide video previews 46 | www.youtube.com##ytd-video-preview 47 | ! remove inline video previews 48 | www.youtube.com###video-preview:remove() 49 | ! remove hover tooltips 50 | www.youtube.com###thumbnail > #mouseover-overlay 51 | www.youtube.com###thumbnail > #hover-overlays 52 | ! make thumbnails square again 53 | www.youtube.com##a.ytd-thumbnail:style(border-radius: 0px !important) 54 | 55 | !! badges 56 | ! closed captioning badge 57 | youtube.com##.badge[aria-label="CC"] 58 | m.youtube.com##ytm-badge-supported-renderer ytm-badge:has-text(CC) 59 | ! "New" badge (subscriptions feed) 60 | www.youtube.com##yt-thumbnail-overlay-badge-view-model:has-text(/^New$/) 61 | 62 | !!!! /video 63 | !!! in-player 64 | !! paused/ stopped overlay 65 | ! remove annotations module 66 | ||www.youtube.com/s/player/*/player_ias.vflset/*/annotations_module.js$script 67 | ! make all video info visible 68 | www.youtube.com##.ytp-videowall-still-info-content:style(opacity: 1 !important) 69 | !!! controls 70 | !! settings 71 | ! make quality selector superscript red again 72 | www.youtube.com##.ytp-menuitem sup.ytp-swatch-color-white:style(color: var(--yt-spec-static-brand-red, #f00) !important;) 73 | !!! comments 74 | !! channel member comments 75 | ! channel member emoji 76 | www.youtube.com##.yt-core-attributed-string--inline-block-mod>img[src^="https://yt3.googleusercontent.com"] 77 | ! remove emoji 78 | www.youtube.com##img.emoji 79 | !! comment creation 80 | ! remove emoji shortcuts for comments 81 | ||www.gstatic.com/youtube/img/emojis/emoji-*.json 82 | ||www.gstatic.com/youtube/img/emojis/emojis-svg-*.json 83 | 84 | !!! under-player 85 | !! title 86 | ! remove highlights for tagged channels 87 | www.youtube.com###title>h1 a.yt-simple-endpoint:style(color: var(--yt-spec-text-primary, #f1f1f1) !important;) 88 | !! owner/ channel 89 | ! subscribe 90 | www.youtube.com###subscribe-button 91 | m.youtube.com##ytm-button-renderer.icon-subscribe 92 | ! unhide unsubscribe button 93 | www.youtube.com#@##subscribe-button:has(>ytd-subscribe-button-renderer[subscribed]) 94 | ! subscribe animation (smartimation) 95 | www.youtube.com##.smartimation__border 96 | www.youtube.com##yt-animated-action 97 | ! makes subscribe button blend in with other buttons (scriptlet) 98 | www.youtube.com##+js(repc, .ytd-subscribe-button-renderer>button, yt-spec-button-shape-next--filled, yt-spec-button-shape-next--tonal) 99 | 100 | !!! description box 101 | !! creator description 102 | ! remove mention highlights 103 | www.youtube.com##.yt-core-attributed-string__link--call-to-action-color[href^="/channel/"]:style(color: var(--yt-spec-text-primary, #f1f1f1) !important;) 104 | ! remove hashtags in description 105 | www.youtube.com##.ytd-text-inline-expander>a.yt-formatted-string[href^="/hashtag/"] 106 | youtube.com##.yt-core-attributed-string--link-inherit-color>a.yt-core-attributed-string__link--call-to-action-color[href^="/hashtag/"] 107 | ! blocks external links in description 108 | ||youtube.com/redirect?event=video_description^$document 109 | ! remove store links in description 110 | ||youtube.com/redirect?event=product_shelf^$document 111 | youtube.com##a.yt-simple-endpoint.yt-formatted-string[href^="https://www.youtube.com/redirect?event=product_shelf"] 112 | ! remove description video link highlights 113 | www.youtube.com##.yt-core-attributed-string--highlight-text-decorator:style(color: var(--yt-spec-text-primary, #f1f1f1) !important; background-color: transparent !important;) 114 | www.youtube.com##.yt-core-attributed-string--highlight-text-decorator>a>span>img 115 | ! remove external link highlights (comments, descriptions) 116 | youtube.com##a[target=_blank]:not([has-link-only_]):style(color: var(--yt-spec-text-primary, #f1f1f1) !important;) 117 | 118 | !! youtube injected 119 | ! live chat replay prompt #72 120 | www.youtube.com###teaser-carousel 121 | 122 | !! under-description shelves 123 | ! licenced doctor box 124 | www.youtube.com##ytd-info-panel-content-renderer:has(a[href="https://support.google.com/youtube/answer/9795167"]) 125 | ! remove chapter infocard previews 126 | www.youtube.com##ytd-horizontal-card-list-renderer[modern-chapters]>#shelf-container 127 | ! remove infocards section 128 | www.youtube.com##ytd-video-description-infocards-section-renderer>#infocards-section 129 | ! people box 130 | www.youtube.com##yt-video-attributes-section-view-model:has(.yt-video-attributes-section-view-model__title:has-text(People)) 131 | 132 | !!! recommendations sidebar 133 | !! video-specific sidebar 134 | ! remove all offers 135 | youtube.com###offer-module 136 | !!!! /channel page 137 | !! channel header / homepage 138 | ! hide large avatar 139 | www.youtube.com###channel-header-container>yt-img-shadow#avatar 140 | m.youtube.com##yt-image-banner-view-model.yt-image-banner-view-model-wiz 141 | ! remove tagline 142 | www.youtube.com###channel-tagline 143 | !! shelves 144 | ! remove featured video 145 | www.youtube.com##ytd-channel-featured-content-renderer 146 | m.youtube.com##ytm-channel-featured-video-renderer 147 | 148 | !!!! /results - search 149 | ! key moments/chapters 150 | www.youtube.com###expandable-metadata 151 | -------------------------------------------------------------------------------- /filters/nolive.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - nolive 3 | ! Last modified: 2025/02/25 4 | ! Expires: 2 days 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | ! install link 10 | 11 | !!!! global elements 12 | !!! sidebar navigation 13 | ! live tab 14 | www.youtube.com##ytd-guide-entry-renderer:has-text(Live) 15 | www.youtube.com##ytd-mini-guide-entry-renderer:has-text(Live) 16 | !! channels 17 | ! channel is live indicator 18 | www.youtube.com##.ytd-guide-entry-renderer>tp-yt-paper-item>yt-icon.guide-entry-badge:has(svg) 19 | 20 | !!!! homepage 21 | !! video 22 | ! channel live badge 23 | www.youtube.com##.yt-spec-avatar-shape__live-badge 24 | www.youtube.com##.yt-spec-avatar-shape--live-ring:remove-class(yt-spec-avatar-shape--live-ring) 25 | 26 | !!!! /channel page 27 | !! tabs 28 | ! live tab 29 | www.youtube.com##tp-yt-paper-tab:has(> .tab-content:has-text(Live)) 30 | www.youtube.com##yt-tab-shape[tab-title="Live"] 31 | 32 | !!!! video browsing 33 | ! remove live videos 34 | www.youtube.com##ytd-rich-item-renderer:has(.badge-style-type-live-now-alternate) 35 | www.youtube.com##ytd-grid-video-renderer:has(.badge-style-type-live-now-alternate) 36 | www.youtube.com##ytd-video-renderer:has(.badge-style-type-live-now-alternate) 37 | m.youtube.com##ytm-video-with-context-renderer:has(ytm-thumbnail-overlay-time-status-renderer[data-style="LIVE"]) 38 | ! remove streamed videos 39 | www.youtube.com##ytd-rich-item-renderer:has(#metadata-line>span:has-text(Streamed)) 40 | www.youtube.com##ytd-grid-video-renderer:has(#metadata-line>span:has-text(Streamed)) 41 | www.youtube.com##ytd-video-renderer:has(#metadata-line>span:has-text(Streamed)) 42 | m.youtube.com##ytm-video-with-context-renderer:has(ytm-badge-and-byline-renderer>span:has-text(Streamed)) 43 | ! remove upcoming videos 44 | www.youtube.com##ytd-rich-item-renderer>ytd-thumbnail:has(ytd-thumbnail-overlay-time-status-renderer[overlay-style="UPCOMING"]) 45 | www.youtube.com##ytd-grid-video-renderer>ytd-thumbnail:has(ytd-thumbnail-overlay-time-status-renderer[overlay-style="UPCOMING"]) 46 | www.youtube.com##ytd-video-renderer>ytd-thumbnail:has(ytd-thumbnail-overlay-time-status-renderer[overlay-style="UPCOMING"]) 47 | !! header 48 | ! live chips 49 | m.youtube.com##ytm-chip-cloud-chip-renderer[ellipsis-truncate-styling="Live"] 50 | 51 | !!!! /video 52 | !! live chat replay prompt 53 | www.youtube.com###teaser-carousel:has(h2:has-text(Live chat replay)) 54 | !! paused/ stopped overlay 55 | ! video endscreen 56 | www.youtube.com##.ytp-videowall-still[data-is-live=true] 57 | -------------------------------------------------------------------------------- /filters/nomusic.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - nomusic 3 | ! Last modified: 2025/02/25 4 | ! Expires: 1 day 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | ! install link 10 | 11 | !!!! global elements 12 | !!! sidebar navigation 13 | www.youtube.com##ytd-guide-entry-renderer:has-text(Music) 14 | www.youtube.com##ytd-mini-guide-entry-renderer:has-text(Music) 15 | 16 | !!!! video browsing 17 | !! header 18 | ! recommendations chip 19 | m.youtube.com##ytm-chip-cloud-chip-renderer:has-text(Music) 20 | !! badgess 21 | ! videos by verified artists 22 | www.youtube.com##ytd-rich-item-renderer:has(.badge-style-type-verified-artist) 23 | www.youtube.com##ytd-grid-video-renderer:has(.badge-style-type-verified-artist) 24 | www.youtube.com##ytd-video-renderer:has(.badge-style-type-verified-artist) 25 | -------------------------------------------------------------------------------- /filters/noshorts.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - noshorts 3 | ! Last modified: 2025/02/25 4 | ! Expires: 1 day 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | ! install link 10 | 11 | !!!! generics 12 | !! shelves 13 | ! generic shorts shelf (channel, search) 14 | www.youtube.com##ytd-reel-shelf-renderer 15 | m.youtube.com##ytm-reel-shelf-renderer 16 | 17 | !!!! global elements 18 | !!! sidebar navigation 19 | ! sidebar 20 | www.youtube.com##ytd-guide-entry-renderer:has-text(Shorts) 21 | www.youtube.com##ytd-mini-guide-entry-renderer:has-text(Shorts) 22 | ! homepage tab (mobile) 23 | m.youtube.com##ytm-pivot-bar-item-renderer:has(.pivot-bar-item-title:has-text(Shorts)) 24 | 25 | !!!! /homepage 26 | !!! shelves 27 | ! homepage shelf (#15) 28 | www.youtube.com##ytd-rich-shelf-renderer[is-shorts] 29 | m.youtube.com##ytm-rich-section-renderer:has(>ytm-reel-shelf-renderer) 30 | 31 | !!!! /channel page 32 | !! tabs 33 | ! shorts tab 34 | youtube.com##tp-yt-paper-tab:has(> .tab-content:has-text(Shorts)) 35 | youtube.com##yt-tab-shape[tab-title="Shorts"] 36 | 37 | !!!! video browsing 38 | ! videos that resolve to /shorts/ 39 | www.youtube.com##ytd-rich-item-renderer:has(a[href^="/shorts/"]) 40 | www.youtube.com##ytd-grid-video-renderer:has(a[href^="/shorts/"]) 41 | www.youtube.com##ytd-video-renderer:has(a[href^="/shorts/"]) 42 | m.youtube.com##ytm-video-with-context-renderer:has(a[href^="/shorts/"]) 43 | ! videos with shorts icons 44 | www.youtube.com##ytd-rich-item-renderer:has(ytd-thumbnail-overlay-time-status-renderer[overlay-style=SHORTS]) 45 | www.youtube.com##ytd-grid-video-renderer:has(ytd-thumbnail-overlay-time-status-renderer[overlay-style=SHORTS]) 46 | www.youtube.com##ytd-video-renderer:has(ytd-thumbnail-overlay-time-status-renderer[overlay-style=SHORTS]) 47 | m.youtube.com##ytm-video-with-context-renderer:has(ytm-thumbnail-overlay-time-status-renderer[data-style="SHORTS"]) 48 | ! video title with #shorts 49 | www.youtube.com##ytd-rich-item-renderer:has(a#video-title>yt-formatted-string:has-text(#shorts)) 50 | www.youtube.com##ytd-grid-video-renderer:has(a#video-title>yt-formatted-string:has-text(#shorts)) 51 | www.youtube.com##ytd-video-renderer:has(a#video-title>yt-formatted-string:has-text(#shorts)) 52 | 53 | !!!! /video 54 | !! paused/ stopped overlay 55 | ! video endscreen 56 | www.youtube.com##.ytp-videowall-still:has(ytd-thumbnail-overlay-time-status-renderer[overlay-style=SHORTS]) 57 | -------------------------------------------------------------------------------- /filters/notrack.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - notrack 3 | ! Last modified: 2024/10/01 4 | ! Expires: 10 days 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | ! install link 10 | 11 | !!!! network requests 12 | ! quality of experience 13 | # already included in easyprivacy, repeated to suppress errors 14 | ||www.youtube.com/api/stats/qoe?$empty 15 | 16 | !! stats 17 | ! periodic stat pings 18 | ||www.youtube.com/youtubei/v1/log_event?$empty 19 | ! ? generic stats ping 20 | ||www.youtube.com/generate_204 21 | ||youtube.com/generate_204$image 22 | ||www.youtube.com/error_204 23 | ||m.youtube.com/generate_204 24 | ||m.youtube.com/error_204 25 | /generate_204$~xhr 26 | ||www.youtube.com/youtubei/v1/att/get 27 | ||m.youtube.com/youtubei/v1/att/get -------------------------------------------------------------------------------- /filters/noview.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - noview 3 | ! Last modified: 2024/04/23 4 | ! Expires: 10 days 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | ! install link 10 | 11 | !!!! video browsing 12 | ! remove forced low view count videos #62 13 | www.youtube.com##ytd-compact-video-renderer:has(.secondary-metadata:has(>ytd-video-meta-block.byline-separated)):has(.badge[aria-label="New"]) -------------------------------------------------------------------------------- /filters/premium.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - Premium Exclusion 3 | ! Last modified: 2024/02/04 4 | ! Expires: 10 days 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | ! install link 10 | 11 | !!!! video browsing 12 | !! 3-dot dropdown (#38) 13 | ! download button 14 | www.youtube.com#@#ytd-menu-service-item-download-renderer 15 | 16 | !!!! /video 17 | !!! controls 18 | !! settings 19 | ! enhanced bitrate selector 20 | www.youtube.com#@#.ytp-quality-menu .ytp-menuitem:has(.ytp-premium-label) 21 | 22 | !!! under-player 23 | !! action row 24 | ! download button 25 | www.youtube.com#@#ytd-download-button-renderer 26 | ! download worker 27 | @@||www.youtube.com/s/player/*/player_ias.vflset/*/offline.js$script 28 | -------------------------------------------------------------------------------- /filters/requests.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - requests 3 | ! Last modified: 2024/02/04 4 | ! Expires: 10 days 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | ! install link 10 | 11 | !!!! /video 12 | !!! in-player 13 | ! no captions 14 | ||www.youtube.com/s/player/*/player_ias.vflset/*/captions.js$script 15 | youtube.com##.ytp-subtitles-button 16 | !!! under-player 17 | !! action row 18 | ! remove background for youtube buttons, excludes subscribe button 19 | youtube.com##button.yt-spec-button-shape-next--tonal:style(background-color: transparent !important) 20 | ! remove button text labels 21 | www.youtube.com##ytd-menu-renderer > .ytd-menu-renderer > ytd-button-renderer > yt-button-shape > button:has(>.yt-spec-button-shape-next__icon) > .yt-spec-button-shape-next--button-text-content 22 | ! center buttons without text 23 | www.youtube.com##yt-button-shape > button> .yt-spec-button-shape-next__icon:style(margin: 0 !important) 24 | 25 | -------------------------------------------------------------------------------- /filters/sponsorblock.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - sponsorblock 3 | ! Last modified: 2025/03/16 4 | ! Expires: 1 days 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | !!! Subset of yt-neuter for sponsorblock 10 | ! product shopping/ merch (Creator) 11 | ! paid comments (Creator) 12 | ! membership (Creator) 13 | ! tickets (YT + Creator) 14 | ! generic popup (YT) 15 | ! brand features (YT) 16 | 17 | ! install link 18 | 19 | !!!! global elements 20 | !!! popups 21 | !! generic surveys (#24) 22 | ! generic surveys 23 | youtube.com###survey 24 | www.youtube.com##ytd-inline-survey-renderer 25 | www.youtube.com##.ytd-inline-survey-renderer 26 | ! survey answer card/ thanks 27 | youtube.com##yt-survey-answer-card-renderer 28 | ! checkbox survey? 29 | www.youtube.com##.ytd-checkbox-survey-renderer 30 | ! feedback survey? 31 | www.youtube.com##ytd-feedback-survey-renderer 32 | www.youtube.com##.ytd-feedback-survey-renderer 33 | ! follow up survey? 34 | www.youtube.com##.ytd-survey-follow-up-renderer 35 | www.youtube.com##ytd-survey-follow-up-renderer 36 | ! multistage survey? 37 | www.youtube.com##.ytd-multi-stage-survey-renderer 38 | www.youtube.com##ytd-multi-stage-survey-renderer 39 | ! ratings survey? 40 | www.youtube.com##ytd-rating-survey-renderer 41 | www.youtube.com##.ytd-rating-survey-renderer 42 | ! RED exit survey 43 | www.youtube.com##.ytd-red-cancel-survey-renderer 44 | www.youtube.com##ytd-red-cancel-survey-renderer 45 | ! "how are your recommendations" survey 46 | www.youtube.com##ytd-single-option-survey-renderer 47 | www.youtube.com##.ytd-single-option-survey-renderer 48 | !! targeted/ specific popups 49 | ! "feedback shared" / "experiencing interruptions" toasts 50 | www.youtube.com##tp-yt-paper-toast#toast 51 | ! "change your subtitle settings" popup 52 | www.youtube.com##.ytp-promotooltip-wrapper 53 | ! popup z-index fix 54 | www.youtube.com##tp-yt-iron-overlay-backdrop.opened 55 | !! payment nags 56 | ! premium enhanced bitrate nag (#49) 57 | www.youtube.com##ytd-popup-container:has(>tp-yt-paper-dialog>ytd-offline-promo-renderer) 58 | ! become a member of this channel 59 | www.youtube.com##tp-yt-paper-dialog:has(yt-mealbar-promo-renderer) 60 | www.youtube.com##yt-bubble-hint-renderer > .yt-bubble-hint-renderer:has(.yt-formatted-string:has-text(Memebership)) 61 | 62 | !!!! homepage 63 | !! youtube 64 | ! brand featured banner/ shelf (#40) 65 | www.youtube.com##ytd-statement-banner-renderer 66 | www.youtube.com##ytd-brand-video-singleton-renderer 67 | www.youtube.com##ytd-brand-video-shelf-renderer 68 | www.youtube.com##.ytd-brand-video-shelf-renderer 69 | 70 | !!!! video browsing 71 | ! members-only videos 72 | www.youtube.com##ytd-rich-item-renderer:has(.badge.badge-style-type-members-only) 73 | www.youtube.com##ytd-grid-video-renderer:has(.badge.badge-style-type-members-only) 74 | www.youtube.com##ytd-video-renderer:has(.badge.badge-style-type-members-only) 75 | 76 | !!!! /video 77 | !!! controls 78 | !! progress bar 79 | ! pink gradient #72 80 | www.youtube.com##.ytp-cairo-refresh-signature-moments div.ytp-play-progress:style(background: var(--yt-spec-static-brand-red,#f03) !important) 81 | www.youtube.com##.ytd-thumbnail-overlay-resume-playback-renderer:style(background: var(--yt-spec-static-brand-red,#f03) !important) 82 | 83 | !!! under-player 84 | !! chips/ badges 85 | ! buy product badge 86 | youtube.com##.ytp-suggested-action-badge 87 | !! title 88 | ! product count 89 | youtube.com##yt-formatted-string>span:has-text(product) 90 | !! owner/ channel 91 | ! member/ join button 92 | youtube.com###sponsor-button 93 | youtube.com##button[aria-label="Join this channel"] 94 | ! free trial/ tv subscription 95 | youtube.com###purchase-button 96 | 97 | !!! description box 98 | !! under-description shelves 99 | ! merch shelf 100 | www.youtube.com##ytd-merch-shelf-renderer 101 | ! ticket shelf 102 | youtube.com###ticket-shelf 103 | ! products in current video 104 | www.youtube.com##ytd-metadata-row-container-renderer:has(ytd-rich-metadata-renderer[component-style="RICH_METADATA_RENDERER_STYLE_SQUARE"]) 105 | 106 | !!! comments 107 | ! paid (thanks) comment highlight 108 | www.youtube.com##ytd-comment-renderer#comment:style(--ytd-comment-paid-background-color: transparent !important;) 109 | 110 | !!! recommendations sidebar 111 | ! watch on youtube 112 | youtube.com##.ytd-tvfilm-offer-module-renderer 113 | ! nudges (recommendation/ turn on watch history) 114 | www.youtube.com##ytd-feed-nudge-renderer 115 | !! video-specific sidebar 116 | ! ads 117 | www.youtube.com##ytd-engagement-panel-section-list-renderer[target-id="engagement-panel-ads"] 118 | ! shop products in this video 119 | www.youtube.com##ytd-engagement-panel-section-list-renderer[target-id^="shopping_panel_for_entry_point"] 120 | 121 | !!!! /channel page 122 | !! tabs 123 | ! channel store tab 124 | youtube.com##tp-yt-paper-tab:has(> .tab-content:has-text(Store)) 125 | youtube.com##yt-tab-shape[tab-title="Store"] 126 | !! shelves 127 | ! recognized channel member 128 | www.youtube.com##.ytd-recognition-shelf-renderer 129 | ! members only videos - disabled (#85) 130 | # www.youtube.com##ytd-shelf-renderer:has(.badge-style-type-members-only) 131 | # m.youtube.com##ytm-shelf-renderer:has(ytm-badge[data-type="BADGE_STYLE_TYPE_MEMBERS_ONLY"]) -------------------------------------------------------------------------------- /filters/ytkids.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter - YTKids 3 | ! Last modified: 2024/02/04 4 | ! Expires: 10 days 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | !!! yt-neuter for yt kids 10 | 11 | ! install link 12 | 13 | !!!! /video 14 | !!! metadata 15 | !! owner/ channel 16 | ! subscribe button 17 | youtubekids.com###subscribe-container 18 | !!! description box 19 | ! loading overlay 20 | youtubekids.com###player-loading-overlay 21 | -------------------------------------------------------------------------------- /icons/ytn-favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mchangrh/yt-neuter/b5b4a568bc94c04450a72d073bbad6b11b894824/icons/ytn-favicon.png -------------------------------------------------------------------------------- /icons/ytn-favicon.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mchangrh/yt-neuter/b5b4a568bc94c04450a72d073bbad6b11b894824/icons/ytn-favicon.psd -------------------------------------------------------------------------------- /icons/ytn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mchangrh/yt-neuter/b5b4a568bc94c04450a72d073bbad6b11b894824/icons/ytn.png -------------------------------------------------------------------------------- /icons/ytn.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mchangrh/yt-neuter/b5b4a568bc94c04450a72d073bbad6b11b894824/icons/ytn.psd -------------------------------------------------------------------------------- /require/flag-pull.js: -------------------------------------------------------------------------------- 1 | const pull_flag = (name, value = false) => ytcfg.data_.EXPERIMENT_FLAGS[name] = value; -------------------------------------------------------------------------------- /require/nofont.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mchangrh/yt-neuter/b5b4a568bc94c04450a72d073bbad6b11b894824/require/nofont.otf -------------------------------------------------------------------------------- /require/nofont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mchangrh/yt-neuter/b5b4a568bc94c04450a72d073bbad6b11b894824/require/nofont.woff -------------------------------------------------------------------------------- /require/nofont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mchangrh/yt-neuter/b5b4a568bc94c04450a72d073bbad6b11b894824/require/nofont.woff2 -------------------------------------------------------------------------------- /require/wfke.js: -------------------------------------------------------------------------------- 1 | // wait for visible key elements 2 | function wfke(selector, callback) { 3 | var el = document.querySelector(selector); 4 | if (el) return callback(); 5 | setTimeout(wfke, 100, selector, callback); 6 | } -------------------------------------------------------------------------------- /scriptlets.js: -------------------------------------------------------------------------------- 1 | /// replace-class.js 2 | /// alias repc.js 3 | // example.com##+js(repc, selector, oldClass, newClass) 4 | (() => { 5 | 'use strict'; 6 | const selector = '{{1}}'; 7 | const oldClass = '{{2}}'; 8 | const newClass = '{{3}}'; 9 | const wfke = (selector, callback) => { 10 | var el = document.querySelector(selector); 11 | if (el) return callback(); 12 | setTimeout(wfke, 100, selector, callback); 13 | } 14 | const addclass = () => { 15 | const nodes = document.querySelectorAll(selector); 16 | try { 17 | for (const node of nodes) { 18 | node.classList.remove(oldClass); 19 | node.classList.add(newClass); 20 | } 21 | } catch {} 22 | }; 23 | wfke(selector, addclass) 24 | })(); -------------------------------------------------------------------------------- /style/old-red-quality.json: -------------------------------------------------------------------------------- 1 | { 2 | "path": "https://www.youtube.com/*", 3 | "name": "old-red-quality", 4 | "version": "1.0.1", 5 | "description": "Makes the quality indicator red again", 6 | "rules": [{ 7 | "selector": ".ytp-menuitem sup.ytp-swatch-color-white", 8 | "style": "color: var(--yt-spec-static-brand-red, #f00) !important;" 9 | }] 10 | } -------------------------------------------------------------------------------- /style/persist-controls.json: -------------------------------------------------------------------------------- 1 | { 2 | "path": "https://www.youtube.com/*", 3 | "name": "persist-controls", 4 | "version": "1.1.0", 5 | "description": "Make YouTube controls persist", 6 | "rules": [{ 7 | "selector": ".ytp-chrome-bottom", 8 | "style": "opacity: 1 !important;" 9 | }, { 10 | "selector": ".ytp-gradient-bottom", 11 | "style": "opacity: 1 !important; display: block !important;" 12 | }] 13 | } -------------------------------------------------------------------------------- /userscripts/broken/reflow.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name YouTube Grid Reflow 3 | // @namespace yt-neuter 4 | // @version 0.6.11 5 | // @description Force YouTube grid to fit more elements per row 6 | // @author michael mchang.name 7 | // @match https://www.youtube.com/* 8 | // @icon https://www.youtube.com/favicon.ico 9 | // @updateURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/reflow.user.js 10 | // @downloadURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/reflow.user.js 11 | // @require https://neuter.mchang.xyz/require/wfke.js 12 | // @run-at document-idle 13 | // @grant GM_addStyle 14 | // ==/UserScript== 15 | 16 | const vidPerRow = 6; 17 | const scale = false; 18 | 19 | const isVisible = (elem) => elem.offsetWidth > 0 || elem.offsetHeight > 0; 20 | 21 | // run until key elements 22 | function ruke(selector, callback, parent) { 23 | var el = parent.querySelector(selector); 24 | if (el && isVisible(el) && el.childElementCount >= 5) return; 25 | callback(parent); 26 | setTimeout(ruke, 700, selector, callback, parent); 27 | } 28 | 29 | // dispatch reflow event to fill in empty spaces 30 | const trigger_reflow = (parent) => parent.dispatchEvent(new Event('yt-rich-grid-reflow')); 31 | 32 | // force results to fit as many per row 33 | // exclude channels, susbscriptions, history 34 | GM_addStyle(`ytd-two-column-browse-results-renderer { 35 | width: 100% !important; 36 | max-width: 100% !important; 37 | justify-content: center; 38 | display: flex; 39 | }`) 40 | 41 | function reflow() { 42 | // select browse-results-renderer (to increase maxwidth) 43 | const browseResultsRenderer = document.querySelector('ytd-two-column-browse-results-renderer'); 44 | if (!browseResultsRenderer) return; 45 | // target rich grid renderer 46 | const grids = document.querySelectorAll('ytd-rich-grid-renderer'); 47 | 48 | // calculate # of elements per row 49 | const browseWidth = browseResultsRenderer.clientWidth; 50 | const elemPerRow = scale ? Math.floor(browseWidth / 240) : vidPerRow; // scale if enabled, else use constant 51 | /* 52 | grid-item: 320-360px 53 | grid-mini-item: 240-320px 54 | grid-slim-item: 220px 55 | */ 56 | // const slimPerRow = Math.floor(width / 220); 57 | 58 | for (const grid of grids) { 59 | if (!isVisible(grid)) continue; 60 | // set elements per row on element 61 | grid.style.setProperty('--ytd-rich-grid-items-per-row', elemPerRow); 62 | grid.elementsPerRow = elemPerRow 63 | /* disable rich grid post, slim and game since they scale properly 64 | grid.style.setProperty('--ytd-rich-grid-posts-per-row', postPerRow); 65 | grid.postsPerRow = postPerRow; 66 | grid.style.setProperty('--ytd-rich-grid-slim-items-per-row', slimPerRow); 67 | grid.slimItemsPerRow = slimPerRow; 68 | grid.style.setProperty('--ytd-rich-grid-game-cards-per-row', gamePerRow); 69 | grid.gameCardsPerRow = gamePerRow; 70 | */ 71 | // trigger reflow on delay 72 | setTimeout(trigger_reflow, 700, grid); 73 | } 74 | } 75 | 76 | // add delay so that previous grid will disappear 77 | const delayReflow = () => setTimeout(reflow, 50); 78 | 79 | document.addEventListener('yt-navigate-finish', delayReflow); 80 | document.addEventListener('yt-guide-toggle', delayReflow); 81 | window.onresize = () => setTimeout(reflow, 350);; // trigger reflow on resize 82 | // add key listener to manually trigger reflow 83 | document.addEventListener('keydown', (e) => { 84 | if (e.key == 'r') { 85 | console.log("[yt-neuter] Manually triggering reflow"); 86 | reflow(); 87 | } 88 | }); 89 | wfke('.ytd-app', reflow); 90 | -------------------------------------------------------------------------------- /userscripts/flag-remover.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name YT Neuter - flag remover 3 | // @namespace yt-neuter 4 | // @version 0.1.0 5 | // @description Remove misc flags from YouTube 6 | // @author michael mchang.name 7 | // @match https://www.youtube.com/* 8 | // @icon https://www.youtube.com/favicon.ico 9 | // @updateURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/flag-remover.user.js 10 | // @downloadURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/flag-remover.user.js 11 | // @require https://uscript.mchang.xyz/require/flag-pull.js 12 | // @grant GM_setValue 13 | // @grant GM_getValue 14 | // @run-at document-end 15 | // ==/UserScript== 16 | 17 | // static flag list 18 | const flagList = { 19 | "yoodle": [ "enable_yoodle" ], 20 | "animated-like": [ "web_animated_like" ], 21 | "button-outline": [ "web_modern_buttons", "web_modern_chips" ] 22 | } 23 | 24 | // flags config example 25 | /* 26 | {"flags": [ 27 | "animated-like" 28 | ]} 29 | */ 30 | 31 | function loadFlags () { 32 | console.log("YT Neuter: Loading flags") 33 | if (!GM_getValue("flags")) GM_setValue("flags", []) 34 | console.log(GM_getValue("flags")) 35 | const toRemove = GM_getValue("flags") 36 | console.log("YT Neuter: Removing flags", toRemove) 37 | for (const flag of toRemove) 38 | for (const experiment of flagList?.[flag]) { 39 | console.log("YT Neuter: Removing flag", experiment) 40 | pull_flag(experiment) 41 | } 42 | } 43 | 44 | loadFlags() -------------------------------------------------------------------------------- /userscripts/mute-subscribe.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name YT Neuter - mute subscribe 3 | // @namespace yt-neuter 4 | // @version 0.1.2 5 | // @description Remove contrasting colours in subscribe button 6 | // @author michael mchang.name 7 | // @match https://www.youtube.com/watch* 8 | // @icon https://www.youtube.com/favicon.ico 9 | // @updateURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/mute-subscribe.user.js 10 | // @downloadURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/mute-subscribe.user.js 11 | // @require https://neuter.mchang.xyz/require/wfke.js 12 | // @grant none 13 | // ==/UserScript== 14 | 15 | function replaceClass(selector, oldClass, newClass) { 16 | 'use strict'; 17 | const addClass = () => { 18 | const nodes = document.querySelectorAll(selector); 19 | try { 20 | for (const node of nodes) { 21 | node.classList.remove(oldClass); 22 | node.classList.add(newClass); 23 | } 24 | } catch {} 25 | }; 26 | wfke(selector, addClass) 27 | } 28 | 29 | replaceClass(".ytd-subscribe-button-renderer>button", "yt-spec-button-shape-next--filled", "yt-spec-button-shape-next--tonal") -------------------------------------------------------------------------------- /userscripts/no-emoji.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name YT no emoji 3 | // @namespace yt-neuter 4 | // @version 1.1.0 5 | // @description Blank out emojis with empty font 6 | // @author michael mchang.name 7 | // @match https://*.youtube.com/* 8 | // @icon https://www.google.com/s2/favicons?domain=youtube.com 9 | // @updateURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/no-emoji.user.js 10 | // @downloadURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/no-emoji.user.js 11 | // @grant GM_addStyle 12 | // ==/UserScript== 13 | 14 | GM_addStyle(`@font-face { 15 | font-family: 'nofont'; 16 | src: url('https://neuter.mchang.xyz/require/nofont.otf') format('opentype'); 17 | unicode-range: U+10000-1FFFF; 18 | }`); 19 | // browse titles 20 | GM_addStyle('#video-title { font-family: nofont,"Roboto","Arial",sans-serif !important; }') 21 | // video title 22 | GM_addStyle('h1.ytd-watch-metadata { font-family: nofont,"YouTube Sans","Roboto",sans-serif; }') -------------------------------------------------------------------------------- /userscripts/no-link-path.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name YT Neuter - no link path 3 | // @namespace yt-neuter 4 | // @version 1.1.0 5 | // @description Removes trailing paths to links in description 6 | // @author michael mchang.name 7 | // @match https://www.youtube.com/* 8 | // @icon https://www.youtube.com/favicon.ico 9 | // @updateURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/no-link-path.user.js 10 | // @downloadURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/no-link-path.user.js 11 | // @require https://neuter.mchang.xyz/require/wfke.js 12 | // @grant none 13 | // ==/UserScript== 14 | 15 | // remove path from URL, remove www. prefix 16 | const neuterLink = (elem) => { 17 | try { 18 | const hostname = new URL(elem.textContent).hostname 19 | .replace(/^www\./, '') 20 | .split(".") 21 | if (hostname.length > 2) hostname.shift() 22 | elem.textContent = hostname.join(".") 23 | } 24 | catch { return } 25 | } 26 | // iterate over all in description 27 | const neuterDescLinks = () => 28 | document.querySelector("#description-inner") 29 | .querySelectorAll(`a[target="_blank"]`) 30 | .forEach(neuterLink) 31 | wfke("#description-inner", neuterDescLinks) 32 | // re-run on description expand 33 | // timeout is needed on un-expanding 34 | document.addEventListener("yt-text-inline-expander-expanded-changed", () => setTimeout(() => neuterDescLinks(), 0)) -------------------------------------------------------------------------------- /userscripts/no-trailer.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name YT Neuter - no channel trailer 3 | // @namespace yt-neuter 4 | // @version 0.1.0 5 | // @description Pause and remove youtube channel trailers 6 | // @author michael mchang.name 7 | // @match https://www.youtube.com/* 8 | // @icon https://www.google.com/s2/favicons?domain=youtube.com 9 | // @updateURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/no-trailer.user.js 10 | // @downloadURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/no-trailer.user.js 11 | // @require https://uscript.mchang.xyz/require/wfke-el.js 12 | // @run-at document-start 13 | // @grant none 14 | // ==/UserScript== 15 | 16 | // only trigger on channel page 17 | document.addEventListener("yt-navigate-finish", (e) => { 18 | if (e.detail.pageType != "channel") return // only trigger on channel page 19 | wfke(`ytd-player[context="WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_CHANNEL_TRAILER"]`, el => { 20 | el.player_.stopVideo() // stop video 21 | document.querySelector("ytd-channel-video-player-renderer").style.display = "none" // hide the element 22 | }) 23 | }) -------------------------------------------------------------------------------- /userscripts/old-red-quality.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name YT Old Red Quality Indicator 3 | // @namespace yt-neuter 4 | // @version 1.0.1 5 | // @description Make YT Quality icons red again 6 | // @author michael mchang.name 7 | // @match https://www.youtube.com/* 8 | // @icon https://www.google.com/s2/favicons?domain=youtube.com 9 | // @updateURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/old-red-quality.user.js 10 | // @downloadURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/old-red-quality.user.js 11 | // @grant GM_addStyle 12 | // ==/UserScript== 13 | 14 | /* ubo rule: 15 | youtube.com##.ytp-menuitem sup.ytp-swatch-color-white:style(color: var(--yt-spec-static-brand-red, #f00) !important;) 16 | */ 17 | 18 | GM_addStyle(".ytp-menuitem sup.ytp-swatch-color-white { color: var(--yt-spec-static-brand-red, #f00) !important; }"); -------------------------------------------------------------------------------- /userscripts/yt-no-autoplay.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name YouTube No AutoPlay 3 | // @namespace yt-neuter 4 | // @version 1.2.3 5 | // @description Disable YouTube AutoPlay by default 6 | // @author michael mchang.name 7 | // @match https://www.youtube.com/watch* 8 | // @icon https://www.youtube.com/favicon.ico 9 | // @updateURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/yt-no-autoplay.user.js 10 | // @downloadURL https://raw.githubusercontent.com/mchangrh/yt-neuter/main/userscripts/yt-no-autoplay.user.js 11 | // @grant none 12 | // @run-at document-end 13 | // ==/UserScript== 14 | 15 | const player = document.querySelector(".ytd-player>.html5-video-player") 16 | const playlistMgr = document.querySelector("yt-playlist-manager") 17 | const autonavButton = document.querySelector(".ytp-autonav-toggle-button") 18 | 19 | const disable = () => { 20 | if (autonavButton?.ariaChecked === "true") autonavButton.click() 21 | if (player) player.setAutonav(0, 1) 22 | if (playlistMgr) playlistMgr.canAutoAdvance_ = false 23 | } 24 | 25 | const check = () => { 26 | if (playlistMgr?.canAutoAdvance_ || autonavButton?.isAriaChecked) disable() 27 | } 28 | 29 | disable() 30 | setInterval(check, 5000) 31 | -------------------------------------------------------------------------------- /yt-neuter.txt: -------------------------------------------------------------------------------- 1 | [uBlock Origin] 2 | ! Title: YouTube Neuter 3 | ! Last modified: 2025/03/20 4 | ! Expires: 1 day 5 | ! Homepage: https://github.com/mchangrh/yt-neuter 6 | ! Licence: Unlicense 7 | ! 8 | 9 | ! install link 10 | 11 | !!!! generics 12 | !! shelves 13 | ! game shelf 14 | www.youtube.com##ytd-rich-shelf-renderer[has-rounded-box-art-thumbnail-style] 15 | ! playbables shelf 16 | www.youtube.com##ytd-rich-shelf-renderer:has(a[href="/playables"]) 17 | 18 | !!!! global elements 19 | !!! header 20 | !! icon 21 | ! country code 22 | www.youtube.com##ytd-topbar-logo-renderer>#country-code 23 | !! yoodle (#20) 24 | ! block image/animations from being fetched (falls back to normal logo) 25 | ||www.gstatic.com/youtube/img/promos/*$image 26 | ! block child elements of yoodle 27 | www.youtube.com##.ytd-yoodle-renderer 28 | !! search 29 | ! voice search button 30 | www.youtube.com###voice-search-button 31 | ! voice search response noises 32 | ||www.youtube.com/s/search/audio/*.mp3$media 33 | !! action buttons 34 | ! create button 35 | www.youtube.com##ytd-topbar-menu-button-renderer:has(button[aria-label=Create]) 36 | www.youtube.com##ytd-button-renderer:has(button[aria-label=Create]) 37 | 38 | !!! popups 39 | !! generic surveys (#24) 40 | ! generic surveys 41 | youtube.com###survey 42 | www.youtube.com##ytd-inline-survey-renderer 43 | www.youtube.com##.ytd-inline-survey-renderer 44 | ! survey answer card/ thanks 45 | youtube.com##yt-survey-answer-card-renderer 46 | ! checkbox survey? 47 | www.youtube.com##.ytd-checkbox-survey-renderer 48 | ! feedback survey? 49 | www.youtube.com##ytd-feedback-survey-renderer 50 | www.youtube.com##.ytd-feedback-survey-renderer 51 | ! follow up survey? 52 | www.youtube.com##.ytd-survey-follow-up-renderer 53 | www.youtube.com##ytd-survey-follow-up-renderer 54 | ! multistage survey? 55 | www.youtube.com##.ytd-multi-stage-survey-renderer 56 | www.youtube.com##ytd-multi-stage-survey-renderer 57 | ! ratings survey? 58 | www.youtube.com##ytd-rating-survey-renderer 59 | www.youtube.com##.ytd-rating-survey-renderer 60 | ! RED exit survey 61 | www.youtube.com##.ytd-red-cancel-survey-renderer 62 | www.youtube.com##ytd-red-cancel-survey-renderer 63 | ! "how are your recommendations" survey 64 | www.youtube.com##ytd-single-option-survey-renderer 65 | www.youtube.com##.ytd-single-option-survey-renderer 66 | !! targeted/ specific popups 67 | ! "feedback shared" / "experiencing interruptions" toasts 68 | www.youtube.com##tp-yt-paper-toast#toast 69 | ! "change your subtitle settings" popup 70 | www.youtube.com##.ytp-promotooltip-wrapper 71 | ! popup z-index fix 72 | www.youtube.com##tp-yt-iron-overlay-backdrop.opened 73 | !! payment nags 74 | ! premium enhanced bitrate nag (#49) 75 | www.youtube.com##ytd-popup-container:has(>tp-yt-paper-dialog>ytd-offline-promo-renderer) 76 | ! 2025 bitate nag (#79) 77 | www.youtube.com##ytd-popup-container > tp-yt-paper-dialog:has(upsell-view-model) 78 | ! become a member of this channel 79 | www.youtube.com##tp-yt-paper-dialog:has(yt-mealbar-promo-renderer) 80 | www.youtube.com##yt-bubble-hint-renderer > .yt-bubble-hint-renderer:has(.yt-formatted-string:has-text(Memebership)) 81 | 82 | !!! sidebar navigation 83 | !! "you" section 84 | ! sign in nag 85 | www.youtube.com##ytd-guide-signin-promo-renderer 86 | ! your clips 87 | www.youtube.com##.ytd-guide-entry-renderer[href="/feed/clips"] 88 | ! premium 89 | www.youtube.com##a.ytd-guide-entry-renderer[href="/premium"] 90 | ! explore section 91 | www.youtube.com##ytd-guide-section-renderer:has(#guide-section-title:has-text(Explore)) 92 | www.youtube.com##ytd-guide-entry-renderer:has(#endpoint[href="/feed/explore"]) 93 | www.youtube.com##ytd-mini-guide-entry-renderer:has(#endpoint[href="/feed/explore"]) 94 | ! browse channels 95 | www.youtube.com##ytd-guide-entry-renderer:has(#endpoint[href="/feed/guide_builder"]) 96 | ! more from youtube 97 | www.youtube.com##ytd-guide-section-renderer:has(#guide-section-title:has-text(More from YouTube)) 98 | ! footer 99 | www.youtube.com##ytd-guide-renderer #footer 100 | 101 | !!!! homepage 102 | !!! shelves (#15) 103 | !! youtube movies 104 | ! free movies (targets movies channelid) 105 | www.youtube.com##ytd-rich-shelf-renderer:has(a[href="/channel/UClgRkhTL3_hImCAmdLfDE4g"]) 106 | ! Free movies with ads 107 | www.youtube.com##ytd-rich-item-renderer:has(.badge-style-type-ypc> span:has-text(Free with Ads)) 108 | 109 | !! youtube 110 | ! mixes 111 | www.youtube.com##ytd-rich-item-renderer:has(ytd-thumbnail-overlay-bottom-panel-renderer) 112 | ! breaking news shelf 113 | www.youtube.com##ytd-rich-shelf-renderer:has(#title:has-text(Breaking news)) 114 | m.youtube.com##ytm-rich-section-renderer:has(.rich-shelf-title:has-text(Breaking news)) 115 | ! brand featured banner/ shelf (#40) 116 | www.youtube.com##ytd-rich-shelf-renderer:has(ytd-badge-supported-renderer#featured-badge) 117 | www.youtube.com##ytd-statement-banner-renderer 118 | www.youtube.com##ytd-brand-video-singleton-renderer 119 | www.youtube.com##ytd-brand-video-shelf-renderer 120 | www.youtube.com##.ytd-brand-video-shelf-renderer 121 | ! new to you (#2) 122 | www.youtube.com##ytd-feed-nudge-renderer 123 | www.youtube.com##ytd-rich-item-renderer.style-scope:has(> #content > ytd-feed-nudge-renderer) 124 | www.youtube.com##.ytd-rich-item-renderer:has(>.ytd-feed-nudge-renderer) 125 | ! explore categories 126 | www.youtube.com##ytd-feed-filter-chip-bar-renderer:has(yt-chip-cloud-chip-renderer[chip-style=STYLE_HOME_FILTER]) 127 | m.youtube.com##ytm-feed-filter-chip-bar-renderer:has(ytm-chip-cloud-chip-renderer[chip-style=STYLE_HOME_FILTER]) 128 | www.youtube.com##ytd-masthead[frosted-glass="with-chipbar"]:remove-attr(frosted-glass) 129 | 130 | !! creator 131 | ! community posts 132 | www.youtube.com##ytd-rich-shelf-renderer:has(ytd-rich-item-renderer[is-post]) 133 | 134 | !!!! video browsing 135 | ! members-only videos - disabled (#85) 136 | # www.youtube.com##ytd-rich-item-renderer:has(.badge.badge-style-type-members-only) 137 | # www.youtube.com##ytd-grid-video-renderer:has(.badge.badge-style-type-members-only) 138 | # www.youtube.com##ytd-video-renderer:has(.badge.badge-style-type-members-only) 139 | 140 | ! video-attached survey 141 | youtube.com###attached-survey 142 | !! header 143 | ! recommendations categories 144 | youtube.com##yt-chip-cloud-renderer 145 | !! compact blocks 146 | ! mixes 147 | www.youtube.com##.ytd-compact-radio-renderer 148 | ! movie suggestions 149 | www.youtube.com##ytd-compact-movie-renderer 150 | ! yt music 151 | www.youtube.com##ytd-compact-playlist-renderer .ytd-channel-name:has-text(/^YouTube/):upward(ytd-compact-playlist-renderer) 152 | 153 | !! badges 154 | ! fundraiser 155 | www.youtube.com##.badge[aria-label="Fundraiser"] 156 | m.youtube.com##ytm-badge:has-text(Fundraiser) 157 | ! new 158 | www.youtube.com##.badge[aria-label="New"] 159 | www.youtube.com##.yt-content-metadata-view-model-wiz__badge:has-text(New) 160 | m.youtube.com##ytm-badge:has-text(New) 161 | ! 4k 162 | www.youtube.com##.badge[aria-label="4K"] 163 | m.youtube.com##ytm-badge:has-text(4K) 164 | ! Related 165 | m.youtube.com##ytm-badge:has-text(Related) 166 | !! 3-dot dropdown (#38) 167 | ! download button 168 | www.youtube.com##ytd-menu-service-item-download-renderer 169 | ! share button 170 | www.youtube.com##ytd-menu-service-item-renderer:has(>tp-yt-paper-item:has(>yt-formatted-string:has-text(Share))) 171 | 172 | !!!! /video 173 | !!! multi-purpose 174 | ! rolling/animated views, likes 175 | ||www.youtube.com/s/desktop/*/jsbin/web-animations-next-lite.min.vflset/web-animations-next-lite.min.js$script,domain=youtube.com 176 | ||www.youtube.com/s/desktop/*/jsbin/scheduler.vflset/scheduler.js$script,domain=youtube.com 177 | ||www.youtube.com/youtubei/v1/updated_metadata$domain=youtube.com 178 | !!! player background 179 | ! ambient mode 180 | www.youtube.com###player>#cinematics.ytd-watch-flexy 181 | www.youtube.com###player>#cinematics-container 182 | m.youtube.com##.below-the-player-cinematic-container 183 | !!! in-player 184 | !! in-video overlays 185 | ! fast forward icon 186 | youtube.com##.ytp-doubletap-ui-legacy 187 | ! info card 188 | youtube.com##.ytp-cards-button-icon 189 | youtube.com##.ytp-cards-button 190 | ! annotations 191 | youtube.com##.ytp-ce-element 192 | ! watermark 193 | youtube.com##.iv-branding 194 | ! cultural moment (#46) 195 | youtube.com##.ytp-cultural-moment-overlay 196 | !! paused/ stopped overlay 197 | ! endscreen 198 | ||www.youtube.com/s/player/*/player_ias.vflset/*/endscreen.js^$script 199 | ! recommendation pause overlay (seen in /embed/) 200 | youtube.com##.ytp-pause-overlay 201 | ! mixes 202 | youtube.com##.ytp-videowall-still[data-is-mix=true] 203 | !!! controls 204 | !! progress bar 205 | ! pink gradient #72 206 | www.youtube.com##.ytp-cairo-refresh-signature-moments div.ytp-play-progress:style(background: var(--yt-spec-static-brand-red,#f03) !important) 207 | www.youtube.com##.ytd-thumbnail-overlay-resume-playback-renderer:style(background: var(--yt-spec-static-brand-red,#f03) !important) 208 | 209 | !! options buttons 210 | ! autoplay button 211 | youtube.com##button.ytp-button[data-tooltip-target-id=ytp-autonav-toggle-button] 212 | !! settings 213 | ! enhanced bitrate selector 214 | youtube.com##.ytp-quality-menu .ytp-menuitem:has(.ytp-premium-label) 215 | 216 | !!! under-player 217 | !! chips/ badges 218 | ! fundraiser tag 219 | www.youtube.com##ytd-badge-supported-renderer:has(.badge-style-type-ypc):remove() 220 | ! buy product badge 221 | youtube.com##.ytp-suggested-action-badge 222 | !! title 223 | ! supertitle (trending for x) or #hashtags 224 | youtube.com###title>#super-title 225 | ! collection badge 226 | youtube.com##.badge.badge-style-type-collection 227 | ! supertitle for location 228 | youtube.com###info-container>#info>a.yt-simple-endpoint[style-target="bold"] 229 | ! location pin 230 | youtube.com##a:has(>yt-icon[icon="yt-icons:location_pin"]) 231 | ! product count 232 | youtube.com##yt-formatted-string>span:has-text(product) 233 | ! hashtags in description 234 | youtube.com##a[href^="/hashtag/"] 235 | !! owner/ channel 236 | ! member/ join button 237 | youtube.com###sponsor-button 238 | youtube.com##button[aria-label="Join this channel"] 239 | ! free trial/ tv subscription 240 | youtube.com###purchase-button 241 | ! channel name tooltip 242 | www.youtube.com##ytd-channel-name>.ytd-channel-name>tp-yt-paper-tooltip.ytd-channel-name 243 | ! outlink badges 244 | m.youtube.com##.ytm-infocards-creator-custom-url-buttons 245 | 246 | !! action row 247 | ! download button 248 | www.youtube.com##ytd-download-button-renderer 249 | ! download worker 250 | ||www.youtube.com/s/player/*/player_ias.vflset/*/offline.js$script 251 | ! clip button 252 | www.youtube.com##ytd-button-renderer:has(a:has(> yt-formatted-string:has-text(Clip))) 253 | www.youtube.com##ytd-button-renderer:has(>yt-button-shape:has(> button[aria-label=Clip])) 254 | youtube.com##yt-button-view-model:has(>button-view-model> button[aria-label=Clip]) 255 | ! clip overflow menu 256 | www.youtube.com##ytd-menu-service-item-renderer:has(>tp-yt-paper-item:has(>yt-formatted-string:has-text(Clip))) 257 | ! thanks button 258 | www.youtube.com##ytd-button-renderer:has(>a:has(> yt-formatted-string:has-text(Thanks))) 259 | www.youtube.com##ytd-button-renderer:has(>yt-button-shape:has(> button[aria-label=Thanks])) 260 | youtube.com##yt-button-view-model:has(>button-view-model> button[aria-label=Thanks]) 261 | ! thanks overflow menu 262 | www.youtube.com##ytd-menu-service-item-renderer:has(>tp-yt-paper-item:has(>yt-formatted-string:has-text(Thanks))) 263 | ! share button 264 | www.youtube.com##ytd-button-renderer:has(>a:has(> yt-formatted-string:has-text(Share))) 265 | www.youtube.com##ytd-button-renderer:has(>yt-button-shape:has(> button[aria-label=Share])) 266 | www.youtube.com##yt-button-view-model:has(>button-view-model> button[aria-label=Share]) 267 | m.youtube.com##button-view-model:has(button[aria-label="Share"]) 268 | ! save button 269 | www.youtube.com##ytd-button-renderer:has(>yt-button-shape:has(> button:has-text(Save)):has(yt-icon)) 270 | www.youtube.com##tp-yt-paper-item:has(yt-icon):has(yt-formatted-string:has-text(Save)) 271 | www.youtube.com##yt-button-view-model:has(>button-view-model> button[aria-label="Save to playlist"]) 272 | m.youtube.com##button-view-model:has(button[aria-label="Save to playlist"]) 273 | ! hide disabled buttons (download for non-premium, save for yt kids), exclude comment save/submit (#36) 274 | www.youtube.com##ytd-button-renderer:has(>yt-button-shape:has(>button.yt-spec-button-shape-next--disabled)):not(.ytd-commentbox) 275 | 276 | !!! description box 277 | ! stop scrolling on "show less" (ubo only) 278 | www.youtube.com##+js(aeld, yt-text-inline-expander-collapse-clicked) 279 | !! info box 280 | ! remove hashtags 281 | youtube.com###info-container #info>a.yt-simple-endpoint[href^="/hashtag/"] 282 | !! under-description shelves 283 | ! merch shelf 284 | youtube.com##ytd-merch-shelf-renderer 285 | ! ticket shelf 286 | youtube.com###ticket-shelf 287 | ! clarify / covid-19 box 288 | youtube.com###clarify-box 289 | ! topic (kids/ gaming) 290 | www.youtube.com##.ytd-rich-metadata-row-renderer[component-style=RICH_METADATA_RENDERER_STYLE_TOPIC] 291 | ! box art (game being played) 292 | www.youtube.com##.ytd-rich-metadata-row-renderer[component-style=RICH_METADATA_RENDERER_STYLE_BOX_ART] 293 | ! show metadata 294 | www.youtube.com###collapsible > .ytd-metadata-row-container-renderer 295 | ! featured music 296 | www.youtube.com##ytd-video-description-music-section-renderer 297 | youtube.com##div[slot="extra-content"]:has(button-view-model>a[href="/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ"]) 298 | www.youtube.com##ytd-horizontal-card-list-renderer:has(button-view-model>a[href="/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ"]) 299 | ! featured playlist (#37) 300 | www.youtube.com##ytd-video-description-course-section-renderer 301 | ! products in current video 302 | www.youtube.com##ytd-metadata-row-container-renderer:has(ytd-rich-metadata-renderer[component-style="RICH_METADATA_RENDERER_STYLE_SQUARE"]) 303 | ! suggested channels 304 | www.youtube.com##ytd-metadata-row-renderer:has(yt-formatted-string[has-link-only_] > a[href^="/channel/"]) 305 | ! suggested videos 306 | www.youtube.com##ytd-metadata-row-renderer:has(yt-formatted-string[has-link-only_] > a[href^="/watch"]) 307 | ! age restricted notice 308 | www.youtube.com##ytd-metadata-row-renderer:has(a[href="http://www.youtube.com/t/community_guidelines"]) 309 | ! featured places 310 | www.youtube.com##ytd-horizontal-card-list-renderer:has(ytd-place-data-view-model) 311 | www.youtube.com##ytd-horizontal-card-list-renderer:has(#navigation-button) 312 | ! large channel infocard (#35) 313 | www.youtube.com##ytd-video-description-infocards-section-renderer 314 | www.youtube.com##ytd-video-description-infocards-section-renderer>a#header[href^="/@"] 315 | www.youtube.com##ytd-video-description-infocards-section-renderer>#action-buttons 316 | www.youtube.com##ytd-video-description-infocards-section-renderer 317 | ! ai summary 318 | www.youtube.com###expandable-metadata:has(video-summary-content-view-model) 319 | 320 | !!! comments 321 | ! translate button 322 | youtube.com##.translate-button[state="untoggled"] 323 | !! paid comments 324 | ! paid (thanks) comment badge 325 | youtube.com###paid-comment-chip[role=button] 326 | ! paid (thanks) comment highlight 327 | www.youtube.com##ytd-comment-view-model>#paid-comment-background 328 | !! channel member comments 329 | ! channel member comment badge 330 | youtube.com##span#sponsor-comment-badge 331 | 332 | !!! recommendations sidebar 333 | ! watch on youtube 334 | www.youtube.com##ytd-tvfilm-offer-module-renderer 335 | ! nudges (recommendation/ turn on watch history) 336 | www.youtube.com##ytd-feed-nudge-renderer 337 | !! video-specific sidebar 338 | ! fundraiser 339 | www.youtube.com###donation-shelf 340 | m.youtube.com##ytm-donation-shelf-renderer 341 | ! other sponsored videos (#1) 342 | www.youtube.com##ytd-engagement-panel-section-list-renderer[target-id="ytbc-related-shelf"] 343 | ! ads 344 | www.youtube.com##ytd-engagement-panel-section-list-renderer[target-id="engagement-panel-ads"] 345 | ! shelves in watch-next recommendations (shorts shelf) 346 | www.youtube.com##ytd-watch-next-secondary-results-renderer ytd-shelf-renderer 347 | ! shop products in this video 348 | www.youtube.com##ytd-engagement-panel-section-list-renderer[target-id^="shopping_panel_for_entry_point"] 349 | ! channel 350 | www.youtube.com##ytd-channel-renderer.ytd-item-section-renderer 351 | 352 | !!!! /shorts player 353 | ! share button (#38) 354 | youtube.com###share-button.ytd-reel-player-overlay-renderer 355 | 356 | !!!! /channel page 357 | !! tabs 358 | ! channel store tab 359 | youtube.com##tp-yt-paper-tab:has(> .tab-content:has-text(Store)) 360 | youtube.com##yt-tab-shape[tab-title="Store"] 361 | ! community tab 362 | youtube.com##tp-yt-paper-tab:has(> .tab-content:has-text(Community)) 363 | youtube.com##yt-tab-shape[tab-title="Community"] 364 | ! channels 365 | youtube.com##tp-yt-paper-tab:has(> .tab-content:has-text(Channels)) 366 | youtube.com##yt-tab-shape[tab-title="Channels"] 367 | !! channel header / homepage 368 | ! channel banner 369 | www.youtube.com##.banner-visible-area 370 | www.youtube.com##.page-header-banner 371 | www.youtube.com###page-header-banner 372 | m.youtube.com##.c4-tabbed-header-page-header-banner 373 | ! home page links 374 | www.youtube.com###channel-header > #links-holder 375 | www.youtube.com###channel-header-links 376 | m.youtube.com##ytm-channel-header-links-view-model 377 | ! channel handle 378 | youtube.com###meta>p:has(>#channel-handle) 379 | youtube.com##.meta-item:has(>#channel-handle) 380 | !! shelves 381 | ! recognized channel member 382 | www.youtube.com##.ytd-recognition-shelf-renderer 383 | ! members only videos - disabled (#85) 384 | # www.youtube.com##ytd-shelf-renderer:has(.badge-style-type-members-only) 385 | # m.youtube.com##ytm-shelf-renderer:has(ytm-badge[data-type="BADGE_STYLE_TYPE_MEMBERS_ONLY"]) 386 | # ! featured channels - disabled (#85) 387 | # www.youtube.com##ytd-shelf-renderer:has(ytd-channel-renderer):has(.grid-subheader:not(:has(>#title-container[hidden]))) 388 | # m.youtube.com##ytm-shelf-renderer:has(ytm-compact-channel-renderer) 389 | ! channel scroller 390 | www.youtube.com##ytd-shelf-renderer:has(ytd-grid-channel-renderer) 391 | !! about 392 | ! about > links 393 | www.youtube.com###links-container.ytd-channel-about-metadata-renderer 394 | m.youtube.com##.about-channel-section:has(>.about-channel-new-links-container) 395 | 396 | !!!! live chat 397 | !! premiere chat 398 | ! hide "chat replay is disabled" 399 | www.youtube.com##ytd-live-chat-frame:has(> ytd-message-renderer) 400 | ! chat window 401 | youtube.com###chat 402 | !! chat header 403 | ! superchat/member ticker 404 | youtube.com###ticker 405 | ! superchat/ donate button 406 | youtube.com###product-picker 407 | !!! chat messages 408 | !! user badges 409 | ! paid badges 410 | youtube.com##yt-live-chat-paid-sticker-renderer 411 | ! chat member badge 412 | youtube.com##yt-live-chat-author-badge-renderer[type=member] 413 | ! revert member color 414 | youtube.com###author-name.member:style(color: var(--yt-live-chat-secondary-text-color, rgba(255,255,255,0.7)) !important) 415 | !! message content 416 | ! custom emojis 417 | youtube.com##.emoji[data-emoji-id] 418 | ! emoji-only messages 419 | youtube.com##yt-live-chat-text-message-renderer:not(:has(#message:min-text-length(1))) 420 | !! non-text messages 421 | ! superchats 422 | youtube.com##yt-live-chat-paid-message-renderer 423 | ! memberships 424 | youtube.com##yt-live-chat-membership-item-renderer 425 | 426 | !!!! /results - search 427 | !! shelves 428 | # - disabled (#85) 429 | # ! people also watched, latest from channel, for you, previously watched, channels new to you 430 | # www.youtube.com##:matches-path(/results) ytd-shelf-renderer 431 | # ! People also search for 432 | # www.youtube.com##:matches-path(/results) ytd-horizontal-card-list-renderer 433 | # ! Featured channels and TV shows 434 | # www.youtube.com##:matches-path(/results) ytd-universal-watch-card-renderer 435 | 436 | ! channel mix 437 | www.youtube.com##ytd-radio-renderer 438 | !! channel results 439 | ! channel description 440 | www.youtube.com##:matches-path(/results) .ytd-channel-renderer#description 441 | 442 | !!!! embed 443 | ! info panel 444 | youtube.com##.ytp-info-panel-preview 445 | ! watch on youtube overlay 446 | youtube.com##.ytp-impression-link 447 | --------------------------------------------------------------------------------