A lightweight userscript that filters unwanted news articles based on customizable keywords. Built for Tampermonkey/Greasemonkey browser extensions.
ZeroNoise automatically hides news articles containing specific keywords from supported news websites. It works on both static and dynamically loaded content (infinite scroll, AJAX updates), ensuring a cleaner, quieter browsing experience.
zeronoise/
│
├── readme.md # Documentation (this file)
│
└── zeronoise.js # Main userscript
├── Configuration # Keywords list (edit here)
├── Site Templates # CSS selectors for each news site (advanced users only)
└── Core Logic # Filtering and detection algorithms
ZeroNoise consolidates everything into one file for easier management and portability.
Choose one for your browser:
zeronoise.js[ZeroNoise] Initializing for elpais.com with 37 keywords
[ZeroNoise] Filtered 12 articles on initial load
[ZeroNoise] Watching for new content
Open zeronoise.js in the Tampermonkey editor and modify the KEYWORDS array:
const KEYWORDS = [
'Trump',
'Mazón',
// Add your keywords here
'new keyword',
'last keyword'
// Remove any keywords you don't want
];
Tips for Keywords:
'Donald Trump''trump' matches “Trump”, “TRUMP”, “trump”'Trump' won’t match “trumpet”'Mazón'ZeroNoise uses explicit @match directives in the script header, which means:
@match directive and the SITE_TEMPLATES sectionZeroNoise comes pre-configured for these Spanish news sites:
| Site | Domain | Type |
|---|---|---|
| ABC | abc.es | General news |
| El Mundo | elmundo.es | General news |
| El País | elpais.com | General news |
| La Vanguardia | lavanguardia.com | General news |
| La Razón | larazon.es | General news |
| Menéame | meneame.net | News aggregator |
| Marca | marca.com | Sports |
| AS | as.com | Sports |
To add support for a new news website, you need to make two changes:
zeronoise.js in Tampermonkey editor@match directives at the top (lines 7-22)// @match *://yournewssite.com/*
// @match *://*.yournewssite.com/*
The *:// matches both http and https. The second line with *. catches subdomains like www.yournewssite.com.
SITE_TEMPLATES sectionconst SITE_TEMPLATES = {
// ... existing sites ...
'yournewssite.com': {
// Selector for article containers
articleSelector: 'article, div.news-item',
// Selector for headlines within articles
headlineSelector: 'h2, h3, .title',
// Selector for descriptions (optional)
descriptionSelector: 'p.summary, .description'
}
};
Example walkthrough:
<!-- If the site HTML looks like this: -->
<article class="story">
<h2 class="story-title">
<a href="/news/123">Breaking News Title</a>
</h2>
<p class="story-summary">This is the article summary...</p>
</article>
<!-- Your template should be: -->
'example.com': {
articleSelector: 'article.story',
headlineSelector: 'h2.story-title a',
descriptionSelector: 'p.story-summary'
}
display: none on matching articlesArticle text: "Trump announces new policy on trade"
Normalized: "Trump announces new policy on trade"
Keyword: "Trump"
Regex: (^|\s)Trump(\s|$)
Result: ✓ MATCH (whole word at start)
Article text: "The trumpet player wins award"
Normalized: "The trumpet player wins award"
Keyword: "Trump"
Regex: (^|\s)Trump(\s|$)
Result: ✗ NO MATCH (not a whole word)
init() can be adjusted if neededThe site may have changed their HTML structure. Steps to fix:
SITE_TEMPLATESTo contribute new site templates:
This project is open source and available for personal use.
Version: 1.0
Last Updated: January 2026
Compatibility: All modern browsers with Tampermonkey/Greasemonkey support