// ==UserScript== // @name Twitter Ad Remover // @namespace http://tampermonkey.net/ // @version 1.0 // @description Remove promoted tweets and ads from Twitter feed // @author aspen138 // @match *://twitter.com/* // @match *://x.com/* // @grant none // @license MIT // @icon https://about.twitter.com/etc/designs/about2-twitter/public/img/favicon-32x32.png // @downloadURL none // ==/UserScript== (function() { 'use strict'; function removePromotedTweets(node) { node = node || document.body; // Select all tweets within the node const tweets = node.querySelectorAll('article[data-testid="tweet"]'); tweets.forEach((tweet) => { // Look for the "Ad" label within the tweet const adLabel = tweet.querySelector('div[dir="ltr"] > span'); if (adLabel && (adLabel.textContent === 'Promoted' || adLabel.textContent === 'Ad')) { // Remove the tweet if it's a promoted tweet tweet.remove(); } }); } // Initial removal removePromotedTweets(); // Observe the DOM for changes (e.g., new tweets loaded dynamically) const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { mutation.addedNodes.forEach((node) => { if (node.nodeType === Node.ELEMENT_NODE) { removePromotedTweets(node); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })();