// ==UserScript==
// @name Newspaper (Native RSS Reader)
// @namespace i2p.schimon.newspaper
// @description Native Feed Viewer. Render syndication web feeds (supports ActivityStreams, Atom, JSON Feed, OPML, RDF, RSS, RSS-in-JSON and SMF)
// @author Schimon Jehudah
// @collaborator CY Fung
// @collaborator NotYou
// @homepageURL https://sjehuda.github.io/newspaper.html
// @supportURL https://greasyfork.org/en/scripts/465932-newspaper/feedback
// @copyright 2023, Schimon Jehudah (http://schimon.i2p)
// @license MIT; https://opensource.org/licenses/MIT
// @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48dGV4dCB5PSIuOWVtIiBmb250LXNpemU9IjkwIj7wn5OwPC90ZXh0Pjwvc3ZnPgo=
// @exclude *?streamburner_active=0
// @exclude *&streamburner_active=0
// @match file://*
// @match *://*/*
// @version 23.10.22
// @run-at document-start
// @grant GM.setValue
// @grant GM.getValue
// ==/UserScript==
// TODO
// json https://www.timburton.com/news?format=json
// TODO
// Open directly from HTML
// To overcome XML -> HTML issue
// To open files foced to be downloaded https://ffmpeg.org/main.rss
// TODO
// Follow: Drop-down menu
// Next and Previous to be at the left side
// TODO
// Ad filtering
// TODO
// Place Subtitles under About title which will be placed at the bottom of the page
// May include feed icon too
// See https://forums.ubports.com/topic/3257.rss
// TODO
// Turn subtitle (top) to about (bottom)
// https://ethresear.ch/t/design-idea-to-solve-the-scalability-problem-of-a-decentralized-social-media-platform/10523.rss
// FIXME
// https://git.sr.ht/~mil/sxmo-utils/log/master/rss.xml (Falkon)
// https://www.gov.im/news/RssNews (XSLT stylesheet is absent (404) and that causes the script not to work)
// FIXME LTR/RTL
// https://www.sbtxt.co.il/collections/sabrina.atom
// https://sabrinabutterflydesigns.ca/collections/socks.atom
// http://www.ynet.co.il/Integration/StoryRss3086.xml
const
namespace = 'i2p.schimon.newspaper',
defaultTitle = 'Streamburner',
// This news feed is brought to you by Streamburner News Reader
defaultSubtitle = 'News feed rendered with Streamburner',
defaultAbout = 'No description was provided.',
rtlLocales = ['ar', 'fa', 'he', 'ji', 'ku', 'ur', 'yi'],
atomRules = {
"feedLanguage" : "feed", // NOTE @xml:lang
"feedTitlePage" : "feed > title",
"feedSubtitle" : "feed > subtitle",
"feedLink" : "feed > link",
"feedDate" : "updated",
"feedGenerated" : "feed > generator",
"feedItem" : "entry",
"feedItemTitle" : "title",
"feedItemLink" : "link", // NOTE varies and doesn't always contain rel='alternate'
"feedItemDate" : "updated",
"feedItemContent" : "content",
"feedItemSummary" : "summary",
"feedItemEnclosure" : "link[rel='enclosure']"
},
rdfRules = {
"feedLanguage" : "channel > language", // TODO Test
"feedTitlePage" : "channel > title",
"feedSubtitle" : "channel > description",
"feedLink" : "channel > link",
"feedDate" : "date",
"feedGenerated" : "channel > generator", // dc:creator
"feedItem" : "item",
"feedItemTitle" : "title",
"feedItemLink" : "link",
"feedItemDate" : "date",
"feedItemContent" : "description",
"feedItemEnclosure" : "resource" // TODO Test
},
rssRules = {
"feedLanguage" : "channel > language",
"feedTitlePage" : "channel > title",
"feedSubtitle" : "channel > description",
"feedLink" : "channel > link",
"feedDate" : "lastBuildDate",
"feedGenerated" : "channel > generator",
"feedItem" : "item",
"feedItemTitle" : "title",
"feedItemLink" : "link",
"feedItemDate" : "pubDate",
"feedItemContent" : "description",
// NOTE prefer content:encoded
// https://agovernmentofwolves.com/feed/
//"feedItemSummary" : "content\\:encoded",
"feedItemEnclosure" : "enclosure"
},
smfRules = {
// FIXME "smf\\:xml-feed" doesn't appear to work
// or at least not when it's comming from json
"feedLanguage" : "smf\\:xml-feed", // NOTE @xml:lang
"feedTitlePage" : "smf\\:xml-feed", // NOTE @forum-name
"feedSubtitle" : "smf\\:xml-feed", // NOTE @description
"feedLink" : "smf\\:xml-feed",
"feedDate" : "time", // NOTE @generated-date-UTC @generated-date-localized
"feedGenerated" : "generator",
"feedItem" : "recent-post",
"feedItemTitle" : "subject",
"feedItemLink" : "topic > link",
"feedItemDate" : "time",
"feedItemContent" : "body",
"feedItemEnclosure" : "enclosure" // NOTE Doesn't exist
},
opmlRules = {
"feedLanguage" : "head > language", // NOTE Doesn't exist
"feedTitlePage" : "head > title",
"feedSubtitle" : "head > description",
"feedLink" : "head > urlPublic",
"feedDate" : "head > dateModified", // dateCreated
"feedItem" : "body outline",
"feedItemTitle" : "title",
"feedItemLink" : "htmlUrl",
"feedItemDate" : "created",
"feedItemContent" : "description",
"feedItemSummary" : "text",
"feedItemEnclosure" : "xmlUrl"
},
banner = `<svg width="256" height="100" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient x1="77.1180071%" y1="12.3268731%" x2="3.36110907%" y2="118.781335%" id="a"><stop stop-color="#D446FF" offset="0%"/><stop stop-color="#A0D8FF" offset="100%"/></linearGradient><linearGradient x1="50.7818321%" y1="-17.173918%" x2="76.3448843%" y2="77.2144178%" id="b"><stop stop-color="#3C3C3C" offset="0%"/><stop stop-color="#191919" offset="100%"/></linearGradient><linearGradient x1="148.794275%" y1="-26.5643443%" x2="-21.1415871%" y2="99.3029307%" id="c"><stop stop-color="#D446FF" offset="0%"/><stop stop-color="#A0D8FF" offset="100%"/></linearGradient><linearGradient x1="41.8083357%" y1="20.866645%" x2="95.5956597%" y2="-8.31097281%" id="d"><stop stop-color="#FFF" offset="0%"/><stop stop-color="#DADADA" offset="100%"/></linearGradient><linearGradient x1="52.2801818%" y1="70.5577815%" x2="2.53678786%" y2="8.97706744%" id="e"><stop stop-color="#FFF" offset="0%"/><stop stop-color="#DADADA" offset="100%"/></linearGradient><linearGradient x1="98.684398%" y1="12.9995489%" x2="35.2678133%" y2="40.863838%" id="f"><stop stop-color="#D0D0D0" offset="0%"/><stop stop-color="#FFF" offset="100%"/></linearGradient><linearGradient x1="34.2841787%" y1="31.6476155%" x2="-40.2132134%" y2="123.398162%" id="g"><stop stop-color="#FFDC68" offset="0%"/><stop stop-color="#CE4300" offset="100%"/></linearGradient><linearGradient x1="95.7086811%" y1="2.33776624%" x2="-10.5474304%" y2="34.7418529%" id="h"><stop stop-color="#FFDC68" offset="0%"/><stop stop-color="#CE4300" offset="100%"/></linearGradient><linearGradient x1="55.2222258%" y1="39.6484627%" x2="-63.5655829%" y2="222.055577%" id="i"><stop stop-color="#FFDC68" offset="0%"/><stop stop-color="#CE4300" offset="100%"/></linearGradient></defs><g fill="none" fill-rule="evenodd"><path fill="#252525" fill-rule="nonzero" d="M68.3766216 33.24450169V46.6414437h17.1215335v4.3309176H68.3766216v18.9693703h-4.9083597V28.91359256h23.7622535v4.33090913H68.3766216zm31.2822046-4.92645583h5.5724368L119.81199 69.3461849h-4.966111l-4.157673-11.9244357H93.7687843l-4.1576731 11.9244357H85.078099l14.5807272-41.02813904Zm2.5696738 4.7928662L95.241299 53.1197155h13.945526L102.2285 33.11091206Zm20.879509-4.1973195h4.90836V65.6397065h18.420795v4.3020251h-23.329155zm27.650382 0h4.908369V69.9417316h-4.908369zm48.41257-.4253905c2.714031 0 5.245206.48121024 7.593526 1.44363071 2.367565.9431758 4.407905 2.28094667 6.121021 4.01331259 1.732366 1.73235454 3.089381 3.89780774 4.071046 6.49635944.981671 2.5792957 1.472507 5.4184455 1.472507 8.5174493 0 4.1961709-.837308 7.9303791-2.511923 11.2026246-1.655364 3.2529952-3.965184 5.7745455-6.929458 7.5646511-2.945012 1.770861-6.284623 2.6562914-10.018831 2.6562914-2.463811 0-4.82175-.43309-7.073818-1.2992702-2.252074-.8854361-4.282792-2.1654616-6.092154-3.8400765-1.80935-1.6746149-3.252981-3.8593184-4.330892-6.5541105-1.077922-2.7140367-1.616884-5.7649203-1.616884-9.1526508 0-3.1759995.490836-6.0825226 1.472507-8.7195693.981676-2.6370411 2.329072-4.8506144 4.042188-6.64072001 1.713115-1.8093616 3.753455-3.20487781 6.12102-4.18654862 2.367559-1.00091547 4.927607-1.50137321 7.680145-1.50137321Zm-.259854 4.30203363c-1.751611 0-3.435857.32722172-5.052738.98166514-1.616863.65445477-3.108617 1.61688087-4.475261 2.88727847-1.347399 1.2511471-2.434941 2.9450124-3.262626 5.0815957-.808429 2.117333-1.212643 4.5137703-1.212643 7.1893121 0 2.560051.375344 4.9276129 1.126034 7.1026855.750689 2.1558337 1.770858 3.9651924 3.060506 5.4280763 1.289648 1.4628896 2.810277 2.5985489 4.561887 3.406978 1.770867.8084405 3.666844 1.2126607 5.687931 1.2126607 1.366643 0 2.704411-.2021115 4.013304-.6063346 1.328148-.4042174 2.598552-1.0394161 3.811209-1.9055963 1.212647-.8854361 2.271313-1.9633529 3.176-3.2337505.923925-1.2703975 1.655367-2.8391469 2.194326-4.7062481.558203-1.867107.837304-3.9170723.837304-6.149896 0-2.2713186-.288726-4.3501538-.86618-6.2365054-.577453-1.8863516-1.347393-3.4647261-2.309819-4.7351237-.943176-1.2704032-2.049963-2.3386948-3.32036-3.2048749-1.251159-.88543618-2.550435-1.52063777-3.897828-1.90560483-1.328143-.40421172-2.685158-.60631758-4.071046-.60631758Zm23.397966-3.87664313h6.207638l22.347481 34.32967654V28.91359256h4.908369V69.9417316h-6.20763l-22.34749-34.3874106v34.3874106h-4.908368V28.91359256z"/><path fill="url(#a)" fill-rule="nonzero" d="M174.265411 4.50913925h6.14987L163.062778 24.0848526l-6.178763.4042146z" transform="translate(0 25)"/><path fill="url(#b)" fill-rule="nonzero" d="M162.552309 23.4815553 181.00198 44.933981h-6.323132l-18.305302-21.0482111z" transform="translate(0 25)"/><g transform="translate(0 25)"><ellipse stroke="#A3A3A3" stroke-width=".5" fill="url(#c)" fill-rule="nonzero" cx="26.8134179" cy="26.3507547" rx="26.805321" ry="26.3202814"/><path d="M9.37216085 52.0819111S17.7489335 22.7696899 50.3566889 26.4969018c0 0-20.723434-12.3020208-40.84161386 4.2828996-5.94153114 13.7625736-.14291419 21.3021097-.14291419 21.3021097Z" fill="url(#d)"/><path d="M11.8660211 48.3743096s8.7405326-21.0730284 32.0717549-21.4433648c-17.7350232 4.3205976.0290967 19.6378374.0290967 19.6378374s-14.0287234 12.7111189-32.1008516 1.8055274Z" fill="url(#e)"/><path d="M6.99959641 32.2202162S24.4574437 13.0165918 50.527832 26.2845469c-.4655559-3.607941-3.5497731-7.6814378-9.0780884-8.8452977-1.2220448-.5819257-10.1837464-14.43182348-29.4455641-6.459393 5.9256811.461387 8.4682656 1.291426 8.612541 1.9203488C10.369106 11.1390373 7.33148608 25.722572 6.99959641 32.2202162Z" fill="url(#f)"/><path d="M32.03706 15.9299212s4.4665322-1.5996384 5.0482196 3.1577417c-4.4042039.4155129-5.0482196-3.1577417-5.0482196-3.1577417Z" fill="#202020"/><path d="M9.2551104 52.1772666s7.6361082-24.9093105 33.1663186-25.8730411c0 0-20.7166787-3.7798413-35.34817197 19.3977044-.08112197 3.2790716 2.18185337 6.4753367 2.18185337 6.4753367Z" fill="url(#g)"/><path d="M12.0256021 10.9822724s6.3677384.3703449 8.6411954 1.9339868c.9492333-.1952797 1.7552122-.8451998 1.892222-1.7303694-.8145463-.337105-8.2702464-.9442903-10.5334174-.2036174Z" fill="url(#h)"/><path d="M7.05701562 32.2533371s7.97220928-9.5753699 24.06662038-10.719313c0 0-21.9094907.9901814-23.7487686 7.1768481-.5113449 1.4876671-.31785178 3.5424649-.31785178 3.5424649Z" fill="url(#i)"/></g></g></svg>`,
quote = `
<p>"The technology that Big Corps, Fortune 500 and Mozilla et al. want you to forget".</p>
<p>-- Alex J. Anderson</p>`,
htmlSettings = `
<div class="about-newspaper" id="page-settings">
<h1>Settings</h1>
<h2>Appearance</h2>
<p>Settings are saved instantly upon click.</p>
<table>
<!-- tr>
<td>
<span>Icon</span>
</td>
<td>
<span>
<input type="checkbox" name="hide-icon" id="hide-icon"/>
<label for="hide-icon">Disable Icon</label>
</span>
</td>
</tr -->
<!-- tr>
<td>
<span>Articles</span>
</td>
<td>
<span>
<input type="number" name="item-number" id="item-number" min="5" max="50"/>
<label>№</label>
</span>
<p>Maximum number of articles to display (5 - 50)</p>
</td>
</tr -->
<tr>
<td>
<span>Text Size</span>
</td>
<td>
<span>
<input type="number" name="font-size" id="font-size" min="20" max="35"/>
<label>px.</label>
</span>
</td>
</tr>
<tr>
<td>
<span>Font Style</span>
</td>
<td>
<span>
<select name="font-type" id="font-type">
<option value="system-ui">System Default</option>
<option value="arial">Arial</option>
<option value="sans">Sans</option>
<option value="serif">Serif</option>
<option value="tahoma">Tahoma</option>
</select>
</span>
</td>
</tr>
<tr>
<td>
<span for="view-mode">Mode</span>
</td>
<td>
<span>
<select name="view-mode" id="view-mode">
<option value="bright">Bright</option>
<option value="dark">Dark</option>
<!-- option value="sepia">Sepia</option -->
</select>
</span>
</td>
</tr>
<!-- tr>
<td>
<span>Content</span>
</td>
<td>
<span>
<select name="content" id="content">
<option value="none">None (Only Title)</option>
<option value="excerpt">Prefer Excerpt</option>
<option value="full">Prefer Complete</option>
<select>
</span>
</td>
</tr -->
<!-- tr>
<td>
<span>Stylesheet</span>
</td>
<td>
<span>
<select name="stylesheet" id="stylesheet">
<option value="blacklistednews">BlackListedNews</option>
<option value="waco">Davidian</option>
<option value="falkon">Falkon</option>
<option value="greasyfork">Greasy Fork</option>
<option value="msie">Internet Explorer</option>
<option value="minicss">mini.css</option>
<option value="openuserjs">OpenUserJS</option>
<option value="opera">Opera</option>
<option value="otter">Otter</option>
<option value="palemoon">Pale Moon</option>
<option value="pioneer">Pioneer</option>
<option value="qupzilla">QupZilla</option>
<option value="rubyridge">Ruby Ridge</option>
<option value="simplecss">Simple.css</option>
<option value="netscape">Netscape</option>
<option value="7css">Win7</option>
<option value="98css">Win9x (ReactOS)</option>
<option value="xpcss">WinXP</option>
<select>
</span>
</td>
</tr -->
<!-- tr>
<td>
<span>Podcast</span>
</td>
<td>
<span>
<input type="checkbox" name="play-enclosure" id="play-enclosure"/>
<label for="play-enclosure">Play Audio</label>
</span>
<span>
<input type="checkbox" name="disable-enclosure" id="disable-enclosure"/>
<label for="disable-enclosure">Disable Enclosures</label>
</span>
</td>
</tr>
<tr>
<td>
<span>Content</span>
</td>
<td>
<span>
<input type="checkbox" name="hide-content" id="hide-content"/>
<label for="hide-content">Content</label>
</span>
</td>
</tr>
<tr>
<td>
<span>Hide Media</span>
</td>
<td>
<span>
<input type="checkbox" name="hide-audio" id="hide-audio"/>
<label for="hide-audio">Audio</label>
</span>
<span>
<input type="checkbox" name="hide-image" id="hide-image"/>
<label for="hide-image">Image</label>
</span>
<span>
<input type="checkbox" name="hide-media" id="hide-media"/>
<label for="hide-media">Media</label>
</span>
<span>
<input type="checkbox" name="hide-video" id="hide-video"/>
<label for="hide-video">Video</label>
</span>
</td>
</tr -->
</table>
<h2>Content Control</h2>
<p>Control and filter contents.</p>
<table>
<tr>
<td>
<span>Filtering</span>
</td>
<td>
<span>
<input type="checkbox" name="filter" id="filter"/>
<label for="filter">Enable</label>
</span>
</td>
</tr>
<tr>
<td>
<span>Keywords</span>
</td>
<td>
<span>
<input type="text" name="keywords" id="keywords"/>
<label>(comma separates)</label>
</span>
</td>
</tr>
</table>
<p>Click reload to apply changes.</p>
<div id="buttons">
<button id="reload">Reload</button>
<button id="close">Return</button>
</div>
</div>`,
htmlSupport = `
<div class="about-newspaper" id="page-support">
<h1>Donations</h1>
<h2>No, thank you. Yet, I do appreciate your concern.</h2>
<p>Here are some things you can do instead, in no particular order…</p>
<ul>
<li>Talk with your friends about the benefits of RSS (i.e. Web Feeds). That would be a good table talk.</li>
<li>Use an RSS reader. (See list of programs in Help menu)</li>
<li>Teach other people to use RSS readers. Blog about RSS readers. And about other open web technologies and apps.</li>
<li>Write a blog instead of posting to “social networks”. (You can always re-post to those places if you want to extend your reach.) <a href="https://micro.blog/">Micro.blog</a> is one good place to get going, and it’s not the only one.</li>
<li>Contact <a href="http://unicode.org/pending/proposals.html"><u>unicode.org</u></a> and promote the initiative for the <a href="https://github.com/vhf/unicode-syndication-proposal"><u>Proposal to Include Web Syndication Symbol</u></a>.</li>
<li>Donate to charities that promote literacy.</li>
<li>Tell other people about cool blogs and feeds you’ve found.</li>
<li>Support independent podcast apps and desktop programs.</li>
<li>Support your local library.</li>
<li>Be bold and do your best work.</li>
<li>Support indie developers. Even though software like Falkon, Newspaper, postmarketOS etc. are free, software are most definitely not free to make, and it costs time and effort to keep improving them. It’s worth it.</li>
<li>Finally: report bugs and make feature requests on our Issues tracker. We also need testers, writers, and, especially, people who are willing to talk things over. Most of software development is just making decisions, and we appreciate all the help we can get!</li>
<li>Or: skip helping us, and, instead, help people who need help more than we do. Those people should not be hard to find.</li>
<li>Buy a meal to a person in need, or, even better, get a job for him or her.</li>
<li>Establish a family, or if you already are a father or a mother, bring a new healthy child to the world.</li>
<li>Get more ideas from <a href="https://github.com/Ranchero-Software/NetNewsWire/blob/main/Technotes/HowToSupportNetNewsWire.markdown#here-are-some-things-you-can-do">Ranchero-Software/NetNewsWire</a>.</li>
</ul>
<p>If you happen to visit in the Middle East, reach me out and we can meet for a café or tea.</p>
<p>Sharing is caring, and is exactly what makes us humans. It's "all of us for all of us" or we're on our own.</p>
<p>Schimon</p>
<div class="decor"></div>
<div class="quote">
<p>(The syndication technology behind ActivityPub, Atom and RSS is)</p>
<p>"The very simple technology that Big Corps, Fortune 500, Mozilla et al. are jealously trying to oppress and conceal from you";</p>
<p>"Because it unleashes the embodiment of what open web should really be, a truely free-speech-driven web."</p>
<p>"The problem, for them, is that if true openness would flourish, it might have the "dire" potential, at least for them, to put many of them off the market".</p>
<p>-- Alex J. Anderson</p>
</div>
<div id="buttons">
<button class="return-to-feed">Return</button>
</div>
</div>`,
htmlAbout = `
<div class="about-newspaper" id="page-about">
<!-- div id="buttons-custom">
<span class="button" id="back">❰ Table of Contents</span>
<span class="button" id="close">Return to Web Feed ❱</span>
</div -->
<div id="table-of-contents" class="segment">
<h1>Table Of Contents</h1>
<ul class="content" id="about-toc">
<li><a href="#intro">News Feeds And Their Benefits</a></li>
<li><a href="#feeds"><b>Subscribe To Feeds</b></a></li>
<li><a href="#software"><b>Get A Feed Reader</b></a></li>
<li><a href="#services-publish"><b>Speak Your Mind!</b></a></li>
<li><a href="#searx">Monitor Your Online Presence</a></li>
<li><a href="#services-feed">RSS Services And Software</a></li>
<li><a href="#learn">Historical Overview</a></li>
<li><a href="#xslt">The XSLT Technology</a></li>
<li><a href="#html5">The Trouble With CSS3 and JavaScript</a></li>
<li><a href="#plea">Appeal From The Author</a></li>
<li><a href="#matter"><b>Why Is RSS Matter So Much?</b></a></li>
<li><a href="#shame">Who Is Trying To Hide RSS And Why?</a></li>
<li><a href="#mozilla">Red Lizard Attacks And Shenanigans</a></li>
<li><a href="#advertising">The Case Against Advertisers</a></li>
<li><a href="#proof">Proving That RSS Is At A High Demand</a></li>
<li><a href="#alternative">What Are The Alternatives?</a></li>
<li><a href="#support">Learn How You Can Help</a></li>
<li><a href="#memory">To Mr. Anderson</a></li>
<li><a href="#resources">Useful Resources</a></li>
<li><a href="#disclaimer">Disclaimer</a></li>
<li><a href="#force">About Us</a></li>
</ul>
</div>
<div id="intro" class="segment">
<h2>TL;DR;</h2>
<p>Subscribing to a website RSS removes the need for the user to manually check the website for new content. Instead, their browser constantly monitors the site and informs the user of any updates. The browser can also be commanded to automatically download the new data for the user.</p>
<h1><span class="text-icon orange">RSS</span> In Short…</h1>
<h2>A Brief Introduction To A Time-saving Web Technology</h2>
<div class="content">
<p>RSS (Really Simple Syndication) is a way to get web-based content easily.</p>
<p>Users can collect RSS feeds from various sources in one place without visiting multiple websites.</p>
<p>RSS can include news articles, press releases, blog posts, and other changing content, including audio files (PodCasts), video files (VodCasts), and even BitTorrent files that would let your BitTorrent client to automaticlly download the latest of the latest as soon as it is published.</p>
<p>To retrieve RSS content, users can download feed readers or use web browsers that support RSS feeds.</p>
<p>Once a user subscribes to a feed, the RSS feed reader automatically checks for new content and organizes it in an easily readable format, keeping you updated with the latest news.</p>
</div>
<div>
<h1>📰 Web Syndication News Feeds</h1>
<!-- h2>The Works Of RSS: Simplified Explanation And Benefits</h2 -->
<h2>How RSS Works: Simplified Explanation And Benefits</h2>
<div class="content">
<p>Syndication feeds are a mean for content and media publishers to reach a wider audience easily. It allows you to receive information directly without the going from site to site.</p>
<p>Essentially, feeds, as a whole, embody a function that allows “Feed Readers” to access multiple websites, automatically looking for new contents and then posting the information about new contents and updates to another website, mobile app or desktop software at your office.</p>
<p>Feeds provide a simple way to keep up with the latest news, events, package and delivery status information posted on different websites such as news sites, music sites, content sites (aka “social networks”), torrent indexers, podcasts and <a href="#feeds" class="link"><u>more</u></a>; all, in one single spot.</p>
<p>In the hope that you would find this program useful; and in the hope that you would enjoy and get the most out of this program!</p>
<p>Read more on <a href="http://rss.userland.com/howUseRSS">How You Can Use RSS</a> and <a href="http://rss.userland.com/whyImportant">Why is RSS Important?</a> and <a href="https://marcus.io/blog/making-rss-more-visible-again-with-slash-feeds">Making RSS more accessible with a /feeds page</a>.</p>
</div>
</div>
<div id="who">
<h1>🤵 Who's Using Web Feeds And What For?</h1>
<h2>Learn How You Can Take Advantage of Web Feeds</h2>
<div class="content">
<p>Amongst web feed users are Accountants, Analysts, Engineers, Farmers, Government Ministries, Intelligence Agencies, Lawyers, Militaries, Parliaments, Police, Programmers, Publishers, Realtors, Reasearchers, Statisticians, Tribunals, Weather Stations, and many others.</p>
<p>And the uses are vast, to name just a few:</p>
<ul>
<li>Sharing Data and Information</li>
<li>Automating Torrent downloading</li>
<li>Communicating Information, including Mailing List archives</li>
<li>Managing ,Remote Controlling and Supervising IoT Peripherals</li>
<li>Publishing Blog posts and News updates, including urgent ones</li>
<li>Publishing Real Estate and Vacancy Boards</li>
<li>Forecasting and Monitoring the Weather</li>
<li>Receiving Search Engine Results</li>
<li>Monitoring Stock Market and Trade</li>
<li>Publishing Laws and Regulations</li>
<li>Publishing Court Decisions</li>
<li>Monitoring Inventory</li>
<li>Publishing Events</li>
<li>and so much more…</li>
</ul>
<p>Start Using Web Feeds, Today!</p>
</div>
</div>
</div>
<span class="decor"></span>
<!-- div><span>📗 Recommended Feeds</span -->
<!-- div><span>{ } <rss> Is Everywhere</span -->
<div id="feeds" class="segment">
<h1><span class="text-icon orange">RSS</span> Is Everywhere</h1>
<!-- h2>It is no secret that all the pros on the Internet make an extensive use of Web Feeds</h2 -->
<h2>It’s a Well-known Fact That The Internet Pros Extensively Leverage The Power Of Web Feeds To Stay Updated With The Latest Information and Trends</h2>
<div class="content">
<p>This is a list of feeds that should get you started with your news reader <a href="#software" class="link"><u>app or software</u></a>.</p>
<p>You can download this list as an <a id="opml-selection"><u>OPML</u></a> Outline file which can be imported into other feed readers.</p>
<p>The filetype formats of the feeds below are vary, from ActivityStreams and JSON to Atom and RDF, not only RSS.</p>
<p class="background center">Random news feed from <a class="feed-category"></a>: <b><a class="feed-url"></a></b></p>
<h3>Categories</h3>
<ul>
<li><a href="#art">Art, Literature & Photography</a></li>
<li><a href="#automation">Automation</a></li>
<li><a href="#blogroll">Blogroll & Webring</a></li>
<li><a href="#business">Business & Careers</a></li>
<li><a href="#entertainment">Comic, Entertainment, Games & Memes</a></li>
<li><a href="#events">Conferences & Events</a></li>
<li><a href="#cybersecurity">Cybersecurity, Data, IT & Privacy</a></li>
<li><a href="#data">Data & OSINT</a></li>
<li><a href="#forum">Discussions, Forums & Message Boards</a></li>
<li><a href="#diy">DIY (3D Modeling & Printing, Architecture and Crafting)</a></li>
<li><a href="#wiki">Documentation, Issue Trackers & WikiMedia</a></li>
<li><a href="#nature">Earth, History, Nature, Science & Weather</a></li>
<li><a href="#hacking">Electronics, Hardware & Robotics</a></li>
<li><a href="#family">Family, Fitness, Leisure & Travel</a></li>
<li><a href="#fantasy">Fantasy, Fiction & Pseudo-Science</a></li>
<li><a href="#news">Government, History, Media, Politics & World Affairs News</a></li>
<li><a href="#health">Health, Nutrition & Recipes</a></li>
<li><a href="#music">Music, Radio, Scores & Sound</a></li>
<li><a href="#radio">Podcasts & Radio</a></li>
<li><a href="#shopping">Product, Real Estate, Services, Shopping Reviews & Stores</a></li>
<li><a href="#activism">Social Action (Activism)</a></li>
<li><a href="#technology">Software, Guides, Reviews & Technology</a></li>
<li><a href="#package">Software Package Updates</a></li>
<li><a href="#project">Software Project Updates</a></li>
<li><a href="#syndication">Syndication & XML</a></li>
<li><a href="#telecom">Telecom, Mesh & Mix Protocols</a></li>
<li><a href="#torrents">Torrents</a></li>
<li><a href="#video">Videos</a></li>
</ul>
<p class="background center">Random news feed from <a class="feed-category"></a>: <b><a class="feed-url"></a></b></p>
<div class="category" id="art">
<h3>Art, Literature & Photography</h3>
<a href="https://4columns.org/feed">4Columns</a>
<a href="https://queue.acm.org/rss/feeds/latestitems.xml">ACM Queue</a>
<a href="https://annas-blog.org/rss.xml">Anna’s Blog</a>
<a href="https://audiobookbay.is/feed/atom/">AudioBook Bay</a>
<a href="https://barnesreview.org/feed/">Barnes Review</a>
<a href="https://www.kusc.org/feed/">Classical KUSC</a>
<a href="https://www.dafont.com/new.xml">DaFont</a>
<a href="http://davidkphotography.com/index.php?x=rss">David Kleinert Photography</a>
<a href="https://darksitefinder.com/feed/">Dark Site Finder</a>
<a href="https://tpb.party/rss/new/601">E-books (TPB)</a>
<a href="http://freedif.org/blog.atom">Freedif</a>
<a href="https://www.kb.nl/rss.xml">Galerij | Koninklijke Bibliotheek</a>
<a href="https://sacred-texts.com/rss/new.xml">ISTA - Internet Sacred Text Archive</a>
<a href="https://librivox.org/feed/">LibriVox News</a>
<a href="https://librivox.org/rss/latest_releases">LibriVox's New Releases</a>
<a href="https://onlinebooks.library.upenn.edu/newrss.xml">New Online Books</a>
<a href="https://www.nioc.eu/rss">Nioc Photos</a>
<a href="https://www.transformativeworks.org/feed/">Organization for Transformative Works</a>
<a href="https://www.brainyquote.com/link/quotebr.rss">Quotes</a>
<a href="https://zenfolio.com/feed">Ron Reyes Photography</a>
<a href="https://publicdomainreview.org/rss.xml">The Public Domain Review</a>
<a href="https://www.torrent911.me/rss/ebooks">Torrent911</a>
</div>
<div class="category" id="automation">
<h3>Automation</h3>
<a href="https://www.home-assistant.io/atom.xml">Home Assistant</a>
<a href="https://zapier.com/blog/feeds/latest/">Zapier</a>
</div>
<div class="category" id="blogroll">
<h3>Blogroll & Webring</h3>
<a href="https://nerdy.dev/rss.xml">Adam Argyle</a>
<a href="https://web.lewman.com/feed.xml">Andrew Lewman's Website</a>
<a href="https://momi.ca/feed.xml">Anjan Momi</a>
<a href="https://arantius.com/feed.rss">Anthony (Tony) Lieuallen</a>
<a href="https://automationrhapsody.com/feed/">Automation Rhapsody</a>
<a href="https://blog.stigok.com/feed.xml">blog of stigok</a>
<a href="https://carlschwan.eu/index.xml">Carl Schwan</a>
<a href="https://carlosbecker.com/index.xml">Carlos Becker</a>
<a href="https://copyblogger.com/feed/">Copyblogger</a>
<a href="https://denshi.org/index.xml">DenshiSite</a>
<a href="https://tilde.town/~dustin/index.xml">~dustin</a>
<a href="https://www.fivefilters.org/feed/">FiveFilters</a>
<a href="https://nu.federati.net/api/statuses/user_timeline/16.as">GeniusMusing (@geniusmusing)</a>
<a href="http://janwagemakers.be/">Jan Wagemakers</a>
<a href="https://kasesag.me/index.xml">kasesag</a>
<a href="https://len.ro/index.xml">len.ro</a>
<a href="https://nu.federati.net/api/statuses/user_timeline/2.as">LinuxWalt (@lnxw48a1)</a>
<a href="https://lukesmith.xyz/index.xml">Luke's Webpage</a>
<a href="http://www.aaronsw.com/2002/feeds/pgessays.rss">Paul Graham: Essays</a>
<a href="https://problogger.com/feed/">ProBlogger</a>
<a href="http://scripting.com/rss.xml">Scripting News</a>
<a href="http://schneegans.github.io/feed.xml">Simon Schneegans' Blog</a>
<a href="https://singpolyma.net/feed/action_stream/?full">Stephen Paul Weber</a>
<a href="https://www.susannaspencer.com/feed/">Susanna Spencer</a>
<a href="http://thedarnedestthing.com/atom.xml">the darnedest thing</a>
<a href="https://geniusmusing.com/feed/rss">The Random Thoughts of GeniusMusing</a>
<a href="https://thoughtcatalog.com/feed/">Thought Catalog</a>
<a href="https://tomblog.rip/feed/">Tomb Log</a>
<a href="http://truthstreammedia.com/feed/">Truthstream Media</a>
<a href="https://unixsheikh.com/feed.rss">unixsheikh.com</a>
<a href="https://waitbutwhy.com/feed">Wait But Why</a>
<a href="https://webring.xxiivv.com/#rss">Webring (index)</a>
<a href="https://willnorris.com/atom.xml">willnorris.com</a>
</div>
<div class="category" id="business">
<h3>Business & Careers</h3>
<a href="https://coderslegacy.com/feed/">CodersLegacy</a>
</div>
<div class="category" id="entertainment">
<h3>Comic, Entertainment, Games & Memes</h3>
<a href="https://abstrusegoose.com/atomfeed.xml">Abstruse Goose</a>
<a href="https://www.basicinstructions.net/basic-instructions?format=rss">Basic Instructions</a>
<a href="https://www.boredpanda.com/feed/">Bored Panda</a>
<a href="http://cdrom.ca/feed.xml">CD-ROM Journal</a>
<a href="https://www.crossfire.nu/feed/journals">Crossfire Journals</a>
<a href="https://www.crossfire.nu/feed/news">Crossfire News</a>
<a href="https://www.demilked.com/feed/">DeMilked</a>
<a href="https://dieselsweeties.com/ds-unifeed.xml">Diesel Sweeties</a>
<a href="https://www.dsogaming.com/feed/">DSOGaming</a>
<a href="https://www.gamingonlinux.com/article_rss.php">GamingOnLinux</a>
<a href="https://handheldgameconsoles.com/f.atom">Handheld Game Consoles</a>
<a href="https://itch.io/blog.rss">itch.io</a>
<!-- a href="https://joyreactor.com/rss">JoyReactor</a -->
<!-- a href="https://joyreactor.cc/rss">JoyReactor (RU)</a -->
<a href="https://lichess.org/blog.atom">Lichess</a>
<a href="https://mindblur.thecomicseries.com/rss/">Mindblur</a>
<a href="https://rss.moddb.com/headlines/feed/rss.xml">Mod DB</a>
<a href="https://pikabu.ru/xmlfeeds.php?cmd=popular">pikabu.ru</a>
<a href="https://readcomicsonline.ru/feed">Read Comics Online</a>
<a href="https://revive.thecomicseries.com/rss/">Revive</a>
<a href="https://pbfcomics.com/feed/">The Perry Bible Fellowship</a>
<a href="https://toothpastefordinner.com/rss/rss.php">Toothpaste For Dinner</a>
<a href="https://xkcd.com/atom.xml">xkcd</a>
</div>
<div class="category" id="events">
<h3>Conferences & Events</h3>
<a href="https://bsd.network/@bsdcan.rss">BSDCan</a>
<a href="https://about.cocalc.com/feed/">CoCalc</a>
<a href="https://datacarpentry.org/feed">Data Carpentry</a>
<a href="https://defcon.org/defconrss.xml">DEF CON</a>
<a href="https://fosdem.org/atom.xml">FOSDEM</a>
<a href="https://joinmobilizon.org/en/news/feed.xml">Mobilizon</a>
<a href="https://mastodon.social/@pgcon.rss">PGCon</a>
<a href="http://www.redheadconvention.ie/?feed=atom" title="Irish Red Head Convention in aid of Irish Cancer Society, Crosshaven, Co. Cork.">Irish Red Head Convention</a>
</div>
<div class="category" id="cybersecurity">
<h3>Cybersecurity, IT & Privacy</h3>
<a href="https://www.404media.co/rss/">404 Media</a>
<a href="https://abovephone.com/feed/">Above Phone</a>
<a href="https://www.bleepingcomputer.com/feed/">Bleeping Computer</a>
<a href="https://cocalc.com/news/rss.xml">CoCalc</a>
<a href="https://www.comparitech.com/feed/">Comparitech</a>
<a href="https://cyberscoop.com/feed/">CyberScoop</a>
<a href="https://dataoverhaulers.com/feed/">Data Overhaulers</a>
<a href="https://decrypt.fail/feed/">decrypt[.]fail</a>
<a href="https://www.fastly.com/blog_rss.xml">Fastly Blog</a>
<a href="https://www.hackread.com/feed/">HackRead</a>
<a href="https://news.ycombinator.com/rss">Hacker News</a>
<a href="https://nakedsecurity.sophos.com/feed/">Naked Security</a>
<a href="https://www.privacytools.io/guides/rss.xml">Privacy Guides</a>
<a href="https://privacysavvy.com/feed/">PrivacySavvy</a>
<a href="https://www.rapidseedbox.com/feed">RapidSeedbox</a>
<a href="https://reclaimthenet.org/feed/">Reclaim The Net</a>
<a href="https://restoreprivacy.com/feed/">Restore Privacy</a>
<a href="https://fosstodon.org/@RTP.rss">(RTP) Privacy and Tech Tips</a>
<a href="https://www.schneier.com/feed/">Schneier on Security</a>
<a href="http://scripting.com/rss.xml">Scripting News</a>
<a href="https://securityintelligence.com/feed/">Security Intelligence</a>
<a href="https://simpleit.rocks/index.xml">Simple IT Rocks</a>
<a href="https://simplifiedprivacy.com/feed/">Simplified Privacy</a>
<a href="https://rss.slashdot.org/Slashdot/slashdotIt">Slashdot: IT</a>
<a href="https://takebackourtech.org/rss/">Take Back Our Tech</a>
<a href="https://taosecurity.blogspot.com/feeds/posts/default">TaoSecurity</a>
<a href="https://proton.me/blog/feed">The Proton Blog</a>
<a href="https://torrentfreak.com/feed/">TorrentFreak</a>
<a href="https://venturebeat.com/feed/">VentureBeat</a>
</div>
<div class="category" id="data">
<h3>Data & OSINT</h3>
<a href="https://www.jcchouinard.com/feed/">JC Chouinard</a>
<a href="https://www.northdata.com/feed.rss?global=true">North Data</a>
<a href="https://blog.northdata.com/rss.xml">North Data Blog</a>
<!-- a href="https://opencorporates.com/feed/">OpenCorporates</a -->
</div>
<div class="category" id="forum">
<h3>Discussions, Forums & Message Boards</h3>
<div class="subcategory">
<h4>Art, Literature and Music</h4>
<a href="https://forum.librivox.org/app.php/feed">LibriVox</a>
<a href="https://community.metabrainz.org/posts.rss">MusicBrainz</a>
<a href="https://www.usingenglish.com/forum/forums/-/index.rss">UsingEnglish.com</a>
</div>
<div class="subcategory">
<h4>Automation</h4>
<a href="https://community.home-assistant.io/posts.rss">Home Assistant</a>
<a href="https://forum.fhem.de/index.php?action=.xml;type=atom">FHEM</a>
</div>
<div class="subcategory">
<h4>Computer</h4>
<a href="https://community.e.foundation/posts.rss">/e/OS community</a>
<a href="https://arcolinux.com/feed/">ArcoLinux</a>
<a href="https://www.armbian.com/feed/">Armbian</a>
<a href="https://www.antixforum.com/feed/">antiX Linux</a>
<a href="https://bbs.archlinux.org/extern.php?action=feed&type=atom&limit=20">Arch Linux</a>
<a href="https://forum.artixlinux.org/index.php?action=.xml&type=atom&limit=20">Artix Linux</a>
<a href="https://gitlab.com/divested-mobile.atom">DivestOS Mobile</a>
<a href="https://forums.docker.com/posts.rss">Docker Community Forums</a>
<a href="https://forum.endeavouros.com/posts.rss">EndeavourOS</a>
<a href="https://forums.freebsd.org/forums/-/index.rss">FreeBSD</a>
<a href="https://forum.garudalinux.org/posts.rss">Garuda Linux</a>
<a href="https://discourse.gnome.org/posts.rss">GNOME</a>
<a href="https://forums.kali.org/external.php?type=RSS2">Kali Linux</a>
<a href="http://board.kolibrios.org/app.php/feed">KolibriOS (FASM)</a>
<a href="https://linux.org/articles/index.rss">Linux.org</a>
<a href="https://forum.linux-hardware.org/index.php?action=.xml&type=atom&limit=20">Linux Hardware Review</a>
<a href="https://forum.mxlinux.org/feed">MX Linux</a>
<a href="https://discourse.nixos.org/posts.rss">NixOS</a>
<a href="https://labs.parabola.nu/projects/parabola-community-forum/boards/4.atom">Parabola Community Forum</a>
<a href="https://www.pclinuxos.com/forum/index.php?type=atom&action=.xml">PCLinuxOS</a>
<a href="https://forum.pine64.org/syndication.php?type=atom1.0">PINE64</a>
<a href="https://www.psx-place.com/forums/-/index.rss">PSX-Place</a>
<a href="https://sourceforge.net/p/rescuezilla/activity/feed">Rescuezilla (activity)</a>
<a href="https://sourceforge.net/p/rescuezilla/discussion/feed.rss">Rescuezilla (discussion)</a>
<a href="https://reactos.org/forum/app.php/feed">ReactOS</a>
<a href="https://www.riscosopen.org/forum/posts.rss">ROOL Forum (RISC OS Open)</a>
<a href="https://www.portablefreeware.com/forums/app.php/feed">The Portable Freeware Collection Forums</a>
<a href="https://thinkpad-forum.de/forums/-/index.rss">ThinkPad-Forum.de</a>
<a href="http://usa.x10host.com/mybb/syndication.php?type=atom1.0">UserScripts Archive</a>
<a href="https://forum.xda-developers.com/f/-/index.rss">XDA Developers</a>
</div>
<div class="subcategory">
<h4>DIY and Household</h4>
<a href="https://www.diychatroom.com/forums/-/index.rss">DIY Home Improvement</a>
<a href="https://www.doityourself.com/forum/external.php?type=RSS2">DoItYourself.com</a>
<a href="https://houserepairtalk.com/forums/-/index.rss">Home Improvement, Remodeling & Repair</a>
</div>
<div class="subcategory">
<h4>Games and Multimedia</h4>
<a href="https://discourse.ardour.org/posts.rss">Ardour</a>
<a href="http://stream-recorder.com/forum/external.php?type=RSS2">Audio/video stream recording forums</a>
<a href="https://www.crossfire.nu/feed/threads">Crossfire</a>
<a href="https://www.gamingonlinux.com/forum_rss.php">GamingOnLinux</a>
<a href="https://www.head-fi.org/forums/-/index.rss">Head-Fi</a>
<a href="https://hydrogenaud.io/index.php?action=.xml;type=atom;limit=20">HydrogenAudio</a>
<a href="https://forums.libretro.com/posts.rss">Libretro</a>
<a href="https://obsproject.com/forum/list/-/index.rss">OBS</a>
<a href="http://forums.dumpshock.com/index.php?act=rssout&id=1">Shadowrun Discussion</a>
<a href="https://www.vogons.org/feed">VOGONS</a>
<a href="https://forum.zdoom.org/app.php/feed">ZDoom</a>
</div>
<div class="subcategory">
<h4>Miscellaneous</h4>
<a href="https://discourse.asciinema.org/posts.rss">asciinema</a>
<a href="https://www.happiness.com/rss/1-happinesscom-magazine.xml/">Happiness and Meditation</a>
<a href="https://forum.invoiceninja.com/posts.rss">Invoice Ninja</a>
<a href="https://www.solveforum.com/forums/forums/-/index.rss">SolveForum</a>
<a href="https://www.stormfront.org/forum/external.php?type=RSS2">Stormfront</a>
<a href="https://sqlite.org/forum/timeline.rss">SQLite</a>
<a href="https://zigforums.com/xml/feed.rss">Zig</a>
</div>
<div class="subcategory">
<h4>Nature</h4>
<a href="https://www.climate-debate.com/feeds/threads.php" title="Earth is not a globe. There is no weather crisis.">Climate Debate</a>
<a href="https://ifers.forumotion.com/feed/?type=atom" title="Yes. You and I are living on an enclosed horizontal plane. Do not use the word 'Flat'. The word 'Flat' is a bad reference to our horizontal and level earth. The phrase 'Flat Earth' was intentionally made over the years in order to retract you from looking into this matter.">IFERS (Horizontal and Level Earth)</a>
</div>
<div class="subcategory">
<h4>Network, Privacy and Security</h4>
<a href="https://community.bitwarden.com/posts.rss">Bitwarden</a>
<a href="https://discourse.mailinabox.email/posts.rss">Mail-in-a-Box</a>
<a href="https://discuss.privacyguides.net/posts.rss">Privacy Guides</a>
<a href="https://smf.rantradio.com/index.php?type=atom;action=.xml">RantMedia Forum</a>
</div>
<div class="subcategory">
<h4>Telecommunication</h4>
<a href="https://community.asterisk.org/posts.rss">Asterisk</a>
<a href="https://meta.getaether.net/posts.rss">Meta Aether</a>
<a href="http://i2pforum.i2p/app.php/feed">I2P support</a>
<a href="https://discuss.ipfs.tech/posts.rss">IPFS Forums</a>
<a href="https://forum.jami.net/posts.rss">Jami</a>
<a href="https://community.jitsi.org/posts.rss">Jitsi</a>
<a href="https://forum.tribler.org/latest.rss">Tribler</a>
</div>
</div>
<div class="category" id="diy">
<h3>DIY (3D Modeling & Printing, Architecture and Crafting)</h3>
<a href="https://all3dp.com/feed/newsfeed">All3DP</a>
<a href="http://tracker2.postman.i2p/?view=RSS&mapset=85701">Cad/3D Printing</a>
<a href="https://designoptimal.com/feed/">DesignOptimal</a>
<a href="https://www.doityourself.com/feed">Doityourself.com</a>
<a href="https://www.elementalchile.cl/en/feed/">Elemental</a>
<a href="https://www.familyhandyman.com/feed/">Family Handyman</a>
<a href="https://www.mom-on-a-mission.blog/all-posts?format=rss">Mom on a Mission</a>
<a href="https://www.opensourceecology.org/feed/">Open Source Ecology</a>
<a href="https://tpb.party/rss/new/605">Physibles (TPB)</a>
<a href="http://yorik.uncreated.net/feed">Yorik's blog</a>
</div>
<div class="category" id="wiki">
<h3>Documentation, Issue Trackers & WikiMedia</h3>
<a href="https://wiki.alpinelinux.org/w/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">Alpine Linux</a>
<a href="https://wiki.archlinux.org/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">ArchWiki</a>
<a href="https://sourceforge.net/p/aros/activity/feed">AROS Research Operating System</a>
<a href="https://sourceforge.net/p/butt/activity/feed">Broadcast Using This Tool</a>
<a href="https://www.coreboot.org/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">coreboot</a>
<a href="https://doomwiki.org/w/api.php?hidebots=1&days=7&limit=50&hidecategorization=1&action=feedrecentchanges&feedformat=atom">DoomWiki.org</a>
<a href="https://wiki.greasespot.net/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">GreaseSpot Wiki</a>
<a href="https://indieweb.org/wiki/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">IndieWeb</a>
<a href="https://community.kde.org/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">KDE Community</a>
<a href="https://userbase.kde.org/api.php?hidebots=1&translations=filter&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">KDE UserBase</a>
<a href="http://websvn.kolibrios.org/rss.php?repname=Kolibri+OS&path=%2F&isdir=1&">Kolibri OS</a>
<a href="https://linux-sunxi.org/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">linux-sunxi.org</a>
<a href="http://source.netsurf-browser.org/netsurf.git/atom/?h=master">NetSurf Browser</a>
<a href="https://wiki.postmarketos.org/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">postmarketOS</a>
<a href="https://sourceforge.net/p/rescuezilla/activity/feed">Rescuezilla</a>
<a href="https://gitlab.riscosopen.org/RiscOS.atom">RiscOS activity</a>
<a href="https://www.riscosopen.org/tracker/rss/tickets">ROOL Tracker</a>
<a href="https://sourceforge.net/p/salix/activity/feed">Salix OS</a>
<a href="https://wiki.syslinux.org/wiki/api.php?hidebots=1&days=7&limit=50&hidecategorization=1&action=feedrecentchanges&feedformat=atom">Syslinux</a>
<a href="https://mirror.git.trinitydesktop.org/cgit/tde/atom/?h=master">Trinity Desktop Environment (tde, branch master)</a>
<a href="https://bugs.trinitydesktop.org/buglist.cgi?query_format=advanced&title=Bug%20List&ctype=atom">Trinity Bug List</a>
<a href="https://wiki.trinitydesktop.org/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">Trinity Desktop Project</a>
<a href="https://wikispooks.com/w/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">Wikispooks</a>
<a href="https://wiki.znc.in/api.php?hidebots=1&urlversion=1&days=7&limit=50&action=feedrecentchanges&feedformat=atom">ZNC</a>
</div>
<div class="category" id="nature">
<h3>Earth, History, Nature, Science & Weather</h3>
<a href="https://ericdubay.wordpress.com/feed/">EricDubay.com</a>
<a href="https://www.geograph.org.uk/discuss/syndicator.php?forum=1&first=1">Geograph</a>
<a href="https://www.nhc.noaa.gov/aboutrss.shtml">National Hurricane Center And
Central Pacific Hurricane Center</a>
<a href="https://www.weather.gov/rss_page.php?site_name=nws">National Weather Service</a>
<a href="https://roaring.earth/feed/">Roaring Earth</a>
<a href="https://www.rockandice.com/feed/">Rock and Ice Magazine</a>
<a href="http://www.rssweather.com/">RSS Weather</a>
<a href="http://www.atlanteanconspiracy.com/feeds/posts/default">The Atlantean Way</a>
<a href="https://vetclassics.com/feed/">VETCLASSICS</a>
</div>
<div class="category" id="hacking">
<h3>Electronics, Hardware & Robotics</h3>
<a href="https://baylibre.com/feed/">BayLibre</a>
<a href="https://www.c0ffee.net/rss/">c0ffee</a>
<a href="https://www.ccc.de/de/rss/updates.xml">Chaos Computer Club</a>
<a href="https://www.complete.org/index.xml">complete.org</a>
<a href="https://crlf.link/feed.xml">&Cr; &Lf</a>
<a href="http://dangerousprototypes.com/blog/feed/">Dangerous Prototypes</a>
<a href="https://pyra-handheld.com/boards/forums/-/index.rss">DragonBox (Pyra and Pandora)</a>
<a href="https://dojofordrones.com/feed/">Drone Dojo</a>
<a href="https://electro.pizza/feed.xml">electro·pizza</a>
<a href="https://blog.flipperzero.one/rss/">Flipper Zero Blog</a>
<a href="https://www.getdroidtips.com/feed/">Get Droid Tips</a>
<a href="https://homehack.nl/feed/">HomeHack</a>
<a href="https://knuxify.github.io/blog/feed.xml">knuxify’s blog</a>
<a href="https://louwrentius.com/feed/all.atom.xml">Louwrentius</a>
<a href="https://mansfield-devine.com/speculatrix/feed/">Machina Speculatrix</a>
<a href="http://moderntoil.com/?feed=rss2">Modern Toil</a>
<a href="https://n-o-d-e.net/rss/rss.xml">N O D E</a>
<a href="https://notenoughtech.com/feed/">NotEnoughTECH</a>
<a href="https://mastodon.social/@olimex.rss">Olimex</a>
<a href="https://www.open-electronics.org/feed/atom/">Open Electronics</a>
<a href="https://pimylifeup.com/feed/">Pi My Life Up</a>
<a href="https://raspberrytips.com/feed/">RaspberryTips</a>
<a href="https://rfidresearchgroup.com/feed/">RFID Research Group</a>
<a href="https://smartbuilds.io/feed/">SmartBuilds</a>
<a href="https://www.thedronegirl.com/feed/">The Drone Girl</a>
<a href="https://webring.xxiivv.com/#rss">Webring (index)</a>
<a href="https://wellerpcb.com/feed/">Weller PCB</a>
<a href="https://xnux.eu/rss.xml">xnux.eu</a>
</div>
<div class="category" id="family">
<h3>Family, Fitness, Leisure & Travel</h3>
<a href="https://www.baldandbeards.com/feed/">Bald & Beards</a>
<a href="https://blastaloud.com/feed/atom/">BlastAloud</a>
<a href="https://dailyurbanista.com/feed/atom/">Daily Urbanista</a>
<a href="https://divinelifestyle.com/feed/">Divine Lifestyle</a>
<a href="https://expertvagabond.com/feed/">Expert Vagabond</a>
<a href="https://www.girlschase.com/rss.xml">Girls Chase</a>
<a href="https://gmb.io/feed/">GMB Fitness</a>
<a href="http://www.elizabethfoss.com/journal?format=rss">In The Heart of My Home</a>
<a href="https://latest-fashion-tips.com/feed/">Latest Fashion Tips</a>
<a href="https://www.lifeadvancer.com/feed/">Life Advancer</a>
<a href="https://www.mom-on-a-mission.blog/all-posts?format=rss">Mom on a Mission</a>
<a href="https://rebelliousdevelopment.com/feed">Rebellious Development</a>
<a href="https://www.artofmanliness.com/feed/">The Art of Manliness</a>
<a href="https://thebaldbrothers.com/feed/">The Bald Brothers</a>
<a href="https://theeverygirl.com/feed/">The Everygirl</a>
<a href="https://thefrugalgirls.com/feed">The Frugal Girls</a>
<a href="https://trip101.com/feed">Trip101</a>
</div>
<div class="category" id="fantasy">
<h3>Fantasy, Fiction & Pseudo-Science</h3>
<p>The following websites are manipulative disinformation websites that mostly contain large amounts of AI and CGI type of images, and do not provide verifiable proofs to their fabricated and made up claims.</p>
<a href="https://blog.discoveryeducation.com/feed/">Discovery Indoctrination Blog</a>
<a href="https://futurism.com/feed">Futurism</a>
<a href="https://www.nasa.gov/feeds/iotd-feed" title="SA(T)AN">NASA</a>
<a href="https://www.nature.com/nature.rss">Nature</a>
<a href="https://www.sciencealert.com/feed">ScienceAlert</a>
<a href="https://www.sciencedaily.com/rss/all.xml">ScienceDaily</a>
<a href="https://scitechdaily.com/feed/">SciTechDaily</a>
<a href="https://storiesbywilliams.com/feed/">Stories by Williams</a>
</div>
<div class="category" id="news">
<h3>Government, His-story, Media, Politics & World Affairs News</h3>
<a href="https://www.blacklistednews.com/rss.php">BlackListed News</a>
<a href="http://cafe.nfshost.com/?feed=atom">CAFE</a>
<a href="https://www.historiography-project.org/feed/">Clippings and Commentary</a>
<a href="https://www.cryptogon.com/?feed=atom">cryptogon</a>
<a href="https://mastodon.social/@Cryptome.rss">Cryptome</a>
<a href="https://www.spiegel.de/international/index.rss">DER SPIEGEL</a>
<a href="https://fakeologist.com/feed/">Fakeologist</a>
<a href="https://www.icij.org/feed/">International Consortium of Investigative Journalists</a>
<a href="https://www.irishexaminer.com/feed/35-top_news.xml">Irish Examiner</a>
<a href="https://leohohmann.com/feed/">Leo Hohmann</a>
<a href="https://www.medialens.org/feed/">Media Lens</a>
<a href="https://api.ntd.com/feed">NTD Television</a>
<a href="https://off-guardian.org/feed/">OffGuardian</a>
<a href="https://pjnewsletter.com/feed">Patriot Journal</a>
<a href="https://www.presstv.ir/rss.xml">Press TV</a>
<a href="https://presswatchers.org/feed/">Press Watch</a>
<a href="https://redice.tv/rss/news">Red Ice News</a>
<a href="https://rmx.News/feed/">Remix News</a>
<a href="https://www.rt.com/rss/">RT (Russia Today)</a>
<a href="https://seymourhersh.substack.com/feed">Seymour Hersh</a>
<a href="https://rss.slashdot.org/Slashdot/slashdotMain">Slashdot</a>
<a href="https://stevekirsch.substack.com/feed">Steve Kirsch</a>
<a href="https://stewpeters.com/feed/">Stew Peters</a>
<a href="https://strategicinvestment.com/page/str/rssfeed.xml">Strategic Investment</a>
<a href="https://sandrafinley.ca/blog/?feed=rss2">The Battles</a>
<a href="https://canadianpatriot.org/feed/">the Canadian patriot</a>
<a href="https://theconsciousresistance.com/feed/">The Conscious Resistance Network</a>
<a href="https://dailysceptic.org/feed/">The Daily Sceptic</a>
<a href="https://www.dailywire.com/feeds/rss.xml">The Daily Wire</a>
<a href="https://www.thegatewaypundit.com/feed/">The Gateway Pundit</a>
<a href="https://www.interpretermag.com/feed/">The Interpreter</a>
<a href="http://themostimportantnews.com/feed">The Most Important News</a>
<a href="https://www.theorganicprepper.com/feed/">The Organic Prepper</a>
<a href="https://thepeoplesvoice.tv/feed/">The People's Voice</a>
<a href="http://truthstreammedia.com/feed/">Truthstream Media</a>
<a href="https://unlimitedhangout.com/feed/">Unlimited Hangout</a>
<a href="https://www.veteranstoday.com/feed/">VT Foreign Policy</a>
</div>
<div class="category" id="health">
<h3>Health, Nutrition & Recipes</h3>
<a href="https://www.101cookbooks.com/feed">101 Cookbooks</a>
<a href="https://www.asweetpeachef.com/feed/">A Sweet Pea Chef</a>
<a href="https://www.annalenashearthbeat.com/feed/">Annalena's Heart(h)beat</a>
<a href="https://askannamoseley.com/feed/">Ask Anna</a>
<a href="https://www.bonappetit.com/feed/rss">Bon Appétit</a>
<a href="https://cooknourishbliss.com/feed/">Cook Nourish Bliss</a>
<a href="https://www.easycookingwithmolly.com/feed/">Easy Cooking with Molly</a>
<a href="http://www.easypeasyjapanesey.com/blogeasypeasyjapanesey?format=rss">Easy Peasy Japanesey</a>
<a href="https://farmersforum.com/feed/">Farmers Forum</a>
<!--a href="https://fathub.org/feed/">FatHub</a-->
<a href="http://foodly.com/feed/">Foodly</a>
<a href="https://freezedryguy.com/feed/">Freeze Dry Guy</a>
<a href="https://heathenherbs.com/feed/">Heathen Herbs</a>
<a href="https://www.healthyandnaturalworld.com/feed/">Healthy and Natural World</a>
<a href="https://www.jamieoliver.com/feed/">Jamie Oliver</a>
<a href="https://jacobwsmith.xyz/cookbook/rss.xml">Jacob's Guide to Possibly Delicious Food</a>
<a href="https://juicing-for-health.com/feed">Juicing for Health</a>
<a href="https://www.loveandlemons.com/feed/">Love & Lemons</a>
<a href="https://articles.mercola.com/sites/articles/rss.aspx">Mercola.com</a>
<a href="https://www.mindful.org/feed/">Mindful</a>
<a href="https://themythicbox.com/feed/">Mythic food</a>
<a href="https://nutritionaustralia.org/category/recipes/feed/">Nutrition Australia</a>
<a href="https://pinchofyum.com/feed">Pinch of Yum</a>
<a href="https://plantbasedwithamy.com/feed/">Plant Based with Amy</a>
<a href="https://punchdrink.com/feed/">PUNCH</a>
<a href="https://www.marginalia.nu/recipes/index.xml">Recipes on marginalia.nu</a>
<a href="https://recipeswitholiveoil.com/feed/">Recipes With Olive Oil</a>
<a href="https://sallysbakingaddiction.com/feed/">Sally's Baking Addiction</a>
<a href="https://www.sheknows.com/food-and-recipes/feed/">SheKnows</a>
<a href="https://steptohealth.com/feed/">Step To Health</a>
<a href="https://stevekirsch.substack.com/feed">Steve Kirsch</a>
<a href="https://stopdirtyelectricity.com/feed/">Stop Dirty Electricity</a>
<a href="https://thegreenloot.com/feed/">The Green Loot</a>
<a href="https://theprettybee.com/feed/">The Pretty Bee</a>
<a href="https://traditionalcookingschool.com/feed/">Traditional Cooking School</a>
<a href="https://wonderfulcook.com/feed/">Wonderful Cook</a>
</div>
<div class="category" id="music">
<h3>Music, Radio, Scores & Sound</h3>
<a href="https://320kbpshouse.net/feed">320KBPSHOUSE</a>
<a href="https://acidstag.com/feed/">Acid Stag</a>
<a href="https://www.free-scores.com/rss/fluxrss-uk.xml">Free-Scores</a>
<a href="https://www.frostclick.com/wp/index.php/feed/">FrostClick</a>
<a href="https://www.homemusicproducer.com/rsslatest.xml">Home Music Producer</a>
<a href="https://imslp.org/wiki/Special:IMSLPRecordingsFeed/atom">IMSLP Recent Recordings</a>
<a href="https://www.indiegamemusic.com/rss.php?f=1">IndieGameMusic</a>
<a href="https://intmusic.net/feed">IntMusic</a>
<a href="https://itopmusicx.com/feed/">iTOPMUSICX</a>
<a href="https://downloads.khinsider.com/rss">KHInsider Video Game Music</a>
<a href="https://legismusic.com/feed/">Legis Music</a>
<a href="https://losslessclub.com/atom.php">LosslessClub</a>
<a href="https://www.musicaustria.at/feed/">mica – music austria</a>
<a href="https://nfodb.ru/rss.php">MP3 NFO Database</a>
<a href="https://tpb.party/rss/new/101">Music (TPB)</a>
<a href="https://musicrider.org/feed/">Music Rider</a>
<a href="https://www.music-scores.com/blog/feed/">Music Scores Blog</a>
<a href="https://losslessalbums.club/rss.xml">New lossless albums</a>
<a href="https://rss.ngfiles.com/latestsubmissions.xml">Newgrounds</a>
<a href="https://rss.ngfiles.com/weeklyaudiotop5.xml">Newgrounds (Weekly Top 5)</a>
<a href="https://opengameart.org/rss.xml">OpenGameArt</a>
<a href="https://phish.in/feeds/rss">Phish.in</a>
<a href="https://www.playonloop.com/feed/">PlayOnLoop</a>
<a href="https://www.radioking.com/blog/feed/">RadioKing Blog</a>
<a href="https://secondhandsongs.com/rss/new.xml">Second Hand Songs</a>
</div>
<div class="category" id="radio">
<h3>Podcasts & Radio</h3>
<a href="https://media.ccc.de/podcast.xml">CCC (Chaos Computer Club)</a>
<a href="https://files.manager-tools.com/files/public/feeds/career_tools_podcasts.xml">Career Tools</a>
<a href="https://clownfishtv.com/feed/">CFTV (ClownfishTV)</a>
<a href="https://feeds.megaphone.fm/darknetdiaries">Darknet Diaries</a>
<a href="https://fakeologist.com/blog/category/audio/fakeologistshow/feed/">Fakeologist Show</a>
<a href="http://hackerpublicradio.org/hpr_spx_rss.php">Hacker Public Radio</a>
<a href="https://www.iceagefarmer.com/feed/">Ice Age Farmer</a>
<a href="https://jameshfetzer.org/feed/">James H. Fetzer</a>
<a href="http://larkenrose.com/?format=feed">Larken Rose</a>
<a href="https://files.manager-tools.com/files/public/feeds/manager-tools-podcasts.xml">Manager Tools</a>
<a href="https://mediamonarchy.com/feed/podcast/">Media Monarchy</a>
<a href="https://feed.podbean.com/ediviney/feed.xml">Midwest Vegan Radio</a>
<a href="http://www.opensourcetruth.com/feed/">Open Source Truth</a>
<a href="https://optoutpod.com/index.xml">Opt Out</a>
<a href="https://www.osnews.com/feed/podcast/">OSnews</a>
<a href="https://rss.podomatic.net/rss/peacerevolution.podomatic.com/rss2.xml">Peace Revolution</a>
<a href="https://www.pine64.org/feed/mp3/">PineTalk</a>
<a href="https://cast.postmarketos.org/feed.rss">postmarketOS</a>
<a href="https://redice.tv/rss/radio-3fourteen">Radio 3Fourteen</a>
<a href="https://www.reallibertymedia.com/category/podcasts/feed/?redirect=no">Real Liberty Media</a>
<a href="https://redice.tv/rss/red-ice-radio">Red Ice Radio</a>
<a href="https://redice.tv/rss/red-ice-tv">Red Ice TV</a>
<a href="http://revolutionradio.org/feed/">Revolution Radio</a>
<a href="https://feed.podbean.com/rightonradio/feed.xml">Right on Radio</a>
<a href="https://roaring.earth/category/podcast/feed/">Roaring Earth</a>
<a href="https://shrinkrapradio.com/feed/">Shrink Rap Radio</a>
<a href="https://speakfreeradio.com/feed/">Speak Free Radio</a>
<a href="https://www.corbettreport.com/feed/">The Corbett Report</a>
<a href="https://www.thehighersidechats.com/feed/">The Higherside Chats</a>
<a href="https://robbwolf.com/feed/">The Paleo Diet</a>
<a href="http://truthstreammedia.com/feed/">Truthstream Media</a>
</div>
<div class="category" id="shopping">
<h3>Product, Real Estate, Services, Shopping Reviews & Stores</h3>
<a href="https://www.alohakb.com/collections/all.atom">ALOHAKB</a>
<a href="https://www.cambodiaproperty.info/feed/">Cambodia Property</a>
<a href="https://faddis.com/feed">Faddis Concrete</a>
<a href="https://www.fanlesstech.com/feeds/posts/default">FanlessTech</a>
<a href="https://fincadracula.com/en/feed/">Finca Drácula</a>
<a href="https://fossbytes.com/feed/">Fossbytes</a>
<a href="https://www.gearrice.com/web-stories/feed/">Gearrice</a>
<a href="https://www.geartaker.com/feed/">Gear Taker</a>
<a href="https://www.geniatech.com/products/embedded-mainboards/feed/">Geniatech</a>
<a href="https://www.gizmochina.com/feed/">Gizmochina</a>
<a href="https://www.guru3d.com/articles_rss">Guru of 3D</a>
<a href="https://www.headfonia.com/feed/">Headfonia</a>
<a href="https://headfonics.com/feed/">Headfonics</a>
<a href="https://headphone.guru/feed/">Headphone Guru</a>
<a href="https://kbdfans.com/collections/all.atom">KBDfans® Mechanical Keyboards Store</a>
<a href="https://lab401.com/collections/flipper-zero.atom">Lab401</a>
<a href="https://liliputing.com/feed/">Liliputing</a>
<a href="https://www.megabites.com.ph/feed/">MegaBites</a>
<a href="https://www.mouser.com/rss/rss.xml">Mouser Electronics Inc.</a>
<a href="https://newatlas.com/index.rss">New Atlas</a>
<a href="https://www.notebookcheck.net/RSS-Feed-Notebook-Reviews.8156.0.html">Notebook Reviews</a>
<a href="https://www.protoolreviews.com/feed/">Pro Tool Reviews</a>
<a href="https://www.productsfromcyprus.com/collections/all.atom">Products from Cyprus</a>
<a href="https://www.producthunt.com/feed">Product Hunt</a>
<a href="https://www.russh.com/feed/">RUSSH</a>
<a href="https://www.sheknows.com/feed/">SheKnows</a>
<a href="https://simplynuc.com/feed/">Simply NUC</a>
<a href="https://www.soundvisionreview.com/feed/">SoundVisionReview</a>
<a href="https://www.techbuy.in/feed/">TechBuy</a>
<a href="https://www.techpowerup.com/rss/news">TechPowerUp</a>
<a href="https://the-gadgeteer.com/feed/">The Gadgeteer</a>
<a href="https://www.trustedreviews.com/feed">Trusted Reviews</a>
<a href="https://tweakers.net/feeds/mixed.xml">Tweakers Mixed</a>
</div>
<div class="category" id="activism">
<h3>Social Action (Activism)</h3>
<a href="https://campaignforliberty.org/feed/">Campaign for Liberty</a>
<!-- a href="https://mastodon.social/@Chips4Israel.rss">Chips4Israel (שבבים בע"מ)</a -->
<a href="https://demandprogress.org/feed/">Demand Progress</a>
<a href="https://www.derrickbroze.com/feed/">Derrick Broze</a>
<a href="https://doctors4covidethics.org/feed/">Doctors for COVID Ethics</a>
<a href="https://www.fightforthefuture.org/news/feed.xml">Fight for the Future</a>
<a href="https://fluoridealert.org/feed/">Fluoride Action Network</a>
<a href="https://www.geoengineeringwatch.org/feed/atom/">Geoengineering Watch</a>
<a href="https://participatorypolitics.org/feed/">Participatory Politics Foundation</a>
<a href="http://live-personaldemocracy.pantheonsite.io/rss.xml">Personal Democracy Forum</a>
<a href="https://primarywater.org/?feed=rss2">Primary Water</a>
<a href="https://publicknowledge.org/feed/">Public Knowledge</a>
<a href="https://www.saveusnow.org.uk/feed/">SUN (Save Us Now)</a>
<a href="https://sfconservancy.org/feeds/news/">Software Freedom Conservancy</a>
<a href="https://stop5g.cz/us/feed/">Stop 5G</a>
<a href="https://stopdirtyelectricity.com/feed/">Stop Dirty Electricity</a>
<a href="http://www.stopsprayingus.com/feed/">Stop Spraying Us!</a>
<a href="https://stopthecrime.net/wp/feed/">Stop The Crime</a>
<a href="https://takebackourtech.org/rss/">Take Back Our Tech</a>
<a href="https://theconsciousresistance.com/feed/">The Conscious Resistance Network</a>
</div>
<div class="category" id="technology">
<h3>Software, Guides, Reviews & Technology</h3>
<a href="https://60devs.com/feed.xml">60devs</a>
<a href="http://feeds.arstechnica.com/arstechnica/index">Ars Technica</a>
<a href="https://www.askpython.com/feed">AskPython</a>
<a href="https://www.cnx-software.com/feed/">CNX Software</a>
<a href="https://www.codeproject.com/WebServices/ArticleRSS.aspx?cat=1">CodeProject</a>
<a href="https://www.comparitech.com/feed/">Comparitech</a>
<a href="https://www.crunchydata.com/blog/rss.xml">CrunchyData</a>
<a href="https://ddos-guard.net/rss">DDoS-GUARD</a>
<a href="https://www.dedoimedo.com/rss_feed.xml">Dedoimedo</a>
<a href="https://www.spiegel.de/thema/energy_and_natural_resources_en/index.rss">DER SPIEGEL - Energy and Natural Resources</a>
<a href="https://www.denx.de/feed/">DENX Software Engineering</a>
<a href="https://distrowatch.com/news/news-headlines.xml">DistroWatch</a>
<a href="https://www.evilsocket.net/atom.xml">evilsocket</a>
<a href="https://blog.front-matter.io/atom/">Front Matter</a>
<a href="https://www.gamingonlinux.com/article_rss.php">GamingOnLinux</a>
<a href="https://www.ghacks.net/feed/">gHacks</a>
<a href="https://guides.lw1.at/index.xml">guides.lw1.at</a>
<a href="https://i2p.rocks/blog/feeds/all.atom.xml">i2p.rocks</a>
<a href="https://incompetech.com/wordpress/feed/">incompetech</a>
<a href="https://internetpkg.com/feed/">Internet Packages</a>
<a href="https://planet.jabber.org/atom.xml">Jabber World</a>
<a href="https://bgstack15.ddns.net/blog/rss.xml">Knowledge Base</a>
<a href="https://cyber.dabamos.de/blog/feed.rss">Lazy Reading | The Cyber Vanguard</a>
<a href="https://leimao.github.io/atom.xml">Lei Mao's Log Book</a>
<a href="https://liliputing.com/feed/">Liliputing</a>
<a href="https://linux-audit.com/feed/">Linux Audit</a>
<a href="https://linuxconfig.org/feed">LinuxConfig</a>
<a href="https://linuxgameconsortium.com/feed/">Linux Game Consortium</a>
<a href="https://linuxgizmos.com/feed/">Linux Gizmos</a>
<a href="https://www.linuxguides.de/feed/">Linux Guides</a>
<a href="https://linuxhandbook.com/rss/">Linux Handbook</a>
<a href="https://linuxize.com/index.xml">Linuxize</a>
<a href="https://linmob.net/feed.xml">LINux on MOBile</a>
<a href="https://www.linuxuprising.com/feeds/posts/default">Linux Uprising Blog</a>
<a href="https://www.mfitzp.com/feeds/all.atom.xml">Martin Fitzpatrick
</a>
<a href="https://medevel.com/rss/">MEDevel</a>
<a href="https://newatlas.com/index.rss">New Atlas</a>
<a href="https://nerdstuff.org/index.xml">Nerd Stuff</a>
<a href="https://www.cyberciti.com/feed/">nixCraft</a>
<a href="https://www.nngroup.com/feed/rss/">NN/g latest articles and announcements</a>
<a href="https://www.notebookcheck.net/News.152.100.html">NotebookCheck</a>
<a href="https://blog.obco.pro/rss/">OblivionCoding</a>
<a href="https://www.osnews.com/feed/">OSnews</a>
<a href="https://ostechnix.com/feed/atom/">OSTechNix</a>
<a href="https://www.pendrivelinux.com/feed/">Pen Drive Linux</a>
<a href="https://www.phoronix.com/rss.php">Phoronix</a>
<a href="https://www.simplified.guide/feed.php">Simplified Guide linux</a>
<a href="https://singpolyma.net/feed/">Singpolyma</a>
<a href="https://sourceforge.net/blog/feed/">SourceForge Community Blog</a>
<a href="https://www.sqlservercentral.com/articles/feed">SQLServerCentral</a>
<a href="https://srinimf.com/feed/">Srinimf</a>
<a href="https://www.tecmint.com/feed/">Tecmint</a>
<a href="https://tuxphones.com/rss/">TuxPhones</a>
<a href="https://tux.pizza/feed.xml">tux.pizza</a>
<a href="https://warmcat.com/feed.xml">Warmcat</a>
</div>
<div class="category" id="package">
<h3>Software Package Updates</h3>
<a href="https://archlinux.org/feeds/packages/">Arch Linux</a>
<a href="https://aur.archlinux.org/rss/">Arch Linux (AUR)</a>
<a href="https://www.ctan.org/ctan-ann/atom.xml">CTAN-ANN</a>
<a href="https://distrowatch.com/news/dw.xml">DistroWatch</a>
<a href="https://flathub.org/feeds">Flathub</a>
<a href="https://extensions.gnome.org/rss/">GNOME Shell Extensions</a>
<a href="https://greasyfork.org/en/scripts.atom?sort=updated">Greasy Fork</a>
<a href="https://store.kde.org/content.rdf">KDE Store</a>
<a href="http://feeds.launchpad.net/announcements.atom">Launchpad</a>
<a href="https://metacpan.org/recent.rss">MetaCPAN</a>
<a href="https://www.opendesktop.org/content.rdf">OpenDesktop Linux Apps</a>
<a href="https://www.parabola.nu/feeds/packages/">Parabola GNU/Linux-libre</a>
<a href="https://pypi.org/rss/updates.xml">PyPI</a>
<a href="https://slackbuilds.org/rss/ChangeLog.rss">SlackBuilds.org</a>
<a href="https://www.xfce-look.org/content.rdf">Xfce-Look.org</a>
</div>
<div class="category" id="project">
<h3>Software Project Updates</h3>
<div class="subcategory">
<h4>Artificial Intelligence</h4>
<a href="https://news.agpt.co/feed/">Auto-GPT</a>
<a href="https://huggingface.co/blog/feed.xml">Hugging Face</a>
<a href="https://translatelocally.com/rss/">Translate Locally</a>
</div>
<div class="subcategory">
<h4>Blockchain</h4>
<a href="https://gostco.in/feed/">GOSTcoin</a>
<a href="https://litecoin.com/rss.xml">Litecoin</a>
<a href="https://www.getmonero.org/feed.xml">Monero</a>
<a href="https://pirate.black/feed/">Pirate Chain (ARRR)</a>
</div>
<div class="subcategory">
<h4>Communication and Social Platforms</h4>
<a href="https://pod.diaspora.software/public/hq.atom">diaspora* HQ</a>
<a href="https://dino.im/index.xml">Dino</a>
<a href="https://blog.discourse.org/rss/">Discourse</a>
<a href="https://ekiga.org/rss.xml">Ekiga</a>
<a href="https://joinfirefish.org/rss.xml">Firefish</a>
<a href="https://blog.funkwhale.audio/feeds/all.atom.xml">Funkwhale</a>
<a href="https://gajim.org/index.xml">Gajim</a>
<a href="https://www.jsxc.org/feed.xml">JSXC</a>
<a href="https://jami.net/feed/">Jami</a>
<a href="https://jitsi.org/feed/">Jitsi</a>
<a href="https://community.jitsi.org/c/news/5.rss">Jitsi News</a>
<a href="https://www.kaidan.im/atom.xml">Kaidan</a>
<a href="https://discourse.mailinabox.email/c/announcements/9.rss">Mail-in-a-Box</a>
<a href="https://mailcow.email/index.xml">Mailcow</a>
<a href="https://oxen.io/feed/atom">Oxen Session</a>
<a href="https://joinpeertube.org/rss-en.xml">PeerTube</a>
<a href="https://soapbox.pub/rss/atom.xml">Soapbox</a>
<a href="https://typo3.org/rss">TYPO3</a>
</div>
<div class="subcategory">
<h4>Desktop and Operating Systems</h4>
<a href="https://artixlinux.org/feed.php">Artix Linux</a>
<a href="https://www.bodhilinux.com/feed/">Bodhi Linux</a>
<a href="https://gitlab.com/divested-mobile/divestos-build.atom">DivestOS-Build activity</a>
<a href="https://droidian.org/index.xml">Droidian</a>
<a href="https://www.dragonflydigest.com/feed/">DragonFly BSD Digest</a>
<a href="https://e.foundation/feed/">e Foundation</a>
<a href="https://www.fiwix.org/rss.xml">Fiwix</a>
<a href="https://sourceforge.net/p/freedos/news/feed.rss">FreeDOS</a>
<a href="https://blogs.gnome.org/pabloyoyoista/feed/">GNOME adventures in mobile</a>
<a href="https://blogs.gnome.org/shell-dev/feed/">GNOME Shell & Mutter</a>
<a href="https://grapheneos.social/@GrapheneOS.rss">GrapheneOS</a>
<a href="https://www.haiku-os.org/index.xml">Haiku Project</a>
<a href="https://libreboot.org/feed.xml">Libreboot</a>
<a href="https://mobile.nixos.org/index.xml">Mobile NixOS</a>
<a href="https://osmocom.org/news.atom">Open Source Mobile Communications</a>
<a href="https://www.parabola.nu/feeds/news/">Parabola GNU/Linux-libre</a>
<a href="https://www.pine64.org/feed/">PINE64</a>
<a href="https://postmarketos.org/blog/feed.atom">postmarketOS</a>
<a href="https://www.qemu.org/feed.xml">QEMU</a>
<a href="https://reactos.org/index.xml">ReactOS</a>
<a href="https://blog.replicant.us/feed/">Replicant</a>
<a href="https://forum.salixos.org/app.php/feed/news">Salix OS</a>
<a href="https://www.trinitydesktop.org/rss.php">Trinity Desktop Environment</a>
<a href="https://ubports.com/blog/ubports-news-1/feed">UBports</a>
<a href="https://forums.whonix.org/c/news/21.rss">Whonix</a>
</div>
<div class="subcategory">
<h4>Development and Statistics</h4>
<a href="https://clojurescript.org/feed.xml">ClojureScript</a>
<a href="https://git.zx2c4.com/cgit/atom/?h=master">cgit</a>
<a href="https://www.fltk.org/index.rss">Fast Light Toolkit</a>
<a href="https://flatassembler.Net/atom.Php">Flat Assembler</a>
<a href="https://about.gitea.com/index.xml">Gitea</a>
<a href="https://blog.gtk.org/feed/">GTK Toolkit</a>
<a href="https://kde.org/index.xml">KDE Desktop</a>
<a href="https://labplot.kde.org/feed/">LabPlot</a>
<a href="https://lxqt-project.org/feed.xml">LXQt Desktop</a>
<a href="https://plausible.io/blog/feed.xml">Plausible Analytics</a>
<a href="https://www.pypy.org/rss.xml">PyPy</a>
<a href="https://rubyonrails.org/feed.xml">Ruby on Rails</a>
<a href="https://blog.rust-lang.org/feed.xml">Rust</a>
</div>
<div class="subcategory">
<h4>Education</h4>
<a href="https://gcompris.net/feed-en.xml">GCompris</a>
</div>
<div class="subcategory">
<h4>Games</h4>
<a href="https://play0ad.com/feed/">0 A.D.</a>
<a href="https://forum.cubers.net/syndication.php?fid=8&limit=5&type=atom1.0">AssaultCube</a>
<a href="https://itch.io/feed/featured.xml">itch.io Featured Games</a>
<a href="https://www.libretro.com/index.php/feed/">Libretro (Lakka & RetroArch)</a>
<a href="https://www.scummvm.org/feeds/atom/">ScummVM</a>
<a href="https://www.speed-dreams.net/en/feed/">Speed Dreams</a>
<a href="https://www.supertux.org/feed.xml">SuperTux</a>
<a href="https://www.winehq.org/news/rss/">WineHQ</a>
<a href="https://xonotic.org/index.xml">Xonotic</a>
</div>
<div class="subcategory">
<h4>Graphics, Multimedia and Office</h4>
<a href="https://discourse.ardour.org/c/blog/15.rss">Ardour</a>
<a href="https://sourceforge.net/p/butt/activity/feed">Broadcast Using This Tool</a>
<a href="https://xiph.org/flac/feeds/feed.xml">FLAC</a>
<a href="https://handbrake.fr/rss.php">HandBrake</a>
<a href="https://jackaudio.org/atom.xml">JACK Audio Connection Kit</a>
<a href="https://fosstodon.org/@libreoffice.rss">LibreOffice</a>
<a href="https://obsproject.com/blog/rss">Open Broadcaster Software</a>
<a href="https://owncast.online/index.xml">Owncast</a>
<a href="https://phoboslab.org/log/feed">Phoboslab (QOA and QOI)</a>
<a href="https://kdenlive.org/en/feed/">Kdenlive</a>
<a href="https://ruffle.rs/feed.xml">Ruffle</a>
<a href="https://www.khronos.org/feeds/news_feed">The Khronos Group Inc</a>
<a href="https://www.edrlab.org/feed/">Thorium Reader</a>
<a href="https://krita.org/en/feed/">Krita</a>
<a href="http://www.un4seen.com/rss.xml">Un4seen Developments</a>
</div>
<div class="subcategory">
<h4>Network and Web</h4>
<a href="https://apps.kde.org/akregator/index.xml">Akregator</a>
<a href="https://brave.com/index.xml">Brave Browser</a>
<a href="https://www.dillo.org/feed/">Dillo Browser</a>
<a href="https://www.falkon.org/atom.xml">Falkon Browser</a>
<a href="https://github.com/Floorp-Projects/Floorp/releases.atom">Floorp</a>
<a href="https://leafletjs.com/atom.xml">Leaflet Dev Blog</a>
<a href="https://lemmy.ml/feeds/c/librewolf.xml?sort=Active">Librewolf</a>
<a href="https://lzone.de/liferea/blog/feed.xml">Liferea</a>
<a href="https://www.nagios.com/feed/">Nagios</a>
<a href="https://netnewswire.blog/feed.xml">NetNewsWire</a>
<a href="https://blogs.gnome.org/thaller/feed/">NetworkManager</a>
<a href="https://otter-browser.org/feed/">Otter Browser</a>
<a href="https://quiterss.org/en/rss.xml">QuiteRSS</a>
<a href="https://servo.org/blog/feed.xml">Servo</a>
<a href="https://sourceforge.net/p/shareaza/activity/feed">Shareaza</a>
<a href="https://spidermonkey.dev/feed.xml">SpiderMonkey</a>
<a href="https://www.uzbl.org/atom.xml">Uzbl Browser</a>
<a href="https://webkit.org/feed/atom/">WebKit</a>
</div>
<div class="subcategory">
<h4>Package Management and Recovery Tools</h4>
<!-- a href="https://cydia.saurik.com/">Cydia App Store</a -->
<a href="https://f-droid.org/feed.xml">F-Droid Store</a>
<!-- a href="https://orangefox.tech/feed.xml">OrangeFox</a -->
<a href="https://twrp.me/feed.xml">TWRP</a>
</div>
<div class="subcategory">
<h4>Miscellaneous</h4>
<a href="https://bitwarden.com/blog/feed.xml">Bitwarden</a>
<a href="https://sourceforge.net/p/hyperic-hq/activity/feed">Hyperic Application & System Monitoring</a>
<a href="https://texample.net/feeds/community/">The TeX community aggregator</a>
<a href="https://tug.org/rss/tug.xml">TeX Users Group</a>
<a href="https://techhub.social/@TeXUsersGroup.rss">TeX Users Group Updates</a>
</div>
<div class="subcategory">
<h4>Theme</h4>
<a href="https://aquoid.com/feed/">Aquoid</a>
<!-- a href="https://github.com/ClassicOS-Themes">ClassicOS</a -->
<!-- a href="https://draculatheme.com/">Dracula Theme</a -->
<!-- a href="https://numixproject.github.io/feed/">Numix Project</a -->
<!-- a href="https://shimmerproject.org/feed/">Shimmer Project</a -->
</div>
</div>
<div class="category" id="syndication">
<h3>Syndication & XML</h3>
<a href="https://activitypub.rocks/feed.xml">ActivityPub Rocks!</a>
<a href="https://www.dublincore.org/index.xml">Dublin Core</a>
<a href="https://www.jsonfeed.org/feed.xml">JSON Feed</a>
<a href="https://microformats.org/feed">Microformats</a>
<a href="https://openrss.org/rss">Open RSS</a>
<a href="http://opml.org/?format=opml">OPML</a>
<a href="http://feeds.rssboard.org/rssboard">RSS Advisory Board</a>
<a href="http://scripting.com/rss.xml">Scripting News</a>
<a href="https://blog.saxonica.com/atom.xml">Saxonica</a>
<a href="http://docs.subtome.com/feed.xml">SubToMe</a>
<a href="https://sword.cottagelabs.com/feed/">SWORD</a>
<a href="http://rss.userland.com/xml/rss.xml">UserLand RSS Central</a>
<a href="http://xml.coverpages.org/covernews.xml">XML Cover Pages</a>
<a href="https://www.xml.com/feed/all/">XML.com</a>
</div>
<div class="category" id="telecom">
<h3>Telecom, Mesh & Mix Protocols</h3>
<a href="https://ethlimo.substack.com/feed">ETH.LIMO</a>
<a href="https://gemini.circumlunar.space/news/atom.xml">Gemini Project</a>
<a href="https://www.gnunet.org/en/rss.xml">GNUnet</a>
<a href="https://gopher.zone/index.xml">Highway to the Gopher Zone</a>
<a href="https://geti2p.net/en/feed/blog/atom">I2P Blog</a>
<a href="https://blog.ipfs.io/index.xml">IPFS</a>
<a href="https://www.mysterium.network/blog-feed.xml">Mysterium Network</a>
<a href="https://blog.nymtech.net/feed">Nym</a>
<a href="https://oxen.io/feed/atom">Oxen Lokinet</a>
<a href="https://panoramix-project.eu/feed/">Panoramix</a>
<a href="https://blog.torproject.org/feed.xml">Tor Project</a>
<a href="https://veilid.com/atom.xml">Veilid Project</a>
<a href="https://www.w3.org/blog/news/feed/atom">W3C</a>
<a href="https://xmpp.org/feeds/all.atom.xml">XMPP Blog</a>
<a href="https://yggdrasil-network.github.io/feed.xml">Yggdrasil Network</a>
</div>
<div class="category" id="torrents">
<h3>Torrents</h3>
<a href="https://androidkino.net/rss.xml">AndroidKino (RU)</a>
<a href="https://angietorrents.cc/rss.php?custom=1">AngieTorrents</a>
<a href="https://anidex.info/rss/">AniDex Tracker (JA)</a>
<a href="https://www.anirena.com/rss.php">AniRena (JA)</a>
<a href="https://audiobookbay.is/feed/atom/">AudioBook Bay</a>
<a href="https://bangumi.moe/rss/latest">Bangumi Moe</a>
<a href="https://eztv.re/ezrss.xml">EZTV</a>
<a href="http://firebit.org/rss.xml">FireBit</a>
<a href="https://fosstorrents.com/feed/distribution.xml">FOSS Torrents - Distributions</a>
<a href="https://fosstorrents.com/feed/game.xml">FOSS Torrents - Games</a>
<a href="https://fosstorrents.com/feed/software.xml">FOSS Torrents - Softwares</a>
<a href="https://igg-games.com/feed">Install Guide Games</a>
<a href="https://www.limetorrents.lol/rss/">Lime Torrents</a>
<a href="https://nyaa.si/?page=rss">Nyaa</a>
<a href="https://pcgamestorrents.com/feed">PCGamesTorrents</a>
<a href="http://tracker2.postman.i2p/?view=AddRSSMap">Postman</a>
<a href="https://rarbg.to/rss.php">RARBG</a>
<a href="http://rutor.info/rss.php">RUTOR (EN/RU)</a>
<a href="https://sktorrent.org/feed_rss.xml">SkTorrent</a>
<a href="https://tpb.party/rss">The Pirate Bay</a>
<a href="https://tokyo-tosho.net/rss.php">Tokyo Toshokan</a>
<!--a href="https://www.tokyotosho.info/rss.php">Tokyo Toshokan</a-->
<a href="https://www.torlock.com/rss.xml">Torlock</a>
<a href="https://www.torrent911.me/rss">Torrent911 (ES)</a>
<a href="https://www.torrentdownload.info/feed_latest">Torrent Download</a>
<a href="https://www.torrentdownloads.pro/rss.xml">Torrent Downloads</a>
<a href="https://torrentgalaxy.to/rss">TorrentGalaxy</a>
<a href="https://booktracker.org/rss.php">Книжный трекер (RU)</a>
<a href="https://gamestracker.org/torrents/rss/">Торрент игры (RU)</a>
</div>
<div class="category" id="video">
<h3>Videos & PeerTube</h3>
<a href="https://altcensored.com/feed">altCensored</a>
<a href="https://denshi.live/feeds/videos.atom">denshi.live</a>
<a href="https://filmsbykris.com/rss.xml">Films By Kris</a>
<a href="https://videos.lukesmith.xyz/feeds/videos.atom?sort=-publishedAt&isLocal=true">Luke's Videos</a>
<a href="https://diode.zone/feeds/videos.atom?videoChannelId=9828">Mr. Funk E. Dude's Place.</a>
<a href="https://media.ccc.de/news.atom">media.ccc.de</a>
<a href="https://www.opensubtitles.com/" title="RSS Per Movie/Page">OpenSubtitles.com</a>
<a href="http://truthstreammedia.com/feed/">Truthstream Media</a>
</div>
</div>
</div>
<span class="decor"></span>
<div id="software" class="segment">
<h1>💿 Install Feed Reader Apps For Desktop And Mobile</h1>
<h2>Take Your News With You - Everywhere You Go</h2>
<div class="content">
<p>This is a list of desktop applications, mobile apps and online services for you to choose from.</p>
<p>This list includes news readers, podcast managers, torrent clients, chat bots, web browsers and extensions which support web feeds.</p>
<p>Recommended programs are marked with 🔖</p>
<div id="filter">
<span class="filter" id="torrent">BitTorrent</span>
<span class="filter" id="email">Email</span>
<span class="filter" id="news">News</span>
<span class="filter" id="music">Podcast</span>
<span class="filter" id="web">Web Browser</span>
</div>
<div class="category">
<h3>Desktop</h3>
<div class="subcategory" id="unix">
<h4>Linux</h4>
<a class="news" href="https://apps.kde.org/akregator/">Akregator</a>
<a class="music" href="https://amarok.kde.org/">Amarok</a>
<a class="web" href="https://brave.com/">Brave</a>
<a class="email" href="https://www.claws-mail.org/">Claws Mail</a>
<a class="torrent" href="https://deluge-torrent.org/">Deluge</a>
<a class="news" href="https://github.com/jeena/FeedTheMonkey">Feed The Monkey</a>
<a class="music" href="https://gpodder.github.io/">gPodder</a>
<a class="music" href="https://apps.kde.org/kasts/">Kasts</a>
<a class="news recom" href="https://leechcraft.org/">LeechCraft</a>
<a class="news recom" href="https://lzone.de/liferea/">Liferea</a>
<a class="music" href="https://github.com/son-link/minimal-podcasts-player">Minimal Podcasts Player</a>
<a class="news recom" href="https://apps.gnome.org/app/com.gitlab.newsflash/">NewsFlash</a>
<a class="web" href="https://otter-browser.org/">Otter Browser</a>
<a class="torrent" href="https://www.qbittorrent.org/">qBittorrent</a>
<a class="news" href="https://quiterss.org/">QuiteRSS</a>
<a class="news" href="https://ravenreader.app/">Raven Reader</a>
<a class="news" href="https://github.com/martinrotter/rssguard">RSS Guard</a>
<a class="news" href="http://www.rssowl.org/">RSSOwl</a>
<a class="news" href="https://github.com/Xyrio/RSSOwlnix">RSSOwlnix</a>
<a class="music" href="https://wiki.gnome.org/Apps/Rhythmbox">Rhythmbox</a>
<a class="news recom" href="https://textbrowser.github.io/spot-on/">Spot-On</a>
<a class="music" href="https://strawberrymusicplayer.org/">Strawberry Music Player</a>
<a class="email" href="https://www.thunderbird.net/">Thunderbird</a>
<a class="news" href="https://www.open-tickr.net/">TICKR</a>
<a class="torrent recom" href="https://www.tribler.org/">Tribler</a>
<a class="web" href="https://vivaldi.com/features/feed-reader/">Vivaldi</a>
</div>
<div class="subcategory" id="mac-os">
<h4>macOS</h4>
<a class="music" href="https://amarok.kde.org/">Amarok</a>
<a class="web" href="https://brave.com/">Brave</a>
<a class="torrent" href="https://deluge-torrent.org/">Deluge</a>
<a class="music" href="https://gpodder.github.io/">gPodder</a>
<a class="news recom" href="https://leechcraft.org/">LeechCraft</a>
<a class="music" href="https://github.com/son-link/minimal-podcasts-player">Minimal Podcasts Player</a>
<a class="news recom" href="https://netnewswire.com/">NetNewsWire</a>
<a class="web" href="https://otter-browser.org/">Otter Browser</a>
<a class="torrent" href="https://www.qbittorrent.org/">qBittorrent</a>
<a class="news" href="https://quiterss.org/">QuiteRSS</a>
<a class="news" href="https://ravenreader.app/">Raven Reader</a>
<a class="news" href="https://github.com/martinrotter/rssguard">RSS Guard</a>
<a class="news" href="http://www.rssowl.org/">RSSOwl</a>
<a class="news" href="https://github.com/Xyrio/RSSOwlnix">RSSOwlnix</a>
<a class="news recom" href="https://textbrowser.github.io/spot-on/">Spot-On</a>
<a class="music" href="https://strawberrymusicplayer.org/">Strawberry Music Player</a>
<a class="email" href="https://www.thunderbird.net/">Thunderbird</a>
<a class="torrent recom" href="https://www.tribler.org/">Tribler</a>
<a class="web" href="https://vivaldi.com/features/feed-reader/">Vivaldi</a>
</div>
<div class="subcategory" id="react-os">
<h4>React OS</h4>
<h5>WineHQ and Windows</h5>
<a class="music" href="https://amarok.kde.org/">Amarok</a>
<a class="web" href="https://brave.com/">Brave</a>
<a class="email" href="https://www.claws-mail.org/">Claws Mail</a>
<a class="torrent" href="https://deluge-torrent.org/">Deluge</a>
<a class="music" href="https://gpodder.github.io/">gPodder</a>
<a class="web" href="http://kmeleonbrowser.org/">K-Meleon</a>
<a class="news recom" href="https://leechcraft.org/">LeechCraft</a>
<a class="music" href="https://github.com/son-link/minimal-podcasts-player">Minimal Podcasts Player</a>
<a class="web" href="https://otter-browser.org/">Otter Browser</a>
<a class="torrent" href="https://www.qbittorrent.org/">qBittorrent</a>
<a class="news" href="https://quiterss.org/">QuiteRSS</a>
<a class="news" href="https://ravenreader.app/">Raven Reader</a>
<a class="news" href="http://rssbandit.org/">RSS Bandit</a>
<a class="news" href="https://github.com/martinrotter/rssguard">RSS Guard</a>
<a class="news" href="http://www.rssowl.org/">RSSOwl</a>
<a class="news" href="https://github.com/Xyrio/RSSOwlnix">RSSOwlnix</a>
<a class="news" href="http://sharpreader.net/">SharpReader</a>
<a class="news recom" href="https://textbrowser.github.io/spot-on/">Spot-On</a>
<a class="music" href="https://strawberrymusicplayer.org/">Strawberry Music Player</a>
<a class="email" href="https://www.thunderbird.net/">Thunderbird</a>
<a class="torrent recom" href="https://www.tribler.org/">Tribler</a>
<a class="web" href="https://vivaldi.com/features/feed-reader/">Vivaldi</a>
</div>
</div>
<div class="category">
<h3>Mobile</h3>
<div class="subcategory" id="android-os">
<h4>Android</h4>
<h5>Above Phone, CopperheadOS, DivestOS, GrapheneOS and LineageOS</h5>
<a class="web" href="https://brave.com/">Brave</a>
<a class="news" href="https://f-droid.org/en/packages/com.nononsenseapps.feeder/">Feeder</a>
<a class="news" href="https://f-droid.org/packages/org.decsync.flym/">Flym DecSync</a>
<a class="music" href="https://apps.kde.org/kasts/">Kasts</a>
<a class="torrent recom" href="https://f-droid.org/en/packages/org.proninyaroslav.libretorrent/">LibreTorrent</a>
<a class="music" href="https://f-droid.org/en/packages/io.gitlab.listentogether">ListenTogether</a>
<a class="news" href="https://f-droid.org/en/packages/co.appreactor.news/">News</a>
<a class="news" href="https://f-droid.org/en/packages/com.nunti/">Nunti</a>
<a class="music" href="https://f-droid.org/en/packages/com.podverse.fdroid/">Podverse</a>
<a class="news" href="https://f-droid.org/en/packages/me.ash.reader/">Read You</a>
<a class="news recom" href="https://f-droid.org/en/packages/com.aerotoad.thud/">Thud</a>
<a class="torrent" href="https://f-droid.org/en/packages/org.transdroid.full/">Transdroid</a>
<a class="web" href="https://vivaldi.com/features/feed-reader/">Vivaldi</a>
</div>
<div class="subcategory" id="unix">
<h4>Linux Phone</h4>
<h5>Droidian, Kupfer Linux, Mobile NixOS and postmarketOS</h5>
<a class="news" href="https://apps.kde.org/alligator/">Alligator</a>
<a class="news" href="https://gfeeds.gabmus.org/">Feeds</a>
<a class="music" href="https://gpodder.github.io/">gPodder</a>
<a class="music" href="https://apps.kde.org/kasts/">Kasts</a>
</div>
<div class="subcategory" id="gerda-os">
<h4>GerdaOS and KaiOS</h4>
<a class="news" href="https://store.bananahackers.net/#feedolin">feedolin</a>
<a class="music" href="https://store.bananahackers.net/#FoxCastLite">FoxCast Lite</a>
<a class="music" href="https://store.bananahackers.net/#Mica">Mica</a>
<a class="music" href="https://store.bananahackers.net/#PodKast">PodKast</a>
<a class="music" href="https://store.bananahackers.net/#podlp">PodLP</a>
<a class="news" href="https://store.bananahackers.net/#n4no.com.rss-reader">RSS Reader</a>
</div>
<div class="subcategory" id="ios">
<h4>iOS</h4>
<a class="web" href="https://brave.com/">Brave</a>
<a class="news" href="https://netnewswire.com/">NetNewsWire</a>
<a class="music" href="https://github.com/guumeyer/Podcast">Podcast</a>
<a class="music" href="https://github.com/rafaelclaycon/PodcastApp">PodcastApp</a>
</div>
<div class="subcategory" id="sailfish-os">
<h4>Sailfish OS</h4>
<a class="news" href="https://github.com/mkiol/kaktus">Kaktus</a>
<a class="news" href="https://github.com/donaggio/harbour-feedhaven">Feed Haven</a>
<a class="news" href="http://gitlab.unique-conception.org/apps-4-sailfish/feed-me">Feed Me</a>
<a class="music" href="https://gpodder.github.io/">gPodder</a>
<a class="news" href="https://github.com/walokra/haikala">Haikala</a>
<a class="news" href="https://github.com/pycage/tidings">Tidings</a>
</div>
<div class="subcategory" id="tizen">
<h4>Tizen</h4>
<a class="news" href="https://github.com/CESARBR/tizenreader">Tizen Reader</a>
</div>
<div class="subcategory" id="ubports">
<h4>Ubuntu Touch</h4>
<a class="music" href="https://open-store.io/app/com.mikeasoft.podbird">Podbird</a>
<a class="music" href="https://open-store.io/app/soy.iko.podphoenix">Podphoenix</a>
<a class="news" href="https://open-store.io/app/rssreader.florisluiten">RSSreader</a>
<a class="news" href="https://open-store.io/app/simplestrss.kazord">SimplestRSS</a>
<!-- a class="torrent" href="https://open-store.io/app/transmission.pavelprosto">Transmission</a -->
<!-- a class="torrent" href="https://open-store.io/app/tr.davidv.dev">Transmission Remote</a -->
<a class="news" href="https://open-store.io/app/darkeye.ursses">uRsses</a>
</div>
</div>
<div class="category">
<h3>Chat Bots</h3>
<a class="news" href="https://github.com/imattau/atomtopubsub">AtomToPubsub</a>
<a class="news" href="https://codeberg.org/TheCoffeMaker/Morbot">Morbot</a>
<a class="news" href="https://gitgud.io/sjehuda/slixfeed">Slixfeed</a>
</div>
<div class="category">
<h3>Web Extensions</h3>
<a class="news" href="https://addons.mozilla.org/firefox/addon/boring-rss/">Boring RSS</a>
<a class="news" href="https://nodetics.com/feedbro/">Feedbro</a>
<a class="news" href="https://code.guido-berhoerster.org/addons/firefox-addons/feed-preview/">Feed Preview</a>
<a class="news" href="https://github.com/nt1m/livemarks/">Livemarks</a>
<a class="news" href="https://github.com/mpod/mpage">mPage</a>
<a class="news" href="https://github.com/SmartRSS/Smart-RSS">Smart RSS</a>
</div>
<div class="category">
<h3>Terminal</h3>
<a class="news" href="https://codezen.org/canto-ng/">Canto</a>
<a class="news" href="https://github.com/zefr0x/mujammi">Mujammi' | مجمع</a>
<a class="news" href="https://newsboat.org/">Newsboat</a>
<a class="news" href="https://sr.ht/~ghost08/photon/">Photon</a>
<a class="torrent" href="https://github.com/rakshasa/rtorrent">RTorrent</a>
<a class="torrent" href="https://github.com/dpsenner/bridge-from-torrent-rss-feed-to-rtorrent">bridge-from-torrent-rss-feed-to-rtorrent</a>
<a class="news" href="https://codemadness.org/sfeed_curses-ui.html">Sfeed</a>
</div>
<div class="category">
<h3>Web (Self Hosted)</h3>
<a class="news" href="https://feedbin.com/">Feedbin</a>
<a class="news" href="https://0xdstn.site/projects/feeds/">Feeds</a>
<a class="news" href="http://feedonfeeds.com/">Feeds on Feeds</a>
<a class="news" href="https://freshrss.org/">FreshRSS</a>
<a class="news" href="https://miniflux.app/">Miniflux</a>
<a class="news" href="https://offog.org/code/rawdog/">rawdog</a>
<a class="news" href="https://0xdstn.site/projects/reader/">Reader</a>
<a class="news" href="https://github.com/acavalin/rrss">RRSS</a>
<a class="torrent" href="https://github.com/Novik/ruTorrent">ruTorrent</a>
<a class="news" href="https://tt-rss.org/">Tiny Tiny RSS</a>
</div>
<div class="category">
<h3>Web (Service)</h3>
<a class="news" href="https://feedbin.com/">Feedbin</a>
<a class="news" href="https://feeder.co/">Feeder</a>
<a class="news" href="https://feedly.com/">Feedly</a>
<a class="news" href="https://goodnews.click/">Good News</a>
<a class="news" href="https://www.inoreader.com/">Inoreader</a>
<a class="news" href="http://www.netvibes.com/en">Netvibes</a>
<a class="news" href="https://newsblur.com/">NewsBlur</a>
<a class="news" href="https://www.reedah.com/">Reedah</a>
<a class="news" href="https://theoldreader.com/">The Old Reader</a>
</div>
</div>
</div>
<span class="decor"></span>
<div id="services-publish" class="segment">
<h1>🔊 Publishing Platforms With Syndication</h1>
<h2>Express Yourself Through Text, Audio and Video</h2>
<div class="content">
<p>Do you want to start a syndication-enabled podcast?</p>
<p>The following blog and podcast hosting services provide access to syndication. Recommended providers are marked with 🔖</p>
<div>
<div class="category">
<h3>Decentralized Services (ActivityPub)</h3>
<ul>
<li><a href="https://diaspora.fediverse.observer/list">diaspora*</a></li>
<li><a class="recom" href="https://funkwhale.fediverse.observer/list">Funkwhale</a></li>
<li><a href="https://friendica.fediverse.observer/list">Friendica</a></li>
<li><a title="Also known as Identi.ca, Quitter and StatusNet" href="https://gnusocial.network/try/">GNU social</a></li>
<li><a class="recom" href="https://hubzilla.fediverse.observer/list">Hubzilla</a></li>
<li><a href="https://instances.social/">Mastodon</a></li>
<li><a class="recom" href="https://micro.blog/">Micro.blog</a></li>
<li><a class="recom" href="https://monocles.social/">monocles social</a></li>
<li><a class="recom" href="https://instances.joinpeertube.org/">PeerTube</a></li>
<li><a href="https://pixelfed.fediverse.observer/list">Pixelfed</a></li>
<li><a href="https://soapbox.pub/servers/">Soapbox</a></li>
</ul>
</div>
<div class="category">
<h3>Decentralized Services (Blockchain and DHT)</h3>
<ul>
<li><a href="https://getaether.net/">Aether</a></li>
<li><a class="recom" href="https://plebbit.com/">Plebbit</a> (h-entry syndication)</li>
<li><a href="https://scuttlebutt.nz/">Scuttlebutt</a></li>
</ul>
</div>
<div class="category">
<h3>Free Of Charge Services</h3>
<ul>
<li><a href="https://www.acast.com/">Acast</a></li>
<li><a href="https://www.blogtalkradio.com/">Blog Talk Radio</a></li>
<li><a class="recom" href="https://www.chatons.org/search/by-service?service_type_target_id=154">Chatons (list of external services)</a></li>
<li><a href="https://castos.com/">Castos</a></li>
<li><a href="https://feedpress.com/">FeedPress</a></li>
<li><a href="http://libsyn.com/">libsyn</a></li>
<li><a class="recom" href="https://neocities.org/">Neocities</a></li>
<li><a class="recom" href="https://noblogs.org/">NoBlogs</a></li>
<li><a href="https://podbean.com/">PodBean</a></li>
<li><a href="https://podomatic.com/">Podomatic</a></li>
<li><a href="https://rawvoice.com/">RawVoice</a></li>
<li><a href="https://rss.com/">RSS.com</a></li>
<li><a href="https://www.spreaker.com/">Spreaker</a></li>
<li><a href="https://substack.com/">Substack</a></li>
<li><a class="recom" href="https://tedomum.net/service/">TeDomum (list of services)</a></li>
<li><a class="recom" href="https://weblog.lol/">weblog.lol</a></li>
</ul>
</div>
<div class="category">
<h3>Prepaid Services</h3>
<ul>
<li><a href="https://www.cloudaccess.net/">CloudAccess</a></li>
<li><a href="https://www.hetzner.com/">Hetzner</a></li>
<li><a href="https://www.hostinger.co.uk/">Hostinger</a></li>
<li><a href="https://masto.host/">Masto.host</a></li>
<li><a class="recom" href="https://micro.blog/">Micro.blog</a></li>
<li><a class="recom" href="https://monocles.eu/more/">monocles</a></li>
<li><a href="https://www.rochen.com/">Rochen</a></li>
<li><a href="https://www.strato.de/">STRATO</a></li>
<li><a class="recom" href="https://xrd.me/">XRD.ME</a></li>
<li><a class="recom" href="https://zourit.net/">Zourit</a></li>
</ul>
</div>
<div class="category">
<h3>Self Hosted</h3>
<ul>
<li><a href="https://www.concretecms.com/">Concrete CMS</a></li>
<!-- li><a href="https://www.dnnsoftware.com/community/download">DNN</a></li -->
<li><a href="https://www.drupal.org/">Drupal</a></li>
<li><a href="https://www.11ty.dev/">Eleventy</a></li>
<li><a href="https://foswiki.org/">Foswiki</a></li>
<li><a href="https://getgrav.org/">Grav</a></li>
<li><a href="https://dthompson.us/projects/haunt.html">Haunt</a></li>
<li><a href="https://gohugo.io/">Hugo</a></li>
<li><a href="https://jekyllrb.com/">Jekyll</a></li>
<li><a href="https://www.joomla.org/">Joomla</a></li>
<li><a href="https://getnikola.com/">Nikola</a></li>
<li><a href="http://octopress.org/">Octopress</a></li>
<li><a href="https://getpelican.com/">Pelican</a></li>
<li><a href="https://picocms.org/">Pico</a></li>
<li><a href="https://podcastgenerator.net/">Podcast Generator</a></li>
<!-- li><a a href="https://processwire.com/">ProcessWire</a></li -->
<li><a href="https://getpublii.com/">Publii</a></li>
<!-- li><a href="http://radiantcms.org/">Radiant CMS</a></li -->
<li><a href="https://github.com/PiotrZPL/staurolite">Staurolite</a></li>
<li><a href="https://textpattern.com/">Textpattern CMS</a></li>
<!-- li><a href="https://twiki.org/">TWiki</a></li -->
<li><a href="https://typo3.org/">TYPO3</a></li>
<li><a href="https://wordpress.org/">WordPress</a></li>
<li><a href="http://getzola.org/">Zola</a></li>
</ul>
</div>
<div class="category">
<h3>Of Note</h3>
<p>Decentralized services are <i>very and mostly</i> encouraged; Use one ActivityPub-based account to communicate with all services and platforms.</p>
<p>Free of monetary charge services are generally <i>not</i> encouraged and are mostly usable as a backup medium.</p>
<p>You are encouraged to host <b>your own</b> server connected to <a href="https://i2pd.readthedocs.io/en/latest/tutorials/http/#host-anonymous-website"><u>the I2P network</u></a>.</p>
<p>Whatever is your medium of choice to publish your podcast, best ways to make your files available are via BitTorrent, I2P and IPFS.</p>
<p>* PeerTube has built-in BitTorrent support.</p>
</div>
</div>
</div>
</div>
<span class="decor"></span>
<div id="searx" class="segment">
<h1>👁️ Monitoring Online Presence And Facilitating SEO</h1>
<h2>Power Tools That Advertisers Don't Want You To Use</h2>
<div class="content">
<p>Advertising and marketing agencies make an extensive use of web feeds to monitor information presented by search results and other trends. Many of them use SearXNG to do this task.</p>
<p>SearXNG and YaCy are private and decentralized engines that retrieve results from multiple sources, including commercial web engines, RSS feeds and also from shared peers using the DHT technology.</p>
<p>Results are provided in both HTML and <b class="text-icon orange">RSS</b>, including CSV and JSON.</p>
<p>While SearXNG retrieves results only from live search engines, YaCy provides results from both local database (i.e. bookmarks) and other YaCy peers, in addition to live search engines.</p>
<h3>Marginalia</h3>
<p>Marginalia Search a small independent do-it-yourself search engine for surprising but content-rich websites that never ask you to accept cookies or subscribe to newsletters.</p>
<ul>
<li><a href="https://search.marginalia.nu/">Homepage</a></li>
<li><a href="https://git.marginalia.nu/">Source code</a></li>
</ul>
<h3>MetaGer</h3>
<p>MetaGer has been free software under GNU AGPL v3 since August 16, 2016, so that our strict protection of your data and your privacy can be publicly verified and so that you as a programmer can help to make everything even better.</p>
<ul>
<li><a href="https://gitlab.metager.de/open-source/MetaGer">Homepage</a></li>
<li><a href="https://metager.de/">Source code</a></li>
</ul>
<h3>SearXNG (RSS Supported)</h3>
<p>SearXNG is a meta-search engine, aggregating the results of other search engines while not storing information about its users.</p>
<ul>
<li><a href="https://searx.space/">Homepage</a></li>
<li><a href="https://github.com/searxng/searxng">Source code</a></li>
</ul>
<h3>Wiby</h3>
<p>Wiby is a search engine for the World Wide Web. The source code is now free as of July 8, 2022.</p>
<ul>
<li><a href="https://wiby.me/">Homepage</a></li>
<li><a href="https://github.com/wibyweb/wiby">Source code</a></li>
</ul>
<h3>YaCy (P2P and RSS Supported)</h3>
<p>Imagine if, rather than relying on the proprietary software of a large professional search engine operator, your search engine was run across many private devices, not under the control of any one company or individual. Well, that's what YaCy does!</p>
<ul>
<li><a href="https://yacy.net/">Homepage</a></li>
<li><a href="https://github.com/yacy/yacy_search_server">Source code</a></li>
</ul>
</div>
</div>
<span class="decor"></span>
<div id="services-feed" class="segment">
<h1>🛎️ Your RSS Is Kindly Served, Sir!</h1>
<h2>Because No One Should Nor Would Stop You From Being In Control Of Your Precious Time</h2>
<div class="content">
<p>Below are online services that enhance and restore access to web feeds.</p>
<!-- h3><a href="https://teddit.net/">teddit</a></h3>
<p>Turn /r/ into Web feeds. (<a href="https://github.com/libreddit/libreddit">source code</a>)</p -->
<h3><a href="https://feedcontrol.fivefilters.org/">Feed Control</a></h3>
<p>Monitor feeds and web pages, filter content, receive alerts, expand partial feeds, and integrate with your app.</p>
<h3><a href="https://www.fivefilters.org/feed-creator/">Feed Creator</a></h3>
<p>Create a feed from a web page. Generate RSS and JSON feeds from a set of links or other web page elements.</p>
<h3><a href="https://www.fivefilters.org/full-text-rss/">Full-Text RSS</a></h3>
<p>Easy article extraction. Extract the full article content from a web page or a summary-only RSS feed.</p>
<h3><a href="https://invidious.io/">Invidious</a></h3>
<p>Turn your favorite video channels into Atom feeds. (<a href="https://gitea.invidious.io/iv-org/invidious">source code</a>)</p>
<!-- h3><a href="https://libreddit.no-logs.com/">libreddit</a></h3>
<p>Turn /r/ into Web feeds. (<a href="https://github.com/libreddit/libreddit">source code</a>)</p -->
<h3><a href="https://kill-the-newsletter.com/">Kill the Newsletter!</a></h3>
<p>Convert email newsletters into Web feeds. (<a href="https://github.com/leafac/kill-the-newsletter">source code</a>)</p>
<h3><a href="https://nitter.net/">Nitter</a></h3>
<p>Turn tweets into RSS feeds. (<a href="https://github.com/zedeus/nitter">source code</a>)</p>
<h3><a href="https://openrss.org/">Open RSS</a></h3>
<p>Open RSS is a nonprofit organization that provides free RSS feeds for websites and applications that don't already provide them, so RSS feeds can continue to be a reliable way for internet users to stay up-to-date with content anywhere on the internet.</p>
<h3><a href="https://rss.app/rss-feed">RSS.app</a></h3>
<p>Create RSS Feeds from <i>almost</i> any webpage.</p>
<h3><a href="https://rss-bridge.github.io/rss-bridge/">RSS Bridge</a></h3>
<p>RSS-Bridge is free and open source software for generating Atom or RSS feeds from websites which don’t have one. It is written in PHP and intended to run on a Web server. (<a href="https://github.com/RSS-Bridge/rss-bridge">source code</a>)</p>
</div>
</div>
<span class="decor"></span>
<div id="learn" class="segment">
<h1>📚 History They Don't Want You To Know About</h1>
<h2>Learn More About Standards and Syndication Technology</h2>
<div class="content">
<p>This is a short history and reference guide to web feeds.</p>
<p>It is an essential learning that will expose to you the technologies that are vigorously being suppressed and concealed from us for over 20 years.</p>
<h3>ActivityPub (2018)</h3>
<p>The ActivityPub protocol is a decentralized social networking protocol based upon the [ActivityStreams] 2.0 data format. It provides a client to server functionality for creating, updating and deleting content, as well as a federated server to server API for delivering notifications and content. <a href="https://activitypub.rocks/">Continue reading…</a></p>
<h3>RSS-in-JSON (2017)</h3>
<p>RSS-in-JSON feed format is simply an RSS 2.0 feed that uses JSON syntax in place of XML. <a href="https://github.com/scripting/Scripting-News/tree/master/rss-in-json">Continue reading…</a></p>
<h3>JSON Feed (2017)</h3>
<p>The JSON Feed format is a pragmatic syndication format, like RSS and Atom, but with one big difference: it’s JSON instead of XML. <a href="https://www.jsonfeed.org/version/1.1/">Continue reading…</a></p>
<h3>Activity Streams (2008)</h3>
<p>An extension to the Atom feed format to express what people are doing around web. The stream in ActivityStreams is a feed of related activities for a given person or social object.
<a href="https://wiki.activitystrea.ms/w/page/1359261/FrontPage">Continue reading…</a></p>
<h3>h-entry and hAtom 0.1 (2006)</h3>
<p>h-entry is a simple, open format for episodic or datestamped content on the web. h-entry is often used with content intended to be syndicated, e.g. blog posts. h-entry is one of several open microformat standards suitable for embedding data in HTML. <a href="http://microformats.org/wiki/h-entry">Continue reading…</a></p>
<h3>Atom and AtomPub (2003)</h3>
<p>Atom is the name of an XML-based Web content and metadata syndication format, and an application-level protocol for publishing and editing Web resources belonging to periodically updated websites. <a href="https://web.archive.org/web/20120105062737if_/http://www.atomenabled.org:80/developers/syndication/#whatIsAtom">Continue reading…</a></p>
<h3>OPML (2000)</h3>
<p>OPML is a text-based format designed to store and exchange outlines with attributes. It has been around since the early 2000s, and is widely used in the RSS world to exchange subscription lists. It is an established standard for interop among outliners. <a href="http://scripting.com/davenet/2000/09/24/opml10.html">Continue reading…</a></p>
<h3>RSS (1999)</h3>
<p>RSS is a Web content syndication format. Its name is an acronym for Really Simple Syndication. RSS is a dialect of XML. <a href="https://www.rssboard.org/rss-specification#whatIsRss">Continue reading…</a></p>
<h3>XSL and XSLT (1998)</h3>
<p>XSL (Extensible Stylesheet Language) is designed for use as part of XSLT, which is a stylesheet language for XML that has document manipulation capabilities beyond styling. <a href="http://xml.coverpages.org/xsl.html">Continue reading…</a></p>
</div>
</div>
<span class="decor"></span>
<div id="xslt" class="segment">
<h1>🏆 About XSLT</h1>
<div class="content">
<h2>XSL (Extensible Stylesheet Language) is designed for use as part of XSLT, which is a stylesheet language for XML that has document manipulation capabilities beyond styling.</h2>
<ul>
<li>Files follow the structure of XML syntax.</li>
<li>Files are processed on client-side, thus can be embedded into HTML web page.</li>
<li>The more visitors a website gets, the more bandwidth the server would require.</li>
<li>Because XSLT is processed on client-side, no further computer power would be required.</li>
<li>Standard output types are HTML, PDF and XML.</li>
<li>Cheap and simple to maintain.</li>
</ul>
</div>
<h2>📜 In Comparison To JavaScript</h2>
<div class="content">
<h4>JavaScript is a scripting language which in most cases is running inside web browsers or servers and its main usage is to manipulate web pages, it is used for generating interactive websites.</h4>
<ul>
<li>JavaScript API makes it simple to steal personal data and information from visitors.</li>
<li>Files can be processed on both client-side and server-side.</li>
<li>JavaScript is insecure by design and dangerous to use.</li>
<li>The more visitors a website gets, the more bandwidth the server would require.</li>
<li>The more visitors a website gets, the more computer power the server would require, provided JavaScript also runs on the server.</li>
<li>Dynamic JavaScript websites are prone to experience security issues.</li>
<li>JavaScript is seriously abused. Much of the publicly available code, especially those in commonly used libraries, are very badly written. The code is abused to a level that the people who use the web, suffer from it in terms of performance, longer time wait and shorter battery time span.</li>
<li>Because the use of object prototypes is so poorly understood by most JavaScript developers, they abuse the language and write horrible code as a result.</li>
<li>As a result of all of the above, JavaScript is very expenssive to maintain in an efficient fashion.</li>
</ul>
</div>
<h2>🐘 In Comparison To PHP</h2>
<div class="content">
<h4>PHP is a scripting language which in most cases is running on servers and its main usage is to process web pages, it is also used for generating interactive websites.</h4>
<ul>
<li>Files follow the structure of HTML syntax.</li>
<li>Files are processed only on server-side, thus can not be embedded into HTML web page.</li>
<li>The more visitors a website gets, the more bandwidth the server would require.</li>
<li>The more visitors a website gets, the more computer power the server would require.</li>
<li>Expenssive and complex to maintain.</li>
</ul>
</div>
</div>
<span class="decor"></span>
<div id="plea" class="segment">
<h1>✒️ An Appeal From The Author</h1>
<div class="content">
<p>Greetings,</p>
<p>My name is Schimon Jehudah, I’m an Attorney at Law and Crypto Analyst, and author of StreamBurner News Reader (also “Newspaper” Userscript).</p>
<p>For many years, the technology generally known as RSS has been serving me and the companies I’ve been working with (financial houses and law firms) in both corporate and individual life.</p>
<p>Since its inception, advertising and media companies have been working together to eliminate this technology; mostly, by paying off software companies (namely, web browser vendors) as well as websites to ignore, neglect and even remove support for this technology.</p>
<p>This vital technology, which exists for over 20 years, is being oppressed for over a decade, particularly by advertising companies, news publishers, western governments and data mining websites (aka “social networks”) who want to turn more control of data flow to them and much less control to individuals, like you.</p>
<p>I advise you to share this technology with your family, friends and any acquaintance of yours, and boycott news outlets that refuse to provide web feeds.</p>
<p><b><i>I <u>don’t</u> ask you for financial support nor monetary donations;</i></b></p>
<p><b><i>I only ask YOU to share this technology with people you know.</i></b></p>
<p>Respectfully,</p>
<p>Schimon</p>
</div>
<div id="postscript">
<h2>📜 Postscript</h2>
<div class="content">
<p>This program was made by a person who is a Lawyer and has no “formal” technical trainings nor technical qualifications, so-called, neither in CSS, ECMA (JavaScript), HTML nor XSLT technologies.</p>
<p>Since a Lawyer can make this program from scratch in 28 the days (4 hours each day), then ask yourselves “Why do web browser vendors look for excuses to actively ignore this important web technology, if not because of payoffs?”</p>
</div>
<div>
<p>
StreamBurner project and source code can be found at
<a href="https://gitgud.io/sjehuda/streamburner">GitGud.io</a>
and Newspaper source code at
<a href="https://greasyfork.org/en/scripts/465932-newspaper">Greasy Fork</a>
and
<a href="https://openuserjs.org/scripts/sjehuda/Newspaper">OpenUserJS</a>
.
</p>
</div>
</div>
</div>
<span class="decor"></span>
<div id="matter" class="segment">
<h1>♿ Accessibility</h1>
<h2>One Of The Main Arguments For RSS Is Accessibility For The Blind And The Visually Impaired</h2>
<p>With RSS, as a standard format, all may enjoy a consistent fashion of content delivery and consumption across multiple websites.</p>
<p>And it includes the blind and the visually impaired, without having to be bound to specific apps or services that don't opperate in the same manner nor display contents in the same manner of similar services, which would always make it difficult and even impossible to communicate with, to those who are subjected to the need of different and special means of accessibility.</p>
<p>RSS makes everyone equally communicated and no one is left behind; yet ignoring, suppressing and even actively discouraging RSS would only leave the blind and the visually impaired excommunicated.</p>
<p>If web accessibility is a human right, then RSS must be so too.</p>
<h1>☺️ Mental Health</h1>
<h2>Using RSS Feeds Is Better For Your Mental Health</h2>
<p>Studies show that the ways we consume content today—especially when on social media websites—can negatively impact our lives and be significantly detrimental to our mental health. It's been linked to increased anxiety, depression, sleep disruption, and anti-social behavior.</p>
<p>And while RSS feeds don't eliminate these risks entirely, consuming news and social media content through RSS feeds, instead of through websites and apps directly, can combat some of these negative effects. <a href="https://openrss.org/blog/rss-feeds-may-be-better-for-your-mental-health">Continue reading…</a></p>
<h1>🧠 Free Your Mind</h1>
<h2>Because With RSS You're Not Easily Manipulated Nor Distracted</h2>
<p>Since RSS is a standard format, you are completely in control of the data you consume, without being subjected to distractions, targeted advertising and manipulations of sorts.</p>
<p>You are also in control of the appearance and fashion that content is being delivered to you, unlike dynamic web pages.</p>
<p>And if you don't like certain content you see, all you need to do is disable or delete the source feed from which that content resulted from. That's it!</p>
<h1>📶 Bandwidth Efficient</h1>
<h2>RSS Means Getting Data And Getting It Fast</h2>
<p>RSS is just an XML based text file that weight less than 10KB on average, meaning that scanning 1000 feeds would only cost you 10MB.</p>
<p>Read more about how to make RSS even more efficient at <a href="https://www.ctrl.blog/entry/feed-caching.html">Ctrl.blog</a>.</p>
<h1>🪲 We Are Not Bugs</h1>
<h2>Content Publishers Hate RSS Because They Can't Engage In User Tracking With It</h2>
<p>RSS feeds are just text with some bits attached, such as MP3 files for podcasts. There's no JavaScript or any of the fancy stuff for tracking you, just an IP address. And if you go through an aggregator there isn't even that.</p>
<p>They absolutely hate that. They'd much prefer if you used their websites or apps, where they can study you like a bug. (<a href="https://teddit.net/r/apple/comments/4xx1gv/apple_news_no_longer_supports_rss_feeds/d6jo3g9/#c">source</a>)</p>
<h1>🫵 You And Your Power</h1>
<h2>If You Want To, You Have The Power To Make Any Difference You Want</h2>
<p>You are advised not to participate in the miserable and unfortunate charade of publishers and web browser vendors to excommunicate blind people, visually impaired people and people with other disabilities for whom RSS is either their only or most useful fashion to get news and updates.</p>
<p>Take into your attention that some of the uses of RSS for the disabled are merely for the sake of their lives.</p>
<p>When we cut our RSS from them, we might cut our their lives, literally.</p>
<p>Join our endeavor to restore and promote RSS.</p>
</div>
<span class="decor"></span>
<div id="shame" class="segment">
<h1>👎 Hall of Shame</h1>
<h2>Discover Who Are Those Whom Want To Suppress RSS And The Technology Behind It</h2>
<p>Below is a list of brands of products and services with userbase of over 100K, and who used to provide access to RSS in the past.</p>
<p>The companies responsible for the following brands, pretend to be competitors when they are really cooperating and working together against progress, against people, against free flow of information, and even against their own users.</p>
<p>
<h2>#1 Mozilla</h2>
<h3>Playing the role of the selected (i.e. controlled) opposition of the web since 1998</h3>
<p>Mozilla is a brand unofficially owned and controlled by Google Inc. In other words, Mozilla is Google's plaything and marketing toy. It always has been and it always will be, as long as it pays the rent.</p>
<ul>
<li><a href="https://openrss.org/blog/browsers-should-bring-back-the-rss-button">Browsers removed the RSS Button and they should bring it back</a> (May 30, 2023)</li>
<li><a href="https://techdows.com/2018/10/mozilla-removes-rss-live-bookmarks-support-from-firefox-64.html">Mozilla removes RSS feed and Live Bookmarks support from Firefox 64</a> (October 12, 2018)</li>
<li><a href="https://www.zdnet.com/article/end-nears-for-rss-firefox-64-to-drop-built-in-support-for-rss-atom-feeds-says-mozilla/">Firefox 64 to drop built-in support for RSS, Atom feeds, says Mozilla</a> (October 15, 2018)</li>
<li><a href="https://www.bleepingcomputer.com/news/software/mozilla-to-remove-support-for-built-in-feed-reader-from-firefox/">Mozilla to Remove Support for Built-In Feed Reader From Firefox</a> (July 26, 2018)</li>
<li><a href="https://www.ghacks.net/2018/07/25/mozilla-plans-to-remove-rss-feed-reader-and-live-bookmarks-support-from-firefox/">Mozilla plans to remove RSS feed reader and Live Bookmarks support from Firefox</a> (July 25, 2018)</li>
<li><a href="https://camendesign.com/blog/rss_is_dying">RSS Is Dying, and You Should Be Very Worried</a> (January 3, 2011)</li>
</ul>
</p>
<p>
<h2>#2 Google</h2>
<h3>Be As I Preach, Not As I Am</h3>
<p>Google once had <a href="https://www.chromium.org/user-experience/feed-subscriptions/">a built-in RSS button</a> in the Google Chrome browser for desktop and in the source code of Chromium, the browser from which it's based.</p>
<p>However, the company has since removed the feature from the browser and no reason was given for its removal.</p>
<ul>
<li><a href="https://openrss.org/blog/browsers-should-bring-back-the-rss-button">Browsers removed the RSS Button and they should bring it back</a> (May 30, 2023)</li>
<li><a href="https://www.theverge.com/2021/10/8/22716813/google-chrome-follow-button-rss-reader">Google Reader is still defunct, but now you can ‘follow’ RSS feeds in Chrome on Android</a> (October 8, 2021)</li>
<li><a href="https://web.archive.org/web/20201108022203/https://support.google.com/googleplay/android-developer/answer/10177647">Developer Program Policy (To Silently Limit And Ban RSS Apps Using Falsified Premises)</a> (October 21, 2020)</li>
</ul>
</p>
<p>
<h2>#3 Apple</h2>
<!-- h3>Shiny Products With No Meaningful Functionality</h3 -->
<h3>Nonfunctional Shiny Products</h3>
<p>Apple's Safari browser once showed an RSS "Reader" button in the address bar for any web page that had an RSS feed available. Clicking that button opened the RSS feed in your chosen feed reader application or Safari by default.</p>
<p>On July 2012, the feature disappeared with no explanation from Apple on why it was removed. And despite <a href="https://archive.ph/ZYfP5">many complaints and requests to bring it back</a>, Apple refuses to restore it.</p>
<ul>
<li><a href="https://openrss.org/blog/browsers-should-bring-back-the-rss-button">Browsers removed the RSS Button and they should bring it back</a> (May 30, 2023)</li>
<li><a href="https://mjtsai.com/blog/2019/12/26/apple-news-no-longer-supports-rss/">Apple News No Longer Supports RSS</a> (December 26, 2019)</li>
<li><a href="https://www.imore.com/what-happened-rss-subscriptions-safari-ios-11">What happened to RSS subscriptions on Safari on iPhone?</a> (September 8, 2018)</li>
<li><a href="https://teddit.net/r/apple/comments/4xx1gv/apple_news_no_longer_supports_rss_feeds/">Apple News no longer supports RSS feeds</a> (August 16, 2016)</li>
<li><a href="https://www.macobserver.com/tmo/article/apples_safari_6_rss_blunder">Apple’s Safari 6 RSS Blunder</a> (August 8, 2012)</li>
</ul>
</p>
<p>
<h2>#4 Microsoft</h2>
<h3>We Are Just Good At Marketing</h3>
<p>Microsoft's Internet Explorer (now called Edge) once had an RSS subscribe button that displayed prominently when visiting a website that had an RSS feed.</p>
<p>After clicking the RSS button, it even showed you a helpful page allowing you to subscribe and manage the feed, all without leaving the browser.</p>
<p>Over time, the button got removed without warning.</p>
<ul>
<li><a href="https://openrss.org/blog/browsers-should-bring-back-the-rss-button">Browsers removed the RSS Button and they should bring it back</a> (May 30, 2023)</li>
<li><a href="https://www.bleepingcomputer.com/news/microsoft/microsoft-adds-new-rss-feed-for-security-update-notifications/">Microsoft adds new RSS feed for security update notifications</a> (October 12, 2022)</li>
</ul>
</p>
<h1>🎞️ Live Bookmarks Is A Smart Feature</h1>
<h2>They aren’t saying RSS is dead, they’re just actively removing support for it</h2>
<p>Seems to be a way to ensure that usage keeps on decreasing.</p>
<p>Live bookmarks is a smart feature. It allows you to see a whole range of sites and articles at a glance. I use it heavily.</p>
<p>This is a continued phony “progress” in Web browsers. (<a href="https://techdows.com/2018/10/mozilla-removes-rss-live-bookmarks-support-from-firefox-64.html#comment-171769">source</a>)</p>
<h1>🪲 We Are Not Bugs</h1>
<h2>Content Publishers Hate RSS Because They Can't Engage In User Tracking With It</h2>
<p>RSS feeds are just text with some bits attached, such as MP3 files for podcasts. There's no JavaScript or any of the fancy stuff for tracking you, just an IP address. And if you go through an aggregator there isn't even that.</p>
<p>They absolutely hate that. They'd much prefer if you used their websites or apps, where they can study you like a bug. (<a href="https://teddit.net/r/apple/comments/4xx1gv/apple_news_no_longer_supports_rss_feeds/d6jo3g9/#c">source</a>)</p>
<span class="decor"></span>
<h1>🏛️ Cartelization</h1>
<h2>Does This Reminiscing Price Fixing To You?</h2>
<p>If you already figured it would be worth to call to an Antitrust Division or Competition Commission, that could have be a good idea, if the government wasn't involved.</p>
<p>In case you have wondered… Yes, this is a coordinated effort of corporations, intelligence agencies, publishing platforms and governments to suppress RSS.</p>
<span class="decor"></span>
<h1>🎭 Bad Criminals Go To Jail, Good Criminals Go To Parliament</h1>
<h2>The Government Is A Problem, Not A Solution.</h2>
<p>History shows that governments and unions are always confounded to fail as people with great wealth and special interest will eventually find their way into public offices, be it by bribing, lobbying or actually sending puppets of their own to take a sit.</p>
<span class="decor"></span>
<h1>🚫 Boycott</h1>
<h2>The Only Solution Is Boycott</h2>
<p class="quote">The economic boycott is our means of self-defense --Samuel Untermyer</p>
<p>As a Jewish person, I can confidently state that boycott has been proven to be a successful, albeit ignoble, practice mean which has been adopted extensively by Jews and Zionists since the 19th century and has proven to be effective; I advise you to do the same.</p>
<p>Boycott all platforms and corporations that refuse or fail to provide a proper and easy access to RSS.</p>
<p>Please refer to <a href="#alternative" class="link"><u>alternative web browsers</u></a>.</p>
<p>There are always quality alternatives.</p>
</div>
<span class="decor"></span>
<div id="mozilla" class="segment">
<h1><span class="lizard">🦎</span> Red Lizard Assault On RSS And Followed Spasms On XSLT Technologies</h1>
<h2>Because Playing The Controlled Opposition Role Can Never Be Ridiculous More Than Enough</h2>
<p>Not for nothing it was one of the first pioneers to adopt RSS and the first one to drop it.</p>
<h2>Web Feeds</h2>
<h3>Upcoming Changes As A Public Affair</h3>
<p>During 2010, the company refers itself by the brand "Mozilla Foundation" (the company) has made a public display (i.e. phony public suggestion and mindstorm, so called) that proposed an idiotic notion that any individual is eligible to participate in proposing changes to its products, such as "Firefox" version 3.</p>
<p>To make that public display convincing, the company has made a "heatmap" page that displaye a new UI of "Firefox" against colorful numbers and figures, in order to make you to believe that the company is honest and transparent.</p>
<p>That public heatmap show and display took place for less than just a month. That's it!</p>
<p>It is important to note that the heatmap had first accounted for 7% - 15% of activity for RSS button and a week afterwords, it accounted for only 3% - 5% and then the heatmap results have been suddenly froze.</p>
<p>It is very likely that the heatmap was frozen because the statistics, albeit probably forged, were convenient to the company.</p>
<p>Finally, the company has replaced the RSS button by an RSS menu item, and whilst:</p>
<ul>
<li>The button included a visual and active indicator and took 2 - 3 clicks to get into web feeds;</li>
<li>The new menu item had no automated indication, requires the users to manually open the Bookmarks menu to check whether or not a feed is available;</li>
</ul>
<p>This task took 3 - 4 clicks and further mouse cursor move to get into web feeds;</p>
<p>The menu item has made RSS unemployable because, unlike the RSS button which provided a visual indicator for auto-discovered feeds, users had to actively check whether or not an RSS is available, which they would find out only after opening the Bookmarks menu;</p>
<p>This made most users to allocate the RSS auto-discovery task to desktop RSS Readers.</p>
<p>Whether you are a software engineer or not, this is simple to understand that this is not an improvement in UI. It is the complete opposite of improvement.</p>
<h3>Complete Removal Of Web Feeds</h3>
<p>On December 2018, the company has stated that the built-in RSS/Atom feed reader was removed from a software web browser branded as "Firefox" due to security concerns which were never proven. The statement is as follows:</p>
<p class="quote">"After reviewing the usage data and technical maintenance requirements for these features and taking into account alternative RSS/Atom feed readers already available to you, we have realized that these features have an outsized maintenance and security impact relative to their usage. Removing the feed reader and Live Bookmarks allows us to focus on features that make a greater impact." (<a href="https://support.mozilla.org/en-US/kb/feed-reader-replacements-firefox" rel="noreferrer">source</a>)</p>
<p>At the same moment, the company introduced a new built-in element called "Pocket" which connects to a centralized data mining platform referred to by the same name and is publicly presented as a news and content aggregating service; in reality, it is a centralized closed-source platform, not supporting interoperability, privacy unfriendly, and is subjected to potential massive data leaks which are both a privacy and a security concern.</p>
<h3>Heatmap and Karma</h3>
<h4>Hitting at 3% and getting 3%</h4>
<p>In the "Firefox Main Window Heatmap" so called, "Based on over 117,000 Windows 7 and Vista Test Pilot submissions from 7 days in July 2010" Mozilla determined that the RSS button has less than 3% of use.</p>
<p>The following is an excerpt from the heatmap:</p>
<ul>
<li>RSS</li>
<li>Used by 3% of beta users, with an average of 0.05 clicks per user.</li>
<li>Adv. 5% Int. 4% Beg. 3%</li>
</ul>
<p>It means nothing and constitutes no indication whatsoever, and this heatmap is biased from start to finish.</p>
<p>Here are some reasons:</p>
<ol>
<li>This given data may be arbitrarily forged.</li>
<li>Why was the earlier heatmap with 7% - 15% was ignored and overridden?</li>
<li> Was this postpone intentional and deliberate in order to make RSS to look lesser popular?</li>
<li>In what manner Advanced (Adv.) and Intermediate (Int.) users were counted, because most of them usually opt-out from data sharing of all kinds, even in "beta" releases.</li>
<li>How can one determine who is to be regarded as Advanced (Adv.), Intermediate (Int.) or Beginner (Beg.)?</li>
<li>Why Linux and other UNIX-based systems, which have the most Advanced (Adv.) and Intermediate (Int.) users, were excluded?</li>
<li>Why "beta" users are a premier indicator, let alone Beginners (Beg.), especially when RSS was not amongst the new features that would require testing by "beta" testers?</li>
<li>The heatmap includes number of (finger) clicks, but it doesn't include number of eye gazes, which is also an indicator.</li>
<li>Eyes and vision, albeit unmeasurable, are also part of the matter of UX.</li>
<li>
<p>The 3% indication might also mean that most people, like the author of this RSS program, <i>do</i> make an extensive use of RSS, but they don't need to click that button over and over, because:</p>
<ul>
<li>The visual indicator (feature) for the persence of RSS is just as important in and on itself.</li>
<li>
<p>"Click once, and get lifetime updates."</p>
<p>Once you are subscribed to an RSS feed with a feed reader that would <i>automatically</i> notify you for changes and new items, then you obviously don't need to press that icon again, because automation is what RSS was made for.</p>
<p>In other words, by the nature of RSS, it is not meant to be clicked oftentimes.</p>
<p>Hence equally comparison the RSS button against other components and ruthlessly setting the rate to 3% out of 100% just like other components (e.g. back and forward buttons) make no sense.</p>
<p>The fact that a tiny screw in an airplane isn't used at all times or at least at the same rate as a chair or a wheel, does not mean that the screw isn't important for the airplane to operate as expected and to provide a best flying experience.</p>
</li>
</ul>
</li>
</ol>
<p>Only a decade later, after this corporate-sponsored mischief, the market share of Firefox went further down to 3%.</p>
<p>The Karma. Oh, the Karma!</p>
<h2>XSLT</h2>
<p>While figuring out how to port an RSS to HTML addon to more web browsers, a nice Jewish attorney has referred to the XSLT technology to find out that the process was not only safer than JavaScript but was also more secure and private.</p>
<p>Compared to the PHP programming language and framework which typically work on the server-side, XSLT is exclusive to client-side, which means that all actions committed by XSLT are enclosed to the client machine, unlike PHP which actions are absolutely exposed to server.</p>
<p>After the company has removed support for RSS/Atom, the Jewish attorney has referred to the Userscript technology in order to facilitate transition accross web browsers.</p>
<p>While he continued programming a viable alternative for the long-term, he found out that the built-in Javascript programming library called <code>XSLTProcessor</code> works differently in the company's software, all in complete contradiction to the public documentation provided by the company.</p>
<p>In other words, he discovered that <code>XSLTProcessor</code>, which is also useful for the rendering of Web Feeds, is deliberately malformed and would specifically fail with processing XSLT data on Web Feeds such as Atom, RDF and RSS file types.</p>
<p>The findings are available at <a href="https://openuserjs.org/garage/Why_my_script_doesnt_work_with_Firefox#comment-1810ec600fe">openuserjs.org</a>.</p>
</div>
<span class="decor"></span>
<div id="advertising" class="segment">
<!-- h1>🚨 From Advertising To Totalitarianism</h1 -->
<!-- h1>🛜 RSS As An Autonomous Publishing Platform</h1 -->
<h1><span class="text-icon orange">RSS</span> As An Autonomous Publishing Platform</h1>
<h2>From Free Speech To Total Surveillance Promoted By Western Governments, And By The Advertisment And Censorship Industries</h2>
<p>Learn how the contemporary advertisement industry stifles our freedoms and self-eliminates itself by embodying an amalgamation of everything that is worst in advertising and in societies of unwell consumption.</p>
<p>Herein are arguments against the advertisement industry and the end result to where it tries to (mis)lead us.</p>
<h2>Preface</h2>
<p>The advertisement industry promotes user tracking, and illegal and unethical spying instruments which are applied extensively into newer and useless web standards such as HTML5. These newer standards are significantly simple to exploit against and target of individuals which makes the web more dangerous than ever before.</p>
<p>The advertisement industry doesn't like RSS because it is a standard that is not subjected to the vast tracking instruments that are applied today in HTML and JavaScript; furthermore, RSS is also lesser susceptible to targeted mind manipulation.</p>
<h2>The Mischievous Story Of Mozilla</h2>
<p>In 2009, the worldwide market share of the brand Mozilla has reached to 30%; and 80% of its annual revenue relied merely on promoting a specific search engine by determining it as a default search engine in its products.</p>
<p>In 2016, the worldwide market share of Mozilla has dropped below 10%; and its annual revenue couldn't be the same by doing the same.</p>
<p>In 2021, in a desperate move, Mozilla has foolishly partnered with advertising companies, very likely to provide advertisers with user data and monitoring web browser user activity, which resulted in an annual revenue which exceeded $450 million dollars.</p>
<p>In 2022, as a result of a yet another shenanigan of Mozilla, its worldwide market share went further below 3%.</p>
<p>Mozilla is a good lesson for the world to see that there's no such thing as a benevolent multi-billion or multi-million organization that really wants to promote free web.</p>
<p>The brand Mozilla can't be trusted.</p>
<h2>The False And Miserable Argument Perpetrated By Publishers And The Advertisement Industry</h2>
<p>In the recent five decades, publishers and the advertisement industry strive to convey a false narrative about the alleged mutuality and reciprocation of contents and advertisements, which basically says that "without advertisements there would be no incentive to create content" for the public to enjoy.</p>
<p>There are many fundamental problems with this statement, but we will nullify this statement in three parts.</p>
<ol>
<li>The content of the big publishing houses is shamefully, disgracefully, dishonorably and indecently of very low quality.</li>
<li>
<p>When applying advertisements as an integrated part of a revenue model of a content production business so to speak, there is a conflict of interest between generating quality content to generating revenue;</p>
<p>Which means that sooner or later a content producer will inevitably publish content that is either aberrational, defective, deficient, false, faulty, flawed, inadequate, wanting or even the lack thereof, which turns the content producer to a so called (i.e. false) content producer.</p>
</li>
<li>The conflict of interest extends to the censorship of contents that all or some advertisers don't want to be published (i.e. this is the the <i>lack</i> of content as written above).</li>
</ol>
<h2>Saying That Content Depends On Revenue Is Like Saying That Speech Depends On Revenue</h2>
<p>It's as if you wouldn't be able to say hello to your parent or mate unless you will generate revenue by doing so or display an advertisement while doing so.</p>
<p>To make this argument concise and successful, I will present the most obvious examples that would prove that content production is reciprocating with speech and ideology, not revenue.</p>
<ol>
<li>If you desire to publish anything, you will do it with or without advertisements.</li>
<li>
<p>Assuming you now live in a dystopian and hostile world as described in books like 1984, Brave New World and Fahrenheit 451, and you want to bring change by delivering and producing contents that would make this change that you so desire…</p>
<p>Would you really have avertisements or revenue generating scheme in mind? Of course you wouldn't! Rather, you will find anyway available to you to make this possible, with or without advertisements.</p>
</li>
</ol>
<p>To prove this point, below is a list of links to websites which the author (a Jewish Attorney) isn't approving of nor is opposing to, but is definitely supportive of you to freely exercise your speech and express your opinions or views however unpopular they might be.</p>
<p>The websites herein do prove that content production doesn't rely on advertisements nor has anyhing to do with revenue.</p>
<ul>
<li><a href="https://annas-archive.org/">Anna’s Archive</a></li>
<li><a href="https://copy-me.org/feed/">Copy-Me</a></li>
<li><a href="https://howbadismybatch.com/">How Bad is my Batch ?</a></li>
<li><a href="https://kopimi.com/kopimi/">Kopimi</a></li>
<li><a href="http://scripting.com/">Scripting News</a></li>
<li><a href="https://www.stormfront.org/forum/">Stormfront</a></li>
<li><a href="http://zundelsite.org/">The Zundelsite</a></li>
<li><a href="http://www.vanguardnewsnetwork.com/">Vanguard News Network</a></li>
<li><a href="http://www.wakeupkiwi.com/">Wake Up New Zealand</a></li>
<li><a href="http://whale.to/">WHALE</a></li>
</ul>
<p>The Zundelsite website is one of the most mirrored websites in history with hundreds of genuine copies from all over the world, and it was served freely <i>without</i> a single corporate advertisement.</p>
<p class="cyan">Ask yourself again, do we really need advertisements and jumping banners in order to enjoy the internet?</p>
<p>No. Of course, not!</p>
<h2>Free Speech Is At Peril But It Really Is About Total Control</h2>
<p>Supported by the advertisement industry, some organizations who are part of the censorship industry, have the audacity to claim authority and to actually <i>label</i> entities and websites—freely and without legal consequences—with terms such as "hate speech", so to speak.</p>
<p>Be it true or false, this is nothing more than a miserable way to deny the idea of <b>Web for Speech</b>, and a truly free web which is clean from advertisements and tracking.</p>
<p>Those who dare to label others with outlandish terms like "hate speech" or "white supremacist" etc., are danger to humanity and especially to Jewish people, like myself, in particular, because they use people of my kind to promote bad ideas, to say the least.</p>
<p>If Mr. Alex Linder of Vanguard News Network didn't exist, the government and those who hate free speech have all the resources they need in order to create an Alex Linder of their own that would function as a pawn in their game to point their fingers at, and consequently look up for fake and prefabricated excuses to legitimize baseless censorship and perverting the web with advertisements and tracking instruments.</p>
<p>Hate it or like it, in this day and age, providing you are interested in saving and protecting your freedoms, people like Alex Linder are your best trusted friends, not enemies.</p>
<h2>Advertising. Censorship. Tracking.</h2>
<p>It isn't really about speech, speech is a false pretext, it's about tracking and monitoring people, all in the sake of creating an anti-privacy and anti-freedom world; a world as depicted in the book 1984.</p>
<p>Censoring and speaking out against ideology websites, especially those which don't rely on advertisements, helps to strengthen the nonsensical and senseless notion that content publishing relies on revenue, which is clearly not the case in the websites presented above.</p>
<p>Do not fall the narrative of "hate speech" or other similar misleading ideas to suppress freedom of expression; it's a conniving plot that intends for you to participate in, and—without realizing—enforce censorship against yourselves by yourselves, in the end.</p>
<p class="cyan">And it all ties directly to the deliberate attempts to suppress the RSS technology.</p>
<p>And last, but not least… Greed always strikes against oneself.</p>
<p>Advertisements and marketing jobs do not coexist in totalitarianism, so when the advertisement industry fights against RSS, it fights for its own demise.</p>
<h2>Relevant Resources Concerning The Discussion Matter</h2>
<ul>
<li><a href="https://kopimi.com/kopimi/">The History of Kopimism</a> (April 21, 2023)</li>
<li><a href="https://reclaimthenet.org/the-thousands-of-ways-advertisers-target-your-family">The Secret Ways Advertisers Target Your Family, Including Based On Your Mood or Personality</a> (June 27, 2023)</li>
<li><a href="https://mashable.com/article/facebook-ad-targeting-by-mood">Ads will target your emotions, unless you are using RSS</a> (May 2, 2017)</li>
<li><a href="https://warpspire.com/posts/ad-supported">Ad Supported</a> (September 17, 2015)</li>
<li><a href="https://blog.mathieui.net/they-dont-want-my-money.html">They Don’t Want My Money</a> (July 20, 2013)</li>
<li><a href="https://newsome.org/2011/01/04/why-big-media-wants-to-kill-rss-and-why-we-shouldnt-let-it/">Why Big Media Wants to Kill RSS, and Why We Shouldn't Let It</a> (January 4, 2011)</li>
</ul>
</div>
<span class="decor"></span>
<div id="proof" class="segment">
<!-- h1><span class="text-icon orange">RSS</span> Is Relevant</h1 -->
<h1><span class="text-icon orange">RSS</span> Is Very Popular</h1>
<!-- h2>From Farmers To Statisticians - We All Need RSS</h2 -->
<h2>The Good, The Bad And The Ugly - From Farmers To Statisticians - Everyone Use RSS</h2>
<p>Below are resources that indicate the popularity and high demand of RSS.</p>
<h3>📈 Indications From Various Of Cases</h3>
<ul>
<li><a href="https://trends.builtwith.com/feeds/traffic/Entire-Internet">RSS is the most popular Feed technology on the Entire Internet</a> (June 18, 2023)</li>
<li>F-Droid: Over 50 mobile apps for <a href="https://search.f-droid.org/?q=Feed%20Reader" title="~15">Feed Reader</a>, <a href="https://search.f-droid.org/?q=Podcast" title="~18">Podcast</a> and <a href="https://search.f-droid.org/?q=RSS" title="~48">RSS</a> (June 18, 2023)</li>
<li><a href="https://www.androidpolice.com/2021/04/13/google-podcasts-hits-100-million-installs-on-android-proving-people-might-care-about-rss-after-all/">Podcasts App hits 100 million installs on Android, proving people care about RSS</a> (April 13, 2021)</li>
<li><a href="https://www.wired.com/story/rss-readers-feedly-inoreader-old-reader/">It's Time for an RSS Revival</a> (March 30, 2018)</li>
</ul>
<h3>💼 Enterprises & Organizations Using RSS</h3>
<p>If you don't deploy RSS in your website, be it a journal or a store, then you're very much behind.</p>
<h4>Enterprises</h4>
<ul>
<li><a href="https://www.96boards.org/feed.xml">96Boards</a></li>
<li><a href="https://aerospike.com/feed/">Aerospike</a></li>
<li><a href="https://www.archos.com/en/feed/">ARCHOS</a></li>
<li><a href="https://www.bulsatcom.bg/feed/">Bulsatcom Telecom</a></li>
<li><a href="https://git.zx2c4.com/cgit/atom/?h=master">cgit</a></li>
<li><a href="https://www.consolidated.com/DesktopModules/DnnForge%20-%20NewsArticles/Rss.aspx?TabID=1877&ModuleID=5685&MaxCount=25">Consolidated Communications</a></li>
<li><a href="https://www.daihatsu.com/rss.xml">DAIHATSU</a></li>
<li><a href="https://www.debian.org/News/news">debian Linux</a></li>
<li><a href="https://pod.diaspora.software/public/hq.atom">diaspora* HQ</a></li>
<li><a href="https://www.diva.exchange/en/feed/atom/">DIVA.EXCHANGE</a></li>
<li><a href="https://cdn.dnalounge.com/backstage/log/feed/">DNA Lounge</a></li>
<li><a href="https://www.dnalounge.com/calendar/dnalounge.rss">DNA Pizza</a></li>
<li><a href="https://www.edgedb.com/rss.xml">EdgeDB</a></li>
<li><a href="https://www.edrlab.org/feed/">EDRLab</a></li>
<li><a href="https://www.etsy.com/">Etsy Shop</a> (per brand/store)</li>
<li><a href="https://www.firestorm.ch/feed/">FireStorm ISP</a></li>
<li><a href="https://about.gitea.com/index.xml">Gitea</a></li>
<li><a href="https://about.gitlab.com/atom.xml">GitLab</a></li>
<li><a href="https://blog.hubspot.com/website/rss.xml">HubSpot</a></li>
<li><a href="https://www.idc.com/about/rss">IDC Corporate</a></li>
<li><a href="https://www.indiegogo.com/">Indiegogo</a> (per project)</li>
<li><a href="https://www.khadas.com/blog-feed.xml">Khadas</a></li>
<li><a href="https://www.kickstarter.com/">Kickstarter</a> (per project)</li>
<li><a href="https://kinsta.com/feed/">Kinsta</a></li>
<li><a href="https://lukesmith.xyz/lindy.xml">LindyPress.net</a></li>
<li><a href="https://mailchimp.com/help/troubleshooting-rss-in-campaigns/">Mailchimp</a></li>
<li><a href="https://blog.joinmastodon.org/index.xml">Mastodon</a></li>
<li><a href="https://joinmobilizon.org/en/news/feed.xml">Mobilizon</a></li>
<li><a href="https://www.moviepilot.de/rss/moviepilot-standard">Moviepilot</a></li>
<li><a href="https://mullvad.net/blog/feed/atom/">Mullvad</a></li>
<li><a href="https://oktv.se/sv/a.rss">OKTV</a></li>
<li><a href="https://www.olympus-global.com/rss/index.xml">OLYMPUS</a></li>
<li><a href="https://www.opensubtitles.com/">OpenSubtitles</a> (per film)</li>
<li><a href="https://joinpeertube.org/rss-en.xml">PeerTube</a></li>
<li><a href="https://www.procolix.com/feed/">ProcoliX</a></li>
<li><a href="https://sourceforge.net/blog/feed/">SourceForge</a></li>
<li><a href="https://sourcehut.org/blog/index.xml">sourcehut</a></li>
<li><a href="https://stackexchange.com/feeds/questions">Stack Exchange</a></li>
<li><a href="https://stackoverflow.com/feeds">Stack Overflow</a></li>
<li><a href="https://tailscale.com/blog/index.xml">Tailscale</a></li>
<li><a href="https://tpb.party/rss">The Pirate Bay</a></li>
<li><a href="https://www.timetecinc.com/feed/">Timetecinc</a></li>
<li><a href="https://tutanota.com/blog/feed.xml">Tutanota</a></li>
<li><a href="https://www.usembassy.gov/feed/" title="Replace www by country code name for a specific US Embassy">USEmbassy.gov</a></li>
<li><a href="https://zapier.com/blog/feeds/latest/">Zapier</a></li>
<li><a href="https://www.zendesk.com/public/assets/sitemaps/en/feed.xml">Zendesk</a></li>
<li><a href="https://blog.zorin.com/index.xml">Zorin</a></li>
</ul>
<h4>Content and Forum Management Systems</h4>
<p>With over a billion of users and over hundred of trillions of posts, you can choose from a variety of CMS or community and forum management software systems with support for syndication.</p>
<ul>
<li><a href="https://askbot.com/">Askbot</a></li>
<li><a href="https://www.discourse.org/">Discourse</a></li>
<li><a href="https://djangobb.org/">DjangoBB</a></li>
<li><a href="https://www.elkarte.net/">ElkArte</a></li>
<li><a href="https://fluxbb.org/">FluxBB</a></li>
<li><a href="https://invisioncommunity.com/">Invision Community (IP.Board)</a></li>
<li><a href="https://www.mediawiki.org/wiki/MediaWiki">MediaWiki</a></li>
<li><a href="https://mybb.com/">MyBB</a></li>
<li><a href="https://nodebb.org/">NodeBB</a></li>
<li><a href="https://camendesign.com/nononsense_forum">NoNonsense Forum</a></li>
<li><a href="https://www.phorum.org/">Phorum</a></li>
<li><a href="https://www.phpbb.com/">phpBB</a></li>
<li><a href="https://proboards.com/">ProBoards</a></li>
<li><a href="https://www.redmine.org/">Redmine</a></li>
<!-- li><a href="http://textboard.i2p/">SchemeBBS</a></li -->
<!-- li><a href="https://wakaba.c3.cx/shii/shiichan">Shiichan Anonymous BBS</a></li -->
<li><a href="https://simplemachines.org/">Simple Machines Forum</a></li>
<!-- li><a href="https://syndie.de/">Syndie</a></li -->
<li><a href="https://www.vbulletin.com/">vBulletin</a></li>
<li><a href="https://xenforo.com/">XenForo</a></li>
</ul>
<p><i>This document shows you that "free and open source software" are also subjected to a bad type of politics, yet it is recommended to choose open source forum software, just in case some feature is gone and you desire to bring it back. If you choose a proprietary software, please do make sure that you have a convenient way to import, export and backup all data.</i></p>
<h4>Governments</h4>
<div>🇧🇿 Belize</div>
<ul>
<li><a href="https://www.nationalassembly.gov.bz/feed/">National Assembly of Belize</a></li>
</ul>
<div>🇨🇺 Cuba</div>
<ul>
<li><a href="https://www.parlamentocubano.gob.cu/index.php/rss.xml">National Assembly of People's Power - Asamblea Nacional del Poder Popular</a></li>
</ul>
<div>🇩🇴 Dominican Republic</div>
<ul>
<li><a href="https://www.senadord.gob.do/feed/">Senate - Senado de la República Dominicana</a></li>
</ul>
<div>🇪🇪 Estonia</div>
<ul>
<li><a href="https://www.valitsus.ee/en/rss-feeds/rss.xml">Eesti Vabariigi Valitsus</a></li>
<li><a href="https://www.riigikogu.ee/telli-rss/">Riigikogu</a></li>
</ul>
<div>🇩🇪 Germany</div>
<ul>
<li><a href="https://www.bundesrat.de/DE/service-navi/rss/rss-node.html">German Federal Council - Bundesrat</a></li>
<li><a href="https://www.bundestag.de/static/appdata/includes/rss/aktuellethemen.rss">German Parliament - Bundestages</a></li>
<span>Ministries</span>
<li><a href="https://www.bmbf.de/bmbf/de/service/aktuelle-nachrichten-im-rss-newsfeed.html">Federal Ministry of Education and Research (BMBF)</a></li>
<li><a href="https://prototypefund.de/feed/">Prototype Fund</a></li>
</ul>
<div>🇭🇰 Hong Kong</div>
<ul>
<li><a href="https://www.fso.gov.hk/rss/fsblog_rss_e.xml">Financial Secretary</a></li>
<li><a href="https://www.gov.hk/en/about/rsshelp.htm">GovHK</a></li>
<li><a href="https://www.elegislation.gov.hk/verified-chapters!en.rss.xml">Hong Kong e-Legislation</a></li>
</ul>
<div>🇮🇸 Iceland</div>
<span>Icelandic Parliament</span>
<ul>
<li><a href="https://www.althingi.is/rss.xml">Alþingi</a></li>
<li><a href="https://www.althingi.is/um-althingi/skrifstofa-althingis/jafnlaunavottun/rss.xml">Alþingi - Jafnlaunavottun</a></li>
</ul>
<div>🏴 Idaho (USA)</div>
<ul>
<li><a href="https://legislature.idaho.gov/feed/">Idaho State Legislature</a></li>
</ul>
<div>🇮🇷 Iran</div>
<ul>
<li><a href="https://en.parliran.ir/eng/en/allrss">Islamic Parliament of IRAN</a></li>
<li><a href="https://www.president.ir/rss">President of Iran</a></li>
</ul>
<div>🇮🇪 Ireland</div>
<span>Houses of the Oireachtas</span>
<ul>
<li><a href="https://www.oireachtas.ie/en/rss/dail-schedule.xml">Dail Schedule</a></li>
<li><a href="https://www.oireachtas.ie/en/rss/press-releases.xml">Press Releases</a></li>
<li><a href="https://www.oireachtas.ie/en/rss/committee-schedule.xml">Committee Schedule</a></li>
<li><a href="https://www.oireachtas.ie/en/rss/seanad-schedule.xml">Seanad Schedule</a></li>
</ul>
<div>🇮🇲 Isle of Man</div>
<ul>
<li><a href="https://www.gov.im/news/RssNews">Isle of Man Government News</a></li>
</ul>
<div>🇯🇴 Jordan</div>
<ul>
<li><a href="http://senate.jo/ar/rss.xml">Jordanian Senate - مجلس الأعيان</a></li>
<li><a href="https://representatives.jo/AR/Pages/خدمة_RSS">Jordanian Parliament - مجلس النواب الأردني</a></li>
</ul>
<div>🇱🇺 Luxembourg</div>
<ul>
<li><a href="https://www.chd.lu/en/podcast">Chamber of Deputies</a></li>
</ul>
<div>🇲🇹 Malta</div>
<ul>
<li><a href="https://www.parlament.mt/en/rss/?t=calendar">Parliamentary Calendar</a></li>
</ul>
<div>🇳🇱 Netherlands</div>
<ul>
<li><a href="https://www.government.nl/rss">Government of the Netherlands</a></li>
<li><a href="https://www.rijksoverheid.nl/rss">Rijksoverheid.nl</a></li>
</ul>
<div>🇳🇴 Norway</div>
<ul>
<li><a href="https://www.stortinget.no/no/Stottemeny/RSS/">Parliament of Norway - stortinget.no</a></li>
</ul>
<div>🇵🇭 Philippines</div>
<ul>
<li><a href="https://parliament.bangsamoro.gov.ph/feed/">Bangsamoro Parliament</a></li>
<li><a href="https://econgress.gov.ph/feed/">Congress of the Philippines</a></li>
</ul>
<div>🇸🇷 Suriname</div>
<ul>
<li><a href="https://dna.sr/rss-feed/">National Assembly - De Nationale Assemblee</a></li>
</ul>
<div>🇨🇭 Switzerland</div>
<ul>
<li><a href="https://www.admin.ch/gov/de/start/dokumentation/medienmitteilungen/rss-feeds.html">Swiss Federal Council - Der Bundesrat</a></li>
</ul>
<div>🇸🇾 Syria</div>
<ul>
<li><a href="http://parliament.gov.sy/arabic/index.php?node=17">The People's Assembly of Syria - مجلس الشعب السوري</a></li>
</ul>
<div>🇹🇹 Trinidad and Tobago</div>
<ul>
<li><a href="https://www.ttparliament.org/feed/">Parliament of the Republic</a></li>
</ul>
<div>🏴 Utah (USA)</div>
<ul>
<li><a href="https://www.utah.gov/whatsnew/rss.xml">Utah.gov News Provider</a></li>
</ul>
<h4>Legal</h4>
<ul>
<li><a href="https://www.daihatsu.com/rss.xml">DAIHATSU</a> (Recovering)</li>
<li><a href="https://www.elegislation.gov.hk/verified-chapters!en.rss.xml">Hong Kong e-Legislation</a></li>
<li><a href="https://www.madofftrustee.com/rss.php">Madoff Trustee</a></li>
</ul>
<h4>Organizations</h4>
<ul>
<li><a href="https://www.ccc.de/de/rss/updates.xml" title="A highly accredited and respectful organization from Germany">Chaos Computer Club</a></li>
<li><a href="https://static.fsf.org/fsforg/rss/news.xml">Free Software Foundation</a></li>
<li><a href="https://freebsdfoundation.org/feed/">FreeBSD Foundation</a></li>
<li><a href="https://freedomboxfoundation.org/news/archive/index.atom">FreedomBox Foundation</a></li>
<li><a href="https://planet.gnu.org/rss20.xml">GNU</a></li>
<li><a href="https://www.linaro.org/feed.xml">Linaro</a></li>
<li><a href="https://nlnet.nl/feed.atom">NLnet Foundation</a></li>
<li><a href="https://prototypefund.de/feed/">Prototype Fund</a></li>
<li><a href="https://sfconservancy.org/feeds/omnibus/">The Software Freedom Conservancy</a></li>
</ul>
<h4>Major Publications</h4>
<ul>
<li><a href="http://feeds.arstechnica.com/arstechnica/index">Ars Technica</a></li>
<li><a href="https://www.breitbart.com/feed">Breitbart</a></li>
<li><a href="https://www.dailytelegraph.com.au/help-rss">Daily Telegraph</a></li>
<li><a href="https://www.dcnewsnow.com/feed/">DC News Now</a></li>
<li><a href="https://www.spiegel.de/dienste/besser-surfen-auf-spiegel-online-so-funktioniert-rss-a-1040321.html">DER SPIEGEL</a></li>
<li><a href="https://www.gawker.com/rss">Gawker</a></li>
<li><a href="https://www.hindustantimes.com/rss">Hindustan Times</a></li>
<li><a href="https://www.ksl.com/rss/news">KSL News</a></li>
<li><a href="https://www.lemonde.fr/actualite-medias/article/2019/08/12/les-flux-rss-du-monde-fr_5498778_3236.html">Le Monde</a></li>
<li><a href="https://www.linux-magazine.com/rss/feed/lmi_news">Linux Magazine</a></li>
<li><a href="https://www.news.com.au/help/rss-feeds">news.com.au</a></li>
<li><a href="https://newatlas.com/rss">New Atlas</a></li>
<li><a href="https://newsblenda.com/feed/">Newsblenda</a></li>
<li><a href="https://api.ntd.com/feed">NTD Television</a></li>
<li><a href="https://www.pcworld.com/feed">PCWorld</a></li>
<li><a href="https://www.phoronix.com/rss.php">Phoronix</a></li>
<li><a href="https://www.prnewswire.com/rss/">PR Newswire</a></li>
<li><a href="https://www.presstv.ir/rss.xml">Press TV</a></li>
<li><a href="https://www.rt.com/rss/">RT (Russia Today)</a></li>
<li><a href="https://rss.slashdot.org/Slashdot/slashdotMain">Slashdot</a></li>
<li><a href="https://substack.com/">Substack</a></li>
<li><a href="https://www.sltrib.com/rss/">The Salt Lake Tribune</a></li>
<li><a href="https://www.theverge.com/rss/index.xml">The Verge</a></li>
<li><a href="https://thewest.com.au/rss-feeds">The West Australian</a></li>
<li><a href="https://torrentfreak.com/feed/">TorrentFreak</a></li>
<li><a href="https://variety.com/feed/">Variety</a></li>
<li><a href="https://www.ziffdavis.com/feed">Ziff Davis</a></li>
</ul>
<h4>Propaganda and PsyOp Websites Sponsored by Intelligence Agencies</h4>
<h5>Intelligence and foreign controlled disinformation publications</h5>
<p>The following agent publications below pretend to be truthful news outlets, when in fact, these are funded and controlled either by internal or foreign intelligence or military agencies, and their purpose is to disrupt and subvert your mind with bogus information, not otherwise.</p>
<p>The fact that these compromised publications (so called) make use of RSS, realizes the obvious importance of the RSS technology.</p>
<p><i>The resources below are listed for realization purposes only, and we further advise you not to subscribe to any of these harmful publications.</i></p>
<ul>
<li><a href="https://www.aljazeera.com/xml/rss/all.xml">Al Jazeera</a></li>
<li><a href="http://feeds.bbci.co.uk/news/rss.xml">BBC</a></li>
<li><a href="https://www1.cbn.com/app_feeds/rss/news/rss.php?section=world">CBN</a></li>
<li><a href="https://www.cbsnews.com/latest/rss/main">CBS</a></li>
<li><a href="https://www.cnbc.com/rss-feeds/">CNBC</a></li>
<li><a href="https://edition.cnn.com/services/rss/">CNN</a></li>
<li><a href="https://www.foxnews.com/story/foxnews-com-rss-feeds">FOX</a></li>
<li><a href="https://gizmodo.com/rss">Gizmodo</a></li>
<!-- li><a href="https://news.google.com/rss">Google News</a></li -->
<li><a href="https://www.hindustantimes.com/rss">Hindustan Times</a></li>
<li><a href="https://www.infowars.com/rss.xml">Infowars</a></li>
<li><a href="https://www.nasa.gov/rss-feeds/" title="SA(T)AN">NASA</a></li>
<li><a href="https://feeds.npr.org/1001/rss.xml">NPR</a></li>
<li><a href="https://www.rollingstone.com/feed/">Rolling Stone</a></li>
<li><a href="https://scitechdaily.com/feed/">SciTechDaily</a></li>
<li><a href="https://news.sky.com/info/rss">SKY</a></li>
<li><a href="https://theathletic.com/feeds/rss/news/">The Athletic</a></li>
<li><a href="https://feeds.thedailybeast.com/rss/articles">The Daily Beast</a></li>
<li><a href="https://www.dailymail.co.uk/home/rssMenu.html">The Daily Mail Online</a></li>
<li><a href="https://www.theguardian.com/uk/rss">The Guardian</a></li>
<li><a href="https://www.nytimes.com/rss">The New York Times</a></li>
<li><a href="https://www.newyorker.com/about/feeds?verso=true">The New Yorker</a></li>
<li><a href="https://www.wsj.com/news/rss-news-and-feeds">The Wall Street Journal</a></li>
<li><a href="https://www.washingtonpost.com/rss">The Washington Post</a></li>
<li><a href="https://www.state.gov/feed/">U.S. Department of State</a></li>
<li><a href="https://variety.com/feed/">Variety</a></li>
<li><a href="https://www.mediawiki.org/wiki/MediaWiki">Wikimedia Foundation</a> (It is a <a href="https://www.fivefilters.org/2023/glenn-greenwald-on-wikipedia-bias/"><u>biased</u> propaganda</a>)</li>
<!-- li><a href="https://news.yahoo.com/rss/">Yahoo News</a></li -->
</ul>
<p>And if you don't make use of RSS yet, then you definitely need to start using it now.</p>
<p><i>Don't be left behind. Use RSS.</i></p>
<p>And if you don't already have a website, then <a href="https://videos.lukesmith.xyz/w/9aadaf2f-a8e7-4579-913d-b250fd1aaaa9"><u>Get a Website Now!</u> <b>Don't be a Web Peasant!</b></a></p>
</div>
<span class="decor"></span>
<div id="alternative" class="segment">
<h1>🖥️ Alternative Vendors</h1>
<!-- h2>You And Your Friends Deserve To Have Access To RSS.</h2 -->
<h2>You And Your Friends Deserve To Have A First-Class RSS Experience Baked In To Your Browser So Well Your Grandmother Could Use It —<a href="https://camendesign.com/blog/rss_is_dying">Kroc</a></h2>
<p>Below are web browsers with built-in support for RSS web feeds, and as such are worthy of the name Web Browser.</p>
<h1>🦁 <a href="https://brave.com/brave-today-rss/">Brave</a></h1>
<h2>Secure, Fast, And Private Web Browser.</h2>
<p>Brave is on a mission to protect your privacy online. We make a suite of internet privacy tools—including our browser and search engine—that shield you from the ads, trackers, and other creepy stuff trying to follow you across the web.</p>
<p>Brave News, the privacy-preserving news reader integrated into the Brave browser, now features RSS feeds for users.</p>
<h1>🦎 <a href="http://kmeleonbrowser.org/">K-Meleon</a></h1>
<h2>The Browser You Control.</h2>
<p>K-Meleon is a lightweight, customizable, open-source web browser. It's designed for Microsoft Windows (Win32) operating systems.</p>
<p>K-Meleon can use the secure Goanna engine based on Mozilla's Gecko layout engine or Gecko itself. Support for legacy operating systems, low RAM usage, a macro language to customize the browser, and privacy-respecting defaults are among K-Meleon's unique features.</p>
<p>K-Meleon can run also on Windows 2000, Windows XP and <a href="https://reactos.org/">ReactOS</a>.</p>
<h1><span class="red-color">𝐎</span> <a href="https://www.opera.com/features/news-reader">Opera</a></h1>
<h2>Faster, Safer, Smarter.</h2>
<p>Experience faster, distraction-free browsing with Ad blocking, and browse privately. Smoothly sync your data and send files between Opera on Mac, Windows, Linux, iOS, Android, and Chromebook.</p>
<p><i>One of the most popular feature requests we’ve been getting for our browser has been to add an RSS reader.</i></p>
<p>Your feedback matters a lot to us when we’re planning our roadmap. As such, Opera’s news reader now supports RSS feeds, too!</p>
<h1>🦦 <a href="https://otter-browser.org/">Otter</a></h1>
<h2>Controlled By The User, Not Vice Versa.</h2>
<p>Otter Browser aims to recreate the best aspects of the classic Opera (12.x) UI using Qt5.</p>
<p>Otter Browser aims to recreate the best aspects of Opera 12 and to revive its spirit. We are focused on providing the powerful features power users want while keeping the browser fast and lightweight.</p>
<p>We also learned from history and decided to release the browser under the GNU GPL v3.</p>
<h1>🌕 <a href="https://www.palemoon.org/">Pale Moon</a></h1>
<h2>Your browser, Your way.</h2>
<p>Pale Moon is an Open Source, Goanna-based web browser, focusing on efficiency and customization.</p>
<p>Pale Moon offers you a browsing experience in a browser completely built from its own, independently developed source that has been forked off from Firefox/Mozilla code a number of years ago, with carefully selected features and optimizations to improve the browser's stability and user experience, while offering full customization and a growing collection of extensions and themes to make the browser truly your own.</p>
<h1><span class="orange-color">𝓥</span> <a href="https://vivaldi.com/features/feed-reader/">Vivaldi</a></h1>
<h2>Powerful. Personal. Private.</h2>
<p>Get unrivaled customization options and built-in browser features for better performance, productivity, and privacy.</p>
<p>Vivaldi Feed Reader helps you build a private news feed based on your interests, not what you do online.</p>
</div>
<span class="decor"></span>
<div id="support" class="segment">
<h1>🧐 Taking Action</h1>
<h2>The Things You Can Do To Promote RSS</h2>
<p>This is a mission which we deserve and should be most honored to take.</p>
<ul>
<li>Talk with your friends about the benefits of RSS (i.e. Web Feeds). That would be a good table talk.</li>
<li>Use an RSS reader. (See list of programs in pages <a href="#software" class="link"><u>software</u></a> and <a href="#alternative" class="link"><u>web browsers</u></a>)</li>
<li>Teach other people to use RSS readers. Blog about RSS readers. And about other open web technologies and apps.</li>
<li>Write a blog instead of posting to “social networks”. (You can always re-post to those places if you want to extend your reach.) <a href="https://micro.blog/">Micro.blog</a> is one good place to get going, and it’s not the only one.</li>
<li>Contact <a href="http://unicode.org/pending/proposals.html"><u>unicode.org</u></a> and promote the initiative for the <a href="https://github.com/vhf/unicode-syndication-proposal"><u>Proposal to Include Web Syndication Symbol</u></a>.</li>
<li>Donate to charities that promote literacy.</li>
<li>Tell other people about cool blogs and feeds you’ve found.</li>
<li>Support independent podcast apps and desktop programs.</li>
<li>Support indie developers. Even though software like Falkon, Newspaper, postmarketOS etc. are free, software are most definitely not free to make, and it costs time and effort to keep improving them. It’s worth it.</li>
<li>Finally: report bugs and make feature requests on our Issues tracker. We also need testers, writers, and, especially, people who are willing to talk things over. Most of software development is just making decisions, and we appreciate all the help we can get!</li>
</ul>
</div>
<span class="decor"></span>
<div id="resources" class="segment">
<h1>🔗 Related Resources And Campaigns</h1>
<h2>The links below are not associated with RSS Task Force</h2>
<ul>
<li><a href="https://aboutfeeds.com/">About Feeds</a></li>
<li><a href="https://www.ctrl.blog/topic/syndication-feeds.html">Ctrl.blog</a></li>
<li><a href="https://feedpress.com/">FeedPress</a></li>
<li><a href="https://rss.feedspot.com/">FeedSpot RSS Database</a></li>
<li><a href="https://www.fivefilters.org/">FiveFilters</a></li>
<li><a href="https://follow.it/intro">follow.it</a></li>
<li><a href="https://www.netvibes.com/">Netvibes</a></li>
<li><a href="https://openrss.org/blog">Open RSS Blog</a></li>
<li><a href="https://www.repeatserver.com/">RepeatServer</a></li>
<li><a href="https://www.rssing.com/about.php">RSSing</a></li>
</ul>
<span class="decor"></span>
<h1>🛠️ Useful Projects</h1>
<h2>Projects You Might Find Useful</h2>
<ul>
<li><a href="https://xml.apache.org/cocoon/">Apache Cocoon</a></li>
<li><a href="https://feedparser.readthedocs.io/">feedparser</a></li>
<li><a href="http://xmlsoft.org/">libxml2</a></li>
<li><a href="https://libxmlplusplus.sourceforge.net/">libxml++</a></li>
<li><a href="https://lxml.de/">lxml</a></li>
<li><a href="https://openuserjs.org/scripts/sjehuda/Newspaper">Newspaper</a></li>
<li><a href="https://www.saxonica.com/">Saxonica</a></li>
<li><a href="https://gitgud.io/sjehuda/streamburner">StreamBurner</a></li>
<li><a href="https://github.com/DesignLiquido/xslt-processor">XSLT-processor</a></li>
</ul>
<span class="decor"></span>
<h1>🗞️ Articles About Openness And Web Feeds</h1>
<h2>Good Reads About Web Feeds</h2>
<ul>
<li><a href="https://openrss.org/rss-feeds">RSS Feeds. What? Why? How?</a></li>
<li><a href="https://danielmiessler.com/p/its-time-to-get-back-into-rss/">It’s Time to Get Back Into RSS</a></li>
<li><a href="https://danielmiessler.com/p/atom-rss-why-we-should-just-call-them-feeds-instead-of-rss-feeds/">Atom and RSS: Why We Should Just Call Them “Feeds” Instead of “RSS” Feeds</a></li>
<li><a href="https://www.wired.com/story/podcasts-speech-thought-history-enlightenment/">Podcasts Could Unleash a New Age of Enlightenment</a> (June 16, 2023)</li>
<li><a href="https://openrss.org/blog/browsers-should-bring-back-the-rss-button">Browsers removed the RSS Button and they should bring it back</a> (May 30, 2023)</li>
<li><a href="https://zapier.com/blog/how-to-use-rss-feeds/">How to use RSS feeds to boost your productivity</a> (January 13, 2021)</li>
<li><a href="https://danielmiessler.com/p/how-i-organize-my-rss-feeds-2021-edition/">How I Organize my RSS Feeds, 2021 Edition</a></li>
<li><a href="https://www.techadvisor.com/article/741233/what-is-an-rss-feed.html">What is an RSS feed?</a> (September 15, 2020)</li>
<li><a href="https://copyblogger.com/what-the-heck-is-rss/">What the Heck is RSS? And why should I care?</a> (May 26, 2020)</li>
<li><a href="https://www.wired.com/story/rss-readers-feedly-inoreader-old-reader/">It's Time for an RSS Revival</a> (March 30, 2018)</li>
<li><a href="https://camendesign.com/rss_a_reply">RSS: A Reply</a> (January 14, 2011)</li>
<li><a href="http://scripting.com/stories/2011/01/08/youCanGetAnythingYouWant.html#p4214">You can get anything you want...</a> (January 8, 2011)</li>
<li><a href="https://www.spiegel.de/netzwelt/web/streit-um-internet-nutzung-komfort-schlaegt-freiheit-a-737748.html">Streit um Internet-Nutzung: Komfort schlägt Freiheit - DER SPIEGEL</a> (January 7, 2011)</li>
<li><a href="https://web.archive.org/web/20110108063442/http://buddycloud.com/cms/content/we-are-aol-days-social-networking">We are in the AOL days of Social Networking</a> (January 6, 2011)</li>
<li><a href="http://scripting.com/stories/2011/01/05/upcomingTheMinimalBlogging.html">Upcoming: The minimal blogging tool</a> (January 5, 2011)</li>
<li><a href="https://techcrunch.com/2011/01/03/techcrunch-twitter-facebook-rss/">Content Publishing Platforms Really Are Killing RSS</a> (January 4, 2011)</li>
<li><a href="http://scripting.com/stories/2011/01/04/whatIMeanByTheOpenWeb.html#p4111">What I mean by "the open web"</a> (January 4, 2011)</li>
<li><a href="https://newsome.org/2011/01/04/why-big-media-wants-to-kill-rss-and-why-we-shouldnt-let-it/">Why Big Media Wants to Kill RSS, and Why We Shouldn't Let It</a> (January 4, 2011)</li>
<li><a href="https://camendesign.com/blog/rss_is_dying">RSS Is Dying, and You Should Be Very Worried</a> (January 3, 2011)</li>
<li><a href="http://scripting.com/stories/2011/01/03/rebootingRssRevisited.html">Rebooting RSS, revisited</a> (January 3, 2011)</li>
<li><a href="http://scripting.com/stories/2010/09/27/howToUseOpenStandards.html">How to use open formats</a> (September 27, 2010)</li>
<li><a href="http://scripting.com/stories/2010/09/24/whyUseRss.html">Why use RSS?</a> (September 24, 2010)</li>
<li><a href="http://scripting.com/stories/2010/09/13/howToRebootRss.html">How to reboot RSS</a> (September 13, 2010)</li>
<li><a href="http://scripting.com/stories/2010/07/21/howToDoOpenDevelopentWorkR.html">How to do open development work, Rules 1 & 2</a> (July 21, 2010)</li>
<li><a href="http://scripting.com/stories/2010/09/22/rebootingRssInterlude.html">Rebooting RSS, interlude</a> (September 22, 2010)</li>
<!-- li><a href="http://scripting.com/stories/2010/09/20/rebootingRssShortNamesForF.html">Rebooting RSS, short names for feeds</a> (September 20, 2010)</li -->
<li><a href="http://scripting.com/stories/2010/09/18/rebootingRssTwoKeyPoints.html">Rebooting RSS, pulling it together</a> (September 18, 2010)</li>
<li><a href="http://scripting.com/stories/2010/09/18/yesVirginiaThereAreTwoWays.html">Yes, Virginia, there are two ways to read RSS</a> (September 18, 2010)</li>
<li><a href="http://scripting.com/stories/2010/09/16/theArchitectureOfRss.html">The Architecture of RSS</a> (September 16, 2010)</li>
<li><a href="https://www.xml.com/pub/a/2002/12/18/dive-into-xml.html">What Is RSS</a> (December 18, 2002)</li>
<li><a href="https://web.archive.org/web/20030210215820if_/http://www.oreillynet.com/cs/user/view/wlg/2426">Last-minute business RSS</a> (December 14, 2002)</li>
</ul>
<span class="decor"></span>
<h1>🏗️ Upcoming Projects</h1>
<h2>I need some help here…</h2>
<ul>
<li>Restoring <a href="https://web.archive.org/web/20011025203909if_/http://www.syndic8.com:80/">Syndic8</a></li>
<li>Delivering <a href="https://web.archive.org/web/20011025203909if_/http://www.syndic8.com:80/">Syndic8</a> with BitTorrent or IPFS and adding API for Feed Readers</li>
</ul>
</div>
<span class="decor"></span>
<div id="force" class="segment">
<h1>👨✈️ Welcome Aboard</h1>
<h2>We Are RSS Task Force</h2>
<p>We are glad you have made it here.</p>
<p>We are a unified, undefined and united group of people of all creeds and races from all over the world.</p>
<p>We originally formed the RSS Task Force in order to maintain, serve and improve data flow to and from small and medium enterprises, and since 2021 we have expanded our cause towards all entities of all types and sorts, including individuals with disabilities.</p>
<p>The RSS Task Force was founded in 2018.</p>
</div>
<span class="decor"></span>
<div id="disclaimer" class="segment">
<h1>🧑⚖️ Disclaimer</h1>
<h2>As If I Have A Choice</h2>
<p>The content presented here, in part, is merely in the frame of <i>external</i> analyses of the last couple of decades in the realm of the internet and the brands that were once great (i.e. major) in the internet.</p>
<p>Nothing in this document may be given as a fact, and everything must be taken at face value and as a satiric content in nature for entertainment purposes only.</p>
<p>Fact checking, if is a concern, must be done each to oneself.</p>
<p>God Bless!</p>
</div>
<span class="decor"></span>
<div id="memory" class="segment">
<h1>🎖️ In Memory Of Mr. Anderson</h1>
<h2>Rest In Peace</h2>
<p>Alex James Anderson (1992-2015) was a good friend of mine, albeit we have never met in person.</p>
<p>Alex is the one that encouraged me to continue and improve an older RSS project called StreamBurner.</p>
<p>Without Alex, StreamBurner and this project wouldn't exist in their current forms.</p>
<span id="personal">
<p>Alex,</p>
<p>it's sad for me to have you taken from this world so soon, and it is sad for me that you are no longer with us.</p>
<p>I'm wishing you and your family the best.</p>
<p>In the hope to seeing you in the next world,</p>
<p>Schimon</p>
</span>
<p>Thank you, Alex.</p>
<span class="decor"></span>
<h1>💭 A Quote From Alex</h1>
<h2>A Statement He Made On XMPP</h2>
<div class="quote">
<p>(The syndication technology behind ActivityPub, Atom and RSS is)</p>
<p>"The very simple technology that Big Corps, Fortune 500, Mozilla et al. are jealously trying to oppress and conceal from you";</p>
<p>"Because it unleashes the embodiment of what open web should really be, a truely free-speech-driven web."</p>
<p>"The problem, for them, is that if true communication openness would flourish, it might have the "dire" potential, at least for them, to put many of them off the market".</p>
<p>-- Alex J. Anderson</p>
<span class="decor"></span>
</div>
</div>
<div id="buttons">
<button class="back-to-menu">Menu</button>
<button class="return-to-feed">Return</button>
</div>
</div>`,
helpGecko = `
<div id="open-in-browser" class="segment">
<h1>🧩 Open in Browser (Rule Set)</h1>
<div class="content">
<ol>
<li><a href="https://addons.mozilla.org/firefox/addon/open-in-browser/"><u>Install</u></a> Open in Browser;</li>
<li>Open preferences of Open in Browser;</li>
<li>Click Import.</li>
<li>Import the following <span class="cursor-pointer" id="open-in-browser-rules"><u>set of rules</u></span>.</li>
</ol>
</div>
</div>
<div id="gecko" class="segment">
<h1>⚙️ Enable JSON-based Feeds</h1>
<div class="content">
<ol>
<li>Navigate to <code>about:config</code>;</li>
<li>Set <code>devtools.jsonview.enabled</code> to <code>false</code>.</li>
</ol>
</div>
</div>`,
// Arbitrary rule doesn't work
// document.contentType text/xml
// Test pages: TPFC and Fastly Blog
ruleSetOpenInBrowser = `
{
"mime-mappings": {
"application/atom+xml": "1text/plain",
"application/rss+xml": "1text/plain",
"application/rdf+xml": "1text/plain",
"application/feed+json": "1text/plain",
"application/x-atom+xml": "1text/plain",
"application/x-rss+xml": "1text/plain",
"application/x-rdf+xml": "1text/plain",
"application/xml": "1text/plain",
"text/xml": "1text/plain"
},
"sniffed-mime-mappings": {
"application/atom+xml": "1text/plain",
"application/rss+xml": "1text/plain",
"application/rdf+xml": "1text/plain",
"application/feed+json": "1text/plain",
"application/x-atom+xml": "1text/plain",
"application/x-rss+xml": "1text/plain",
"application/x-rdf+xml": "1text/plain",
"application/xml": "1text/plain",
"text/xml": "1text/plain"
},
"text-nosniff": false,
"octet-sniff-mime": true,
"override-download-type": false
}`,
helpHeaderEditor = `
<div id="header-editor" class="segment">
<h1>🧩 <b>Header Editor (Rule Set)</h1>
<div class="content">
<ol>
<li><a id="header-editor-install"><u>Install</u></a> Header Editor;</li>
<li>Click on button Header Editor;</li>
<li>Manage > Export and Import > Import;</li>
<li>Import the following <span class="cursor-pointer" id="header-editor-rules"><u>set of rules</u></span>.</li>
</ol>
</div>
</div>
</div>`,
ruleSetHeaderEditor = `
{
"request": [],
"sendHeader": [],
"receiveHeader": [
{
"enable": true,
"name": "Set Content Type Plain Text",
"ruleType": "modifyReceiveHeader",
"matchType": "all",
"pattern": "",
"exclude": "",
"group": "Streamburner",
"isFunction": false,
"action": {
"name": "content-type",
"value": "text/plain"
},
"code": ""
}
],
"receiveBody": []
}`,
htmlBar = `
<div id="links-bar">
<span id="buttons-action" title="Scroll down for control menu">
<a id="follow" title="Subscribe to get the latest updates and news">Follow</a>
<span class="cursor-pointer" id="subtome" title="Subscribe via SubToMe">SubToMe</span>
<a id="homepage" title="Visit homepage" href="javascript:location.href = location.protocol + '//' + location.hostname">Home</a>
<span class="cursor-help" id="about-support" title="Learn how you can support">Support</span>
</span>
<span id="buttons-control" title="Scroll up for base menu">
<span id="next" title="Next item (Ctrl + Shift + Key Down)">nxt. ↓</span>
<span id="previous" title="Previous item (Ctrl + Shift + Key Up)">prv. ↑</span>
<span id="mode" title="Dark mode">💡</span>
<span id="increase" title="Increase text size">A +</span>
<span id="decrease" title="Decrease text size">a -</span>
<span id="direction" title="Change text direction">𝐓</span>
<span id="about-settings" title="Newspaper settings">⚙️</span>
<span id="about-help" title="Learn about syndication feed and how you can help">⁝</span>
</span>
</div>`,
htmlEmpty = `
<div class="notice no-entry" id="empty-feed">
<h3>This news feed is empty</h3>
<p>You are advised to contact the web administrators.</p>
<p>Ask them to maintain “Atom 1.0” or “RSS 2.0” feeds.</p>
<!-- div>You might want to address them to <a href="https://aboutfeeds.com">aboutfeeds.com</a>.</div -->
<span class="decor"></span>
<p>Below is a contact link with possible emails;</p>
<p>Use it only in case there is no contact address</p>
<p>nor form available on this website.</p>
<span class="decor"></span>
</div>`,
cssFileBar = `
#links-bar {
margin: auto;
outline: .1em solid;
width: 100%;
/* max-width: 70%; */
direction: ltr;
text-align: center;
position: fixed;
top: 0;
left: 0;
right: 0;
color: WhiteSmoke;
background: #555; /* #eee */
white-space: nowrap;
overflow: scroll;
scrollbar-width: none; /* Gecko */
-ms-overflow-style: none; /* Edge */
z-index: 1;
/* border-radius: unset; */
/* border-bottom: unset; */
max-height: 44.5px; /* TODO FIXME links-bar */ }
#links-bar::-webkit-scrollbar { /* Falkon and Otter */
display: none; }
#buttons-control,
#buttons-action a {
color: WhiteSmoke;
/* font-style: italic; */
font-family: system-ui;
/* NOTE Shouldn't this be max-width? */
min-width: 100px;
margin: 6px; }
#buttons-action {
float: left; }
#buttons-control {
float: right; }
#buttons-control span {;
min-width: 5%; }
#buttons-action #follow,
#buttons-control {
/* border-left-style: unset; */
border-right-style: solid;
border-radius: 0.5em;
color: #555;
background: WhiteSmoke;
font-weight: bold; }`,
cssFileLTR = `
html, body {
padding: 0;
margin: 0;
overflow-x: hidden; }
body {
background: WhiteSmoke;
color: #333;
hyphens: auto;
/* font-family: serif; */ }
a {
color: #333; }
#feed {
/*
width: 98%;
margin: auto;
position: relative;
overflow-x: hidden;
*/
margin: 0 -1em 1em -1em;
margin-bottom: 1em;
padding: 1em 1em 0 1em; }
#feed a {
display: inline-block; }
.entry p {
margin-right: 10px;
margin-left: 10px;
padding-right: 10px;
padding-left: 10px; }
#logo {
display: inline-block;
float: left;
overflow: hidden;
position: relative;
height: 60px;
width: 60px;
margin-right: 9;
padding-top: 12; }
#logo > a > img {
margin: auto;
max-width: 100%;
position: absolute;
width: 5em;
bottom: 0;
right: 0;
left: 0;
top: 0; }
#title { /* TODO tag </title-page> */
border-bottom: 1px solid;
width: 90%;
margin: auto;
font-variant: small-caps;
text-align: center;
font-weight: bold;
font-size: 3em;
overflow: hidden;
-webkit-line-clamp: 2; }
#title .empty:before {
font-variant: small-caps;
content: 'Streamburner News Dashboard';
text-align: center; }
#subtitle {
/* border-top: 1px solid; */
width: 90%;
margin: auto;
overflow: hidden;
-webkit-line-clamp: 2;
white-space: wrap; /* FIXME Invalid Value */
text-align: center;
font-variant: all-small-caps;
font-weight: normal;
font-size: 1.5em; }
.container {
display: flex; }
#links-bar {
font-family: system-ui;
/* cursor: default; */
display: block;
margin: auto;
margin-bottom: 1em;
margin-top: 1em;
width: 96%;
text-align: center;
direction: ltr;
/* font-size: 90%; */
/* border-radius: 2em; */
/* border-bottom: solid; */ }
#buttons-action *,
#buttons-control {
text-decoration: none;
/* font-size: 70%; */
outline: none;
min-width: 12%;
padding: 6px;
/* font-family: system-ui; */
white-space: nowrap;
margin: 20px; }
#buttons-action *:hover,
#buttons-control:hover {
opacity: 0.9; }
#follow,
#buttons-control {
/* font-weight: bold; */
cursor: pointer;
background: lavender; /* honeydew */
color: #333;
border-color: grey;
border-left-style: solid;
border-radius: 2em; /* 40% */
/*
border-top-left-radius: 2em;
border-bottom-left-radius: 2em;
*/
min-width: 12%; }
#buttons-control {
cursor: default;
border-left-style: unset;
border-right-style: solid; }
#buttons-control span {
outline: none;
/* min-width: unset; */
display: inline-block;
margin-right: 5px;
/* margin-left: 5px; */
padding-right: 5px;
padding-left: 5px; }
/* character ❱
#buttons-control #next {
transform: rotate(90deg); }
#buttons-control #previous {
transform: rotate(-90deg);
margin-left: unset; }
*/
/*
#buttons-control #next:after,
#buttons-control #previous:after {
content: '';
border: solid;
padding: 5px;
border-width: 1px 0 0 1px;
position: absolute; }
#buttons-control #next:after {
transform: rotate(-135deg); }
#buttons-control #previous:after {
transform: rotate(45deg); }
*/
#buttons-control #mode {
filter: saturate(7); }
.cursor-pointer {
cursor: pointer; }
#help {
cursor: help; }
#toc {
margin-left: 5%;
margin-right: 5%;
padding: 5px; }
#toc:before {
content: 'Latest Headlines'; }
#toc > a,
#toc:before {
content: 'Latest Headlines';
/* font-size: 76%; */
font-weight: bold; }
#toc li:first-child,
#toc > a {
margin-top: 1em; }
#toc a {
/* font-size: 66%; */
display: block;
outline: none;
padding: 5px 0;
margin-left: 1%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-decoration: none; }
#toc a:hover {
overflow: unset;
white-space: unset; /* break-spaces */
text-decoration: underline; }
#toc a:visited {
text-decoration: line-through; }
/*
#toc a:first-child {
margin-top: 1em; }
#toc a {
text-decoration: none;
display: list-item;
outline: none;
padding: 5px 0;
margin-left: 1%; }
#toc a:hover {
text-decoration: underline; }
#toc a:visited {
text-decoration: line-through; }
*/
.about-newspaper { /* overlay */
font-family: system-ui;
font-style: initial;
position: fixed;
display: none;
top: 0;
left: 0;
right: 0;
bottom: 0;
color: WhiteSmoke;
background-color: #555;
/* background-color: #ffff9b; */
z-index: 2;
overflow-y: auto;
text-align: left; /* justify */
direction: ltr;
padding: 5%;
line-height: 1.8;
font-size: 110%;
cursor: unset; }
.about-newspaper div {
margin-bottom: 1em; }
.about-newspaper a,
.category > a,
.subcategory > a {
text-decoration: none;
color: WhiteSmoke; }
.about-newspaper a:hover,
.category > a:hover,
.subcategory > a:hover {
text-decoration: underline; }
.about-newspaper #buttons-custom {
margin: auto;
margin-top: 1em;
outline: .1em solid;
/* outline-color: #333; */
text-align: center;
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: WhiteSmoke;
color: #333;
display: block;
font-size: smaller;
direction: ltr; }
.about-newspaper #buttons-custom > span {
outline: none;
min-width: 12%;
padding: 6px;
margin: 6px;
/* font-family: system-ui; */ }
#feed-quote,
.about-newspaper .quote {
text-align: center; /* right */
font-size: 90%;
font-style: italic; }
#feed-quote {
font-size: 70%;
margin-bottom: 35px; }
#feed-quote:after {
content: '· · • · ·'; }
.about-newspaper .text-icon {
font-weight: bold;
border-radius: 11px;
padding-top: 3px;
padding-bottom: 3px;
padding-right: 5px;
padding-left: 5px; }
.about-newspaper .orange {
background: darkorange; }
.about-newspaper #torrents {
outline: none; }
.about-newspaper #services > a:after,
.category > a:after,
.subcategory > a:after {
content: ', '; }
.about-newspaper #services > a:last-child:after,
.category > a:last-child:after,
.subcategory > a:last-child:after {
content: '.'; }
.about-newspaper #filter {
/* margin-right: auto;
margin-left: auto; */
margin-top: 25px; }
.about-newspaper .filter {
font-weight: bold;
outline: none;
border-bottom: 2px solid WhiteSmoke;
background: WhiteSmoke;
color: #555;
border-radius: 5%;
/* border-bottom-right-radius: unset; */
/* border-bottom-left-radius: unset; */
margin-right: 15px;
padding: 5px;
width: 10%;
cursor: pointer; }
.about-newspaper .center {
text-align: center; }
.about-newspaper .background {
background: #666;
border-radius: 1em;
padding: 5px; }
.about-newspaper .hide {
display: none; }
.about-newspaper .grey {
background: inherit;
color: inherit; }
/*
.about-newspaper .recom {
filter: drop-shadow(2px 4px 6px pink); }
*/
.about-newspaper .recom:before {
font-size: 80%;
content: '🔖 '; }
.about-newspaper .category > div:first-child {
font-size: 110%;
font-weight: bold;
margin-top: 25px; }
.about-newspaper .subcategory > div {
font-weight: bold;
/* text-decoration: underline; */ }
.about-newspaper .subcategory > div:before {
content: '* '; }
.about-newspaper #postscript + div p {
font-style: italic; }
/*
#feeds > div.content a:link {
text-decoration: none; }
*/
#feeds > div.content .category a:before,
#services-feed a:before {
font-size: 80%;
content: '🏷️ '; } /* 🧧 🔗 */
#articles {
justify-content: space-between;
max-width: 90%;
margin: 0 auto;
padding: 10px 0; }
#articles > * {
margin: .5em;
white-space: normal;
vertical-align: top;
margin-bottom: 50px; }
.entry {
/*border-bottom: inset;
border-bottom: groove; */
margin-left: auto;
margin-right: auto;
overflow: auto;
line-height: 1.6;
/* font-size: 85%; */
/* overflow-x: hidden; */
max-width: 98%;
/* outline: auto; */
outline: none;
padding: 4px;
/* overflow-wrap: break-word; */
word-break: break-word; }
.entry:last-child {
border-bottom: unset; }
.entry:hover {
/* background: #f8f9fa; */
/* outline: none; */ }
.entry > a {
white-space: normal; }
.decor {
/* border-top: inset; */
/* border-top: groove;
width: 30%; */
/* padding-right: 30%;
padding-left: 30%; */
margin-right: 30% !important;
margin-left: 30% !important;
padding-bottom: 1.5em !important;
text-align: center;
/* text-decoration: overline; */
display: block; }
.decor:after {
/* content: '∽ ✦ ∼' */
/* content: '· · ✦ · ·'; */
content: '· · • · ·'; } /* ✦ ✧ ۞ ⍟ ⍣ ✹ ✸ ✴ ✶ ✵ ✷ */
.title {
cursor: pointer;
display: inline-block;
font-size: 150%;
font-weight: bold;
text-decoration: underline;
overflow-wrap: anywhere;
/* overflow: visible;
text-overflow: ellipsis; */
font-variant: small-caps;
margin: 0; }
/*
.title > a {
text-decoration: none; }
.title > a:hover {
text-decoration: underline; }
*/
.geolocation > a {
text-decoration: none;
padding-left: 6px; }
.author {
font-size: 75%;
margin: 0 auto 0 auto; }
.author:before {
content: 'By '; }
.author:after {
content: ' / '; }
.published, .updated {
/* font-size: 75%; */
margin: 0 auto 0 auto;
font-weight: normal;
/* direction: ltr; */ }
.content {
margin: 15px auto 15px 1%;
inline-size: 95%;
text-indent: 3px; }
.content-text {
white-space: pre-wrap; }
.content[type='text'] {
font-family: monospace; }
.content * {
/* max-width: 96%; */
object-fit: contain;
height: auto; }
img, svg {
margin: 1em !important;
margin-left: 0 !important;
margin-top: 0 !important;
display: block;
/* border: 4px solid #555; */
border-radius: 0.5em;
/* min-width: 96%; */
max-width: 96%;
}
video {
border-radius: 0.5em;
outline: none;
}
iframe {
display: block;
border-radius: 0.5em;
width: 96%;
min-height: 70vw;
}
/* TODO Test <pre> */
code, pre {
color: WhiteSmoke !important;
background: #555 !important;
overflow: auto;
display: inline-flex;
max-height: 300px;
border-radius: 4px;
max-width: 100%; }
code *, pre * {
color: WhiteSmoke !important;
background: #555 !important; }
.enclosures {
background: #eee;
border: 1px solid GrayText;
border-radius: 4px;
clear: both;
color: #525c66;
cursor: help;
direction: ltr;
font-size: .8em;
margin: 5px auto 15px 1%;
padding: 15px;
vertical-align: middle;
/* border: 1px solid #aaa; */
border-radius: .5em;
max-width: 100%;
border-left: double;
padding: 1em; }
.enclosure a {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-decoration: none; }
.enclosure {
display: flex; }
.enclosure > a:hover {
text-decoration: underline; }
.enclosure > * {
white-space: nowrap;
margin: 3px; }
.enclosure > span:after {
content: ' (Document file) '; }
.enclosure > span[icon]:after {
content: '📄️';
margin: 3px; }
.enclosure > span.executable:after{
content: ' (Executable file) '; }
.enclosure > span[icon='executable']:after {
content: '📦️';
margin: 3px; }
.enclosure > span.image:after {
content: ' (Image file) '; }
.enclosure > span[icon='image']:after {
content: '🖼️';
margin: 3px; }
.enclosure > span.audio:after {
content: ' (Audio file) '; }
.enclosure > span[icon='audio']:after{
content: '🎼️';
margin: 3px; }
.enclosure > span.video:after {
content: ' (Video file) '; }
.enclosure > span[icon='video']:after {
content: '📽️';
margin:3px; }
.enclosure > span[icon='atom']:after {
content: '📰';
margin:3px; }
.enclosure > span[icon='html5']:after {
content: '📰';
margin:3px; }
.enclosure > span[icon='rss']:after {
content: '📰';
margin:3px; }
.notice {
text-align: center;
display: block;
font-size: 130%;
/* font-weight: lighter; */
font-variant-caps: all-small-caps;
color: FireBrick; }
.warning {
display: block;
font-size: 85%; /* 60 */
font-weight: bold;
color: DarkRed; }
.atom1.author:after {
content: 'Atom 1.0 Warning: Element </author> is missing'; }
.atom1.id:after {
content: 'Atom 1.0 Warning: Element </id> is missing'; }
.atom1.link:after {
content: 'Atom 1.0 Warning: Element </link> is missing'; }
.atom1.published:after {
content: 'Atom 1.0 Warning: Element </published> is missing'; }
.atom1.title:after {
content: 'Atom 1.0 Warning: Element </title> is missing'; }
.rss2.description:after {
content: 'RSS 2.0 Warning: Element </description> is missing'; }
.rss2.link:after {
content: 'RSS 2.0 Warning: Element </link> is missing'; }
.rss2.title:after {
content: 'RSS 2.0 Warning: Element </title> is missing'; }
abbr,acronym {
border-bottom: 1px dotted #c30; }
dt {
font-weight: bold; }
#about-toc {
display: grid;
/* border-bottom: inset;
text-align: right;
width: 70%;
margin-left: 30%; */ }
#about-toc > li a,
#feeds li a {
/* display: list-item; */
display: block; }
#empty-feed {
direction: ltr; }
#empty-feed .subject,
.about-newspaper .subject {
font-size: 130%;
font-weight: bold;
padding-bottom: 5px;
display: block; }
.about-newspaper .subtitle {
font-weight: bold;
/* font-style: italic; */
font-size: 110%; }
.about-newspaper .cyan {
font-weight: bold;
color: cyan; }
.about-newspaper .content {
margin-bottom: 3em;
white-space: unset; }
.about-newspaper .orange-color {
color: orange;
margin-right: 5px; }
.about-newspaper .red-color {
color: red; }
.about-newspaper .lizard {
filter: hue-rotate(250deg); }
.about-newspaper #personal {
font-style: italic; }
#info-square {
direction: ltr;
position: fixed;
margin: auto;
bottom: 0;
right: 0;
left: 0;
/* top: 33px; */
padding: 3px;
color: WhiteSmoke;
background: #555;
/* border-radius: 50px;
width: 50%;
font-size: 70%; */
/* font-style: italic; */
font-family: system-ui;
/* justify-content: center; */
align-items: center;
display: flex;
text-overflow: ellipsis;
overflow: hidden;
/* white-space: pre; in case we have html tags */
white-space: nowrap; }
#info-square > * {
color: WhiteSmoke;
margin-left : 0.5em;
margin-right : 0.5em; }
#top-navigation-button {
/* set position */
position : fixed;
bottom : 10px;
right : 20px;
z-index : 1;
/* set appearance */
background : WhiteSmoke;
color: #555;
border : 2px solid #555;
border-radius : 50px;
/* margin : 10px; */
min-width : 30px;
min-height : 30px;
font-size : 20px;
/* opacity : 0.3; */
/* center character */
justify-content: center;
align-items : center;
display : flex;
/* disable selection marks */
outline : none;
/* cursor : default;
transform: rotate(-90deg) scale(1, -1); */ }
#links-bar,
#buttons-action *,
#buttons-control,
.about-newspaper #buttons-custom > span,
.about-newspaper #buttons-custom,
.about-newspaper #buttons,
.about-newspaper .text-icon,
.about-newspaper .filter,
.decor,
#top-navigation-button,
#page-settings {
user-select: none; }
#page-settings button,
#page-settings input,
#page-settings label {
padding: 5px; }
#page-settings span {
display: block; }
#page-settings td {
vertical-align: initial; }
#email-link {
margin-top: 25px;
text-decoration: overline;
outline: none; }
#feed-info {
font-size : 70%;
margin-bottom : 35px;
text-align : center; }
#feed-banner {
outline: none;
display: table;
margin: auto;
/* filter: drop-shadow(2px 4px 6px black); */ }
#xslt-message {
background: indianred; /* #2c3e50 coral */
font-family: system-ui;
color: white; /* #eee navajowhite */
padding: 6px; /* 13px //15px //11px //9px //3px //1px */
display: block;
text-align: center; /* justify */
text-decoration: none;
direction: ltr; }
.about-newspaper #buttons {
float: right; }
#issue-3164 {
background: #333;
font-family: system-ui;
color: white;
padding: 6px;
display: block;
text-align: center;
text-decoration: none;
direction: ltr; }
body.dark {
background: #333; }
code.dark,
.enclosures.dark {
background: #555; }
/* WONTFIX mainstream due to document.contentType is thought to be xml, which is not; it's html */
a.dark,
body.dark,
code.dark,
.enclosures.dark,
#empty-feed.dark {
color: WhiteSmoke; }
#links-bar a.dark {
color: WhiteSmoke !important; }
#links-bar #follow.dark,
#links-bar #buttons-control span.dark {
color: #333 !important; }`,
cssFileRTL = `
html, body {
text-align: right; }
#feed {
direction: rtl; }
#logo {
float: right;
margin-left: 9; }
.geolocation > a {
padding-right: 6px; }
.image {
float: right;
margin-left: 40px;
margin-right: auto; }`;
var
cssFileBase, xmlStylesheet;
(function checkContentType() {
let myPromise = new Promise(function(myResolve, myReject) {
let request = new XMLHttpRequest();
//request.overrideMimeType('text/plain');
//request.responseType = 'text'; // ms-stream also works but both don't make a difference
request.open('GET', document.documentURI);
//request.setRequestHeader('Content-Type', 'text/plain;charset=UTF-8');
//request.setRequestHeader('Content-Type', 'text/plain');
request.onload = function() {
if (document.URL.startsWith('file:') ||
request.status == 200) {
myResolve(request);
}
else {
myReject("File not Found");
}
};
request.send();
/* gmXmlhttpRequest({
method: 'GET',
url: document.documentURI,
headers: {
"Content-Type": "text/plain",
"Accept": "text/plain"
},
onprogress: function(request) {
request.responseType = 'text';
},
onload: function(request) {
request.overrideMimeType = 'text/plain';
if (document.URL.startsWith('file:') ||
request.status == 200) {
myResolve(request);
}
else {
myReject("File not Found");
}
},
onerror: function(request) {
myReject('File not Found')
}
}) */
});
myPromise.then(
function(request) {
/*
if (request.response.toLowerCase().includes('<?xml-stylesheet')) {
// Apparently, this program doesn't influence server stylesheet
// This if statement is useful to save CPU and RAM resources.
// NOTE We can remove it using DOMParser.
return; // exit
}
*/
let xmlFile
let domParser = new DOMParser();
xmlFile = domParser.parseFromString(request.response.trim(), 'text/xml');
// TODO Preference to respect or override stylesheet
// TODO Ignore all stylesheets if all are CSS
// TODO Infobar suggesting to render with Streamburner ?streamburner=1
// TODO Infobar suggesting to disable (watch without) Streamburner ?streamburner=0 <-- do this
if (xmlFile) {
//let xmlStylesheet;
for (childNode of xmlFile.childNodes) {
if (childNode.target == 'xml-stylesheet') {
childNode.remove();
xmlStylesheet = true;
//return; // exit
}
}
/*
// TODO Configuration to override existing stylesheet
if (override) {
if (xmlFile.firstChild.nodeName == "xml-stylesheet") {
console.log(xmlFile.firstChild)
xmlFile.firstChild.remove();
}
} else {
return; // exit
}
*/
/*
// Remove node of type comment
// Because of this code below
if (xmlFile.childNodes[0] == xmlFile.querySelector('feed')) {
while (xmlFile.firstChild.nodeName == '#comment') {
xmlFile.firstChild.remove(); // xmlFile.childNodes[0]
}
}
*/
/*
// Remove all nodes of type comment
nodeIterator = xmlDoc.createNodeIterator(
xmlDoc, // Starting node, usually the document body
NodeFilter.SHOW_ALL, // NodeFilter to show all node types
null,
false
);
let currentNode;
// Loop through each node in the node iterator
while (currentNode = nodeIterator.nextNode()) {
// Do something with each node
console.log(currentNode.nodeName);
}
*/
switch (xmlFile.firstElementChild) {
// <feed xmlns="http://www.w3.org/2005/Atom">
// xmlFile.getElementsByTagNameNS('http://www.w3.org/2005/Atom','feed')
case xmlFile.querySelector('feed'):
pageLoader();
renderXML(xmlFile, atomRules);
//aboutInfo(xmlFile, rdfRules);
feedInfoXML(xmlFile, atomRules, 'Atom'); // Atom Web Feed 1.0
extensionLoader();
break;
// Netscape RSS 0.91 <!DOCTYPE rss SYSTEM "http://my.netscape.com/publish/formats/rss-0.91.dtd">
// Userland RSS 0.91 <rss version="0.91">
// RSS 0.92 <rss version="0.92">
// RSS 0.93 <rss version="0.93">
// RSS 0.94 <rss version="0.94">
// RSS 2.0 <rss version="2.0">
case xmlFile.querySelector('rss'):
pageLoader();
renderXML(xmlFile, rssRules);
//aboutInfo(xmlFile, rdfRules);
// FIXME https://www.elegislation.gov.hk/verified-chapters!en.rss.xml
if (rssVersion = xmlFile.firstElementChild.getAttribute('version')) {
feedInfoXML(xmlFile, rssRules, `RSS ${rssVersion}`);
} else {
feedInfoXML(xmlFile, rssRules, `RSS`); // RSS Web Feed 2.0
}
extensionLoader();
break;
// TODO Check by namespace xmlns
// https://yaxim.org/doap/yaxim.rdf.xml
// https://wiki.gnome.org/action/rss_rc/Home?action=rss_rc&unique=1&ddiffs=1
// https://web.resource.org/rss/1.0/schema.rdf
// RSS 0.90 <rdf:RDF xmlns="http://my.netscape.com/rdf/simple/0.9/">
// RSS 1.0 <rdf:RDF xmlns="http://purl.org/rss/1.0/">
// NOTE firstElementChild test page https://web.resource.org/rss/1.0/
// xmlFile.getElementsByTagNameNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'RDF');
case xmlFile.getElementsByTagName("rdf:RDF")[0]: // RDF Vocabulary
switch (xmlFile.firstElementChild.getAttribute('xmlns')) {
case 'http://my.netscape.com/rdf/simple/0.9/':
case 'https://web.resource.org/rss/1.0/': // TODO TEST
case 'http://purl.org/rss/1.0/':
pageLoader();
renderXML(xmlFile, rdfRules);
//aboutInfo(xmlFile, rdfRules);
switch (xmlFile.firstElementChild.getAttribute('xmlns')) {
case 'https://web.resource.org/rss/1.0/':
case 'http://purl.org/rss/1.0/':
feedInfoXML(xmlFile, rdfRules, 'RSS 1.0');
break;
case 'http://my.netscape.com/rdf/simple/0.9/':
feedInfoXML(xmlFile, rdfRules, 'RSS 0.9');
break;
}
extensionLoader();
}
break;
case xmlFile.querySelector('opml'):
pageLoader();
// dateCreated http://source.scripting.com/?format=opml&streamburner_active=0
renderOPML(xmlFile, opmlRules);
//aboutInfo(xmlFile, rdfRules);
feedInfoXML(xmlFile, opmlRules, 'OPML Outline'); // OPML
extensionLoader();
break;
case xmlFile.getElementsByTagName("smf:xml-feed")[0]:
pageLoader();
renderXML(xmlFile, smfRules);
//aboutInfo(xmlFile, rdfRules);
feedInfoXML(xmlFile, smfRules, 'Simple Machines Forum'); // SMF
extensionLoader();
break;
}
// TODO
// This appears to be a not usuable Atom feed
// Either make it usable or invalidate it
// https://dbpedia.org/data/Searx.atom
}
// Information of request
//console.info(xmlFile);
//console.info(document);
//console.info(`all headers: ${request.getAllResponseHeaders()}`);
//console.info(`content-type header: ${request.getResponseHeader('content-type')}`);
//console.info(`content-type document: ${document.contentType}`);
// errorPage is a good idea to promote Falkon
//setTimeout(function(){renderFeed(request.response)}, 1500); // timeout for testing
try {
if (JSON.parse(request.response)) {
let jsonFile = JSON.parse(request.response);
if (jsonFile.version) {
if (jsonFile.version.toLowerCase().includes('jsonfeed.org')) {
pageLoader();
//setTimeout(function(){renderJSONFeed(jsonFile)}, 1500);
renderJSONFeed(jsonFile);
feedInfoJSON(
jsonFile,
jsonFile.home_page_url,
jsonFile.generator,
jsonFile.version,
jsonFile.items[0].date_published,
'JSON Feed');
extensionLoader();
}
} else
if (jsonFile.generator) {
if (jsonFile.generator.toLowerCase().includes('statusnet') || // TODO Case insensitive
jsonFile.generator.toLowerCase().includes('gnu social')) {
pageLoader();
renderActivityStream(jsonFile);
feedInfoJSON(
jsonFile,
//jsonFile.items[0].id, // NOTE Not good. This is done so that infoSquare will load
location.protocol + '//' + location.hostname,
jsonFile.generator,
jsonFile.generator,
jsonFile.items[0].published,
'ActivityStream');
extensionLoader();
}
} else
if (jsonFile.rss) {
if (jsonFile.rss.version.toLowerCase().includes('2.0')) {
pageLoader();
renderRssInJson(jsonFile.rss.channel);
feedInfoJSON(
jsonFile,
jsonFile.rss.channel.link,
jsonFile.rss.channel.generator,
jsonFile.rss.version,
jsonFile.rss.channel.pubDate,
'RSS-in-JSON');
extensionLoader();
}
}
// TODO ActivityStream
// https://nu.federati.net/api/statuses/show/3424682.json
}
} catch {
// Not JSON
}
}
);
})();
/*
Test code (attempting to modify content type):
console.info(document);
request = new XMLHttpRequest();
// "false" is only used for this test
request.open('GET', document.documentURI, false);
request.overrideMimeType('text/plain');
request.setRequestHeader('content-type', 'text/plain');
request.send();
//console.info(request.response);
console.info(`all headers: ${request.getAllResponseHeaders()}`);
console.info(`content-type header:
${request.getResponseHeader('content-type')}`);
console.info(`content-type document: ${document.contentType}`);
*/
/*
(function checkContentType() {
fetch(
document.documentURI,
{
method: 'GET',
headers: {
"Content-Type" : "text/plain",
},
}
)
.then((response) => {
console.info(response.headers.get('content-type'))
//console.info(response.arrayBuffer())
return response.arrayBuffer();
})
.then((data) => {
let decoder = new TextDecoder(document.characterSet);
let text = decoder.decode(data);
domParser = domParser = new DOMParser();
try {
if (JSON.parse(text)) {
jsonFile = JSON.parse(text);
if (jsonFile.version) {
if (jsonFile.version.toLowerCase().includes('jsonfeed.org')) {
renderJSONFeed(jsonFile);
extensionLoader(jsonFile.feed_url); // , jsonFile, 'JSON'
}
} else
if (jsonFile.generator) {
if (jsonFile.generator.toLowerCase().includes('statusnet') || // TODO Case insensitive
jsonFile.generator.toLowerCase().includes('gnu social')) {
renderActivityStream(jsonFile);
extensionLoader(); // null, jsonFile, 'ActivityStream'
}
}
}
} catch {
if (domParser.parseFromString(text, 'text/xml')) {
xmlFile = domParser.parseFromString(text, 'text/xml');
// errorPage is a good idea to promote Falkon
if (xmlFile.querySelector('feed')) {
renderXML(xmlFile, atomRules);
extensionLoader(xmlFile.querySelector('feed > link').href); // , xmlFile, 'Atom'
} else
if (xmlFile.querySelector('rss')) {
renderXML(xmlFile, rssRules);
extensionLoader(xmlFile.querySelector('channel > link').href); // , xmlFile, 'RSS'
}
}
}
});
})();
*/
function renderActivityStream(jsonFile) {
let newDocument = createPage();
newDocument.title = jsonFile.title;
if (jsonFile.language) {
newDocument
.documentElement
.setAttribute('lang', jsonFile.language);
}
let feed = newDocument.createElement('div');
feed.id = 'feed';
let title = newDocument.createElement('h1');
if (jsonFile.title) {
title.textContent = jsonFile.title;
} else {
title.textContent = document.location.hostname;
}
title.id = 'title';
feed.append(title);
let subtitle = newDocument.createElement('h2');
if (jsonFile.description) {
subtitle.textContent = jsonFile.description;
} else {
subtitle.textContent = defaultSubtitle;
}
subtitle.id = 'subtitle';
feed.append(subtitle);
let toc = newDocument.createElement('ol');
toc.id = 'toc';
feed.append(toc);
let articles = newDocument.createElement('div');
articles.id = 'articles';
feed.append(articles);
if (jsonFile.items.length) {
for (const item of jsonFile.items) {
//for (let i = 0; i < jsonFile.items.length; i++) {
let items = jsonFile.items.length;
let index = jsonFile.items.indexOf(item) + 1;
let titleToc = newDocument.createElement('a');
// /questions/5002111/how-to-strip-html-tags-from-string-in-javascript
let dateAsTitle = new Date(item.published);
titleToc.textContent =
item
.actor
.portablecontacts_net.preferredUsername
+ ' on ' +
dateAsTitle
.toDateString();
//titleToc.textContent = item.content.replace(/(<([^>]+)>)/gi, "");
//titleToc.textContent = item.actor.portablecontacts_net.preferredUsername;
titleToc.href = `#newspaper-oujs-${index}`;
titleToc.title = titleToc.textContent;
let liElement = newDocument.createElement('li');
liElement.append(titleToc)
toc.append(liElement);
let entry = newDocument.createElement('div');
entry.className = 'entry';
let link = newDocument.createElement('a');
link.textContent =
item
.actor
.portablecontacts_net.preferredUsername;
link.href = item.url;
//link.id = item.id;
link.id = `newspaper-oujs-${index}`;
title = newDocument.createElement('h3');
title.className = 'title';
title.append(link);
entry.append(title);
let date = newDocument.createElement('h4');
date.className = 'published';
date.textContent = item.published;
entry.append(date);
if (item.image) {
let image = newDocument.createElement('img');
image.src = item.actor.image;
entry.append(image);
}
let text = newDocument.createElement('div');
text.className = 'content';
text.innerHTML = item.content;
entry.append(text);
articles.append(entry);
if (
index > 4 &&
index < items &&
!document.location.search.includes('streamburner_show=all')
)
{
let titleToc = newDocument.createElement('a');
titleToc.textContent = `See all news >`;
titleToc.title = `This feed offers ${items} items`;
listAll = new URL(document.location.href);
listAll.searchParams.set('streamburner_show', 'all');
titleToc.href = listAll.href;
toc.append(titleToc);
break;
}
}
} else {
toc.remove(); // NOTE Redundant. See checkContentEmptiness
articles.insertAdjacentHTML('beforeend', htmlEmpty);
}
newDocument.body.append(feed);
newDocument = checkContentEmptiness(newDocument);
placeNewDocument(newDocument);
}
function renderRssInJson(jsonFile) {
let newDocument = createPage();
newDocument.title = jsonFile.title;
if (jsonFile.language) {
newDocument
.documentElement
.setAttribute('lang', jsonFile.language);
}
let feed = newDocument.createElement('div');
feed.id = 'feed';
let title = newDocument.createElement('h1');
if (jsonFile.title) {
title.textContent = jsonFile.title;
} else {
title.textContent = document.location.hostname;
}
title.id = 'title';
feed.append(title);
let subtitle = newDocument.createElement('h2');
if (jsonFile.description) {
subtitle.textContent = jsonFile.description;
} else {
subtitle.textContent = defaultSubtitle;
}
subtitle.id = 'subtitle';
feed.append(subtitle);
let toc = newDocument.createElement('ol');
toc.id = 'toc';
feed.append(toc);
let articles = newDocument.createElement('div');
articles.id = 'articles';
feed.append(articles);
if (jsonFile.item.length) {
for (const item of jsonFile.item) {
let items = jsonFile.item.length;
let index = jsonFile.item.indexOf(item) + 1;
let titleToc = newDocument.createElement('a');
if (item.title) {
titleToc.textContent =
item
.title
.replace(/(<([^>]+)>)/gi, "");
} else
if (item.pubDate) {
let dateAsTitle = new Date(item.pubDate);
titleToc.textContent = dateAsTitle.toDateString();
} else {
titleToc.textContent = '*** No Title ***';
}
titleToc.textContent = titleToc.textContent
titleToc.href = `#newspaper-oujs-${index}`;
titleToc.title = titleToc.textContent;
let liElement = newDocument.createElement('li');
liElement.append(titleToc)
toc.append(liElement);
let entry = newDocument.createElement('div');
entry.className = 'entry';
let link = newDocument.createElement('a');
if (item.title) {
link.textContent = item.title.replace(/(<([^>]+)>)/gi, "");
} else
if (item.pubDate) {
let dateAsTitle = new Date(item.pubDate);
link.textContent = dateAsTitle.toDateString();
} else {
link.textContent = 'No Title';
}
link.href = item.link; // item['source:outline'].permalink
//link.id = item.id;
link.id = `newspaper-oujs-${index}`;
title = newDocument.createElement('h3');
title.className = 'title';
title.append(link);
entry.append(title);
let date = newDocument.createElement('h4');
date.className = 'published';
// item['source:outline'].created
// item['source:outline'].pubDate
date.textContent = item.pubDate;
entry.append(date);
/*
if (item['source:outline'].image) {
let image = newDocument.createElement('img');
image.src = item['source:outline'].image;
entry.append(image);
}
*/
let text = newDocument.createElement('div');
text.className = 'content';
// item['source:outline'].text
// item['source:outline'].description
// item['source:outline'].subs (array)
text.innerHTML = item.description;
entry.append(text);
articles.append(entry);
if (
index > 4 &&
index < items &&
!document.location.search.includes('streamburner_show=all')
)
{
let titleToc = newDocument.createElement('a');
titleToc.textContent = `See all news >`;
titleToc.title = `This feed offers ${items} items`;
listAll = new URL(document.location.href);
listAll.searchParams.set('streamburner_show', 'all');
titleToc.href = listAll.href;
toc.append(titleToc);
break;
}
}
} else {
toc.remove(); // NOTE Redundant. See checkContentEmptiness
articles.insertAdjacentHTML('beforeend', htmlEmpty);
}
newDocument.body.append(feed);
newDocument = checkContentEmptiness(newDocument);
placeNewDocument(newDocument);
}
function renderJSONFeed(jsonFile) {
let feedMap = {
"title": "title",
"subtitle": "description",
"language" : "language",
"item": [{
"title" : "title",
"url" : ["url", "id"],
"content" : ["content_html", "content_text"],
"image" : "image",
"date" : ["date_published", "date_modified"],
"authors" : ["authors", "author"],
"tags" : "tags",
"language" : "language",
"id" : "id",
}],
"attachments": [{
"url" : "url",
"mime_type" : "mime_type",
"title" : "title",
"size_in_bytes" : "size_in_bytes",
"duration_in_seconds" : "duration_in_seconds"
}],
"homepage": "home_page_url",
"version": "version",
"url": "feed_url"
};
let newDocument = createPage();
/*
newDocument = domParser.parseFromString('<html></html>', 'text/html');
elements = ['html', 'head', 'body'];
//for (const element of elements) {
for (let i = 1; i < elements.length; i++) {
element = newDocument.createElement(elements[i]);
newDocument.documentElement.append(element);
}
*/
newDocument.title = jsonFile.title;
if (jsonFile.language) {
newDocument
.documentElement
.setAttribute('lang', jsonFile.language);
}
let feed = newDocument.createElement('div');
feed.id = 'feed';
let title = newDocument.createElement('h1');
if (jsonFile.title) {
title.textContent = jsonFile.title;
} else {
title.textContent = document.location.hostname;
}
title.id = 'title';
feed.append(title);
let subtitle = newDocument.createElement('h2');
if (jsonFile.description) {
subtitle.textContent = jsonFile.description;
} else {
subtitle.textContent = defaultSubtitle;
}
subtitle.id = 'subtitle';
feed.append(subtitle);
let toc = newDocument.createElement('ol');
toc.id = 'toc';
feed.append(toc);
let articles = newDocument.createElement('div');
articles.id = 'articles';
feed.append(articles);
/* FIXME
These couple of for-loops don't work
Failing part: jsonFile.cellOfArray
Uncaught (in promise) TypeError: Cannot read property '0' of undefined
tags = ['title', 'description'];
for (const tag of tags) {
element = newDocument.createElement('div');
element.textContent = jsonFile.tag;
element.id = tag;
feed.append(element);
}
elements = ['title', 'description'];
for (let i = 0; i < elements.length; i++) {
element = newDocument.createElement('div');
element.textContent = jsonFile.elements[i];
element.id = elements[i];
feed.append(element);
}
*/
if (jsonFile.items.length) {
for (const item of jsonFile.items) {
//for (let i = 0; i < jsonFile.items.length; i++) {
let items = jsonFile.items.length;
let index = jsonFile.items.indexOf(item) + 1;
let titleToc = newDocument.createElement('a');
if (item.title) {
titleToc.textContent = item.title;
} else
if (item.date_published) {
let dateAsTitle = new Date(item.date_published);
titleToc.textContent = dateAsTitle.toDateString();
} else {
titleToc.textContent = '*** No Title ***';
}
titleToc.href = `#newspaper-oujs-${index}`;
titleToc.title = titleToc.textContent;
let liElement = newDocument.createElement('li');
liElement.append(titleToc)
toc.append(liElement);
let entry = newDocument.createElement('div');
entry.className = 'entry';
let link = newDocument.createElement('a');
if (item.title) {
link.textContent = item.title;
} else
if (item.date_published) {
let dateAsTitle = new Date(item.date_published);
link.textContent = dateAsTitle.toDateString();
} else {
link.textContent = 'No Title';
}
link.href = item.url;
//link.id = item.id;
link.id = `newspaper-oujs-${index}`;
title = newDocument.createElement('h3');
title.className = 'title';
title.append(link);
entry.append(title);
let date = newDocument.createElement('h4');
date.className = 'published';
date.textContent = item.date_published; // date_modified
entry.append(date);
// TODO Set it as enclosure unless content is not html (i.e. is text)
if (item.image) {
let image = newDocument.createElement('img');
image.src = item.image;
entry.append(image);
}
let text = newDocument.createElement('div');
text.className = 'content';
text.innerHTML = item.content_html; // content_text
entry.append(text);
articles.append(entry);
if (
index > 4 &&
index < items &&
!document.location.search.includes('streamburner_show=all')
)
{
let titleToc = newDocument.createElement('a');
titleToc.textContent = `See all news >`;
titleToc.title = `This feed offers ${items} items`;
listAll = new URL(document.location.href);
listAll.searchParams.set('streamburner_show', 'all');
titleToc.href = listAll.href;
toc.append(titleToc);
break;
}
}
} else {
toc.remove(); // NOTE Redundant. See checkContentEmptiness
articles.insertAdjacentHTML('beforeend', htmlEmpty);
}
newDocument.body.append(feed);
newDocument = checkContentEmptiness(newDocument);
placeNewDocument(newDocument);
}
function renderXML(xmlFile, xmlRules) {
let newDocument = createPage();
if (xmlFile.querySelector(xmlRules.feedTitlePage)) {
// SMF
if (xmlFile.querySelector(xmlRules.feedTitlePage).getAttribute('forum-name')) {
newDocument.title =
xmlFile
.querySelector(xmlRules.feedTitlePage)
.getAttribute('forum-name');
} else {
newDocument.title =
xmlFile
.querySelector(xmlRules.feedTitlePage)
.textContent;
}
}
// SMF
if (xmlFile.getElementsByTagName('smf:xml-feed')[0]) {
newDocument.documentElement.setAttribute(
'lang',
xmlFile
.getElementsByTagName('smf:xml-feed')[0]
.getAttribute('xml:lang')
);
} else
// Atom
if (xmlFile.querySelector(xmlRules.feedLanguage) &&
xmlFile.querySelector(xmlRules.feedLanguage).getAttribute('xml:lang')) {
newDocument.documentElement.setAttribute(
'lang',
xmlFile
.querySelector(xmlRules.feedLanguage)
.getAttribute('xml:lang')
);
} else
// RDF and RSS
if (xmlRules == rdfRules || xmlRules == rssRules) {
if (xmlFile.querySelector(xmlRules.feedLanguage)) {
newDocument.documentElement.setAttribute(
'lang',
xmlFile
.querySelector(xmlRules.feedLanguage)
.textContent
);
}
}
let feed = newDocument.createElement('div');
feed.id = 'feed';
let titlePage = newDocument.createElement('h1');
if (xmlFile.getElementsByTagName('smf:xml-feed')[0] &&
xmlFile.getElementsByTagName('smf:xml-feed')[0].getAttribute('forum-name')) {
titlePage.textContent =
xmlFile
.getElementsByTagName('smf:xml-feed')[0]
.getAttribute('forum-name');
} else
if (xmlFile.querySelector(xmlRules.feedTitlePage)) {
titlePage.textContent =
xmlFile
.querySelector(xmlRules.feedTitlePage)
.textContent;
} else { // if (!titlePage.textContent)
titlePage.textContent = document.location.hostname;
}
titlePage.id = 'title';
feed.append(titlePage);
let subtitle = newDocument.createElement('h2');
if (xmlFile.getElementsByTagName('smf:xml-feed')[0] &&
xmlFile.getElementsByTagName('smf:xml-feed')[0].getAttribute('description')) {
subtitle.textContent =
xmlFile
.getElementsByTagName('smf:xml-feed')[0]
.getAttribute('description');
//.getAttribute('about');
} else
if (xmlFile.querySelector(xmlRules.feedSubtitle)) {
subtitle.textContent =
xmlFile
.querySelector(xmlRules.feedSubtitle)
.textContent
.replace(/(<([^>]+)>)/gi, "");
} else { // if (!subtitle.textContent)
subtitle.textContent = defaultSubtitle;
}
subtitle.id = 'subtitle';
feed.append(subtitle);
let toc = newDocument.createElement('ol');
toc.id = 'toc';
feed.append(toc);
let articles = newDocument.createElement('div');
articles.id = 'articles';
feed.append(articles);
if (xmlFile.querySelectorAll(xmlRules.feedItem).length) {
for (const item of xmlFile.querySelectorAll(xmlRules.feedItem)) {
let items = xmlFile.querySelectorAll(xmlRules.feedItem).length;
let index = Array.from(xmlFile.querySelectorAll(xmlRules.feedItem)).indexOf(item) + 1;
let titleToc = newDocument.createElement('a');
// /questions/5002111/how-to-strip-html-tags-from-string-in-javascript
if (item.querySelector(xmlRules.feedItemTitle) &&
item.querySelector(xmlRules.feedItemTitle).textContent.length) { // FIXME there are two of the same
titleToc.textContent =
item
.querySelector(xmlRules.feedItemTitle)
.textContent;
//titleToc.textContent =
titleToc.innerHTML =
titleToc
.textContent
.replace(/(<([^>]+)>)/gi, "");
} else
if (item.querySelector(xmlRules.feedItemDate)) {
let dateAsTitle = new Date(item.querySelector(xmlRules.feedItemDate).textContent);
titleToc.textContent = dateAsTitle.toDateString();
} else {
titleToc.textContent = '*** No Title ***';
}
titleToc.href = `#newspaper-oujs-${index}`;
titleToc.title = titleToc.textContent;
let liElement = newDocument.createElement('li');
liElement.append(titleToc)
toc.append(liElement);
let entry = newDocument.createElement('div');
entry.className = 'entry';
let link = newDocument.createElement('a');
link.id = `newspaper-oujs-${index}`;
if (item.querySelector(xmlRules.feedItemTitle) &&
item.querySelector(xmlRules.feedItemTitle).textContent.length) { // FIXME there are two of the same
//link.textContent =
link.innerHTML =
item
.querySelector(xmlRules.feedItemTitle)
.textContent
.replace(/(<([^>]+)>)/gi, "");
} else
if (item.querySelector(xmlRules.feedItemDate)) {
let dateAsTitle = new Date(item.querySelector(xmlRules.feedItemDate).textContent);
link.textContent = dateAsTitle.toDateString();
} else {
link.textContent = 'No Title';
}
if (item.querySelector(xmlRules.feedItemLink) &&
item.querySelector(xmlRules.feedItemLink).getAttribute('href')) {
// Atom
if (item.querySelector(xmlRules.feedItemLink + "[rel='alternate']")) {
link.href =
item
.querySelector(xmlRules.feedItemLink + "[rel='alternate']")
.getAttribute('href');
} else {
link.href =
item
.querySelector(xmlRules.feedItemLink)
.getAttribute('href');
}
} else {
if (item.querySelector(xmlRules.feedItemLink) &&
item.querySelector(xmlRules.feedItemLink).textContent.length) {
// RSS
// TODO Ignore whitespace
// https://handheldgameconsoles.com/f.atom
link.href =
item
.querySelector(xmlRules.feedItemLink)
.textContent;
} else
if (getHomeLink(xmlFile, xmlRules)) {
link.href = getHomeLink(xmlFile, xmlRules) + '?ref=feed';
} else
link.href = './?ref=feed';
}
let title = newDocument.createElement('h3');
title.className = 'title';
title.append(link);
entry.append(title);
if (item.querySelector(xmlRules.feedItemDate)) {
let date = newDocument.createElement('h4');
date.className = 'published';
date.textContent =
item
.querySelector(xmlRules.feedItemDate)
.textContent;
entry.append(date);
}
if (item.querySelector(xmlRules.feedItemContent)) {
let text = newDocument.createElement('div');
text.className = 'content content-text';
text.innerHTML =
item
.querySelector(xmlRules.feedItemContent)
.textContent;
if (/<\/?[a-z][\s\S]*>/i.test(text.innerHTML)) {
text.className = 'content';
}
entry.append(text);
}
if (item.querySelector(xmlRules.feedItemSummary)) {
let text = newDocument.createElement('div');
text.className = 'content content-text';
text.innerHTML =
item
.querySelector(xmlRules.feedItemSummary)
.textContent;
if (/<\/?[a-z][\s\S]*>/i.test(text.innerHTML)) {
text.className = 'content';
}
entry.append(text);
}
if (item.querySelector(xmlRules.feedItemEnclosure)) {
let enclosures = newDocument.createElement('div');
enclosures.className = 'enclosures';
enclosures.title = 'Right-click and Save link as…';
for (const enclosure of item.querySelectorAll(xmlRules.feedItemEnclosure)) {
// TODO Skip enclosures with empty href
// https://gnu.tiflolinux.org/api/statuses/public_timeline.atom
let file = newDocument.createElement('div');
file.className = 'enclosure';
enclosures.append(file);
let icon = newDocument.createElement('span');
let documentType;
if (enclosure.getAttribute('type')) {
documentType = enclosure.getAttribute('type').split('/')[0];
} else {
documentType = '';
}
icon.setAttribute('icon', documentType);
file.append(icon);
let link = newDocument.createElement('a');
let enclosureBase, enclosureUrl;
if (enclosure.getAttribute('url')) { // rss
enclosureUrl = enclosure.getAttribute('url');
enclosureBase = enclosureUrl.split('/').pop();
} else
if (enclosure.getAttribute('href')) { // atom https://tomosnowbug.hatenablog.com/feed
enclosureUrl = enclosure.getAttribute('href');
enclosureBase = enclosureUrl.split('/').pop();
}
link.textContent = enclosureBase;
link.download = enclosureBase;
link.href = enclosureUrl;
file.append(link);
let size = newDocument.createElement('span');
// class="size" is needed for function transformFileSize
size.className = `size ${documentType}`;
size.textContent = `${enclosure.getAttribute('length')}`;
file.append(size);
}
entry.append(enclosures);
}
articles.append(entry);
if (
index > 4 && // TODO getMinimumItemNumber()
index < items &&
// FIXME Ineffective at https://typo3.org/rss due to server-side redirect
//new URL(document.location).searchParams.get('streamburner_show') == 'all'
//!document.location.href.includes('streamburner_show=all')
!document.location.search.includes('streamburner_show=all')
)
{
let titleToc = newDocument.createElement('a');
titleToc.textContent = `See all news >`;
titleToc.title = `This feed offers ${items} items`;
listAll = new URL(document.location.href);
listAll.searchParams.set('streamburner_show', 'all');
titleToc.href = listAll.href;
toc.append(titleToc);
break;
}
}
}
newDocument.body.append(feed);
newDocument = checkContentEmptiness(newDocument);
placeNewDocument(newDocument);
}
function renderOPML(xmlFile, xmlRules) {
let newDocument = createPage();
if (xmlFile.querySelector(xmlRules.feedTitlePage)) {
newDocument.title =
xmlFile
.querySelector(xmlRules.feedTitlePage)
.textContent;
}
if (xmlFile.querySelector(xmlRules.feedLanguage)) {
let language;
if (xmlFile.querySelector(xmlRules.feedLanguage)) {
language =
xmlFile
.querySelector(xmlRules.feedLanguage)
.textContent;
}
newDocument.documentElement.setAttribute('lang', language);
}
let feed = newDocument.createElement('div');
feed.id = 'feed';
let title = newDocument.createElement('h1');
if (xmlFile.querySelector(xmlRules.feedTitlePage)) {
title.textContent =
xmlFile
.querySelector(xmlRules.feedTitlePage)
.textContent;
}
if (!title.textContent) {
title.textContent = document.location.hostname;
}
title.id = 'title';
feed.append(title);
let subtitle = newDocument.createElement('h2');
if (xmlFile.querySelector(xmlRules.feedSubtitle)) {
subtitle.textContent =
xmlFile
.querySelector(xmlRules.feedSubtitle)
.textContent
.replace(/(<([^>]+)>)/gi, "");
}
if (!subtitle.textContent) {
subtitle.textContent = defaultSubtitle;
}
subtitle.id = 'subtitle';
feed.append(subtitle);
let toc = newDocument.createElement('ol');
toc.id = 'toc';
feed.append(toc);
let articles = newDocument.createElement('div');
articles.id = 'articles';
feed.append(articles);
if (xmlFile.querySelectorAll(xmlRules.feedItem).length) {
for (const item of xmlFile.querySelectorAll(xmlRules.feedItem)) {
if (!item.children.length) {
let items = xmlFile.querySelectorAll(xmlRules.feedItem).length;
let index = Array.from(xmlFile.querySelectorAll(xmlRules.feedItem)).indexOf(item) + 1;
let titleToc = newDocument.createElement('a');
// /questions/5002111/how-to-strip-html-tags-from-string-in-javascript
if (item.getAttribute(xmlRules.feedItemTitle)) {
titleToc.textContent =
item
.getAttribute(xmlRules.feedItemTitle);
//titleToc.textContent =
titleToc.innerHTML =
titleToc
.textContent
.replace(/(<([^>]+)>)/gi, "");
} else
if (item.getAttribute(xmlRules.feedItemDate)) {
let dateAsTitle = new Date(item.getAttribute(xmlRules.feedItemDate));
titleToc.textContent = dateAsTitle.toDateString();
} else
if (item.getAttribute(xmlRules.feedItemSummary)) {
titleToc.innerHTML =
item
.getAttribute(xmlRules.feedItemSummary)
.replace(/(<([^>]+)>)/gi, "");
} else {
titleToc.textContent = '*** No Title ***';
}
titleToc.href = `#newspaper-oujs-${index}`;
titleToc.title = titleToc.textContent;
let liElement = newDocument.createElement('li');
liElement.append(titleToc)
toc.append(liElement);
let entry = newDocument.createElement('div');
entry.className = 'entry';
let link = newDocument.createElement('a');
link.id = `newspaper-oujs-${index}`;
if (item.getAttribute(xmlRules.feedItemTitle)) {
//link.textContent =
link.innerHTML =
item
.getAttribute(xmlRules.feedItemTitle)
.replace(/(<([^>]+)>)/gi, "");
} else
if (item.getAttribute(xmlRules.feedItemDate)) {
let dateAsTitle = new Date(item.getAttribute(xmlRules.feedItemDate));
link.textContent = dateAsTitle.toDateString();
} else
if (item.getAttribute(xmlRules.feedItemSummary)) {
//link.textContent =
link.innerHTML =
item
.getAttribute(xmlRules.feedItemSummary)
.replace(/(<([^>]+)>)/gi, "");
} else {
link.textContent = 'No Title';
}
// NOTE Test
if (item.getAttribute(xmlRules.feedItemLink)) {
// rss
link.href =
item
.getAttribute(xmlRules.feedItemLink);
} else {
link.href = './?ref=feed';
}
title = newDocument.createElement('h3');
title.className = 'title';
title.append(link);
entry.append(title);
if (item.getAttribute(xmlRules.feedItemDate)) {
let date = newDocument.createElement('h4');
date.className = 'published';
date.textContent =
item
.getAttribute(xmlRules.feedItemDate);
entry.append(date);
}
if (item.getAttribute(xmlRules.feedItemContent)) {
let text = newDocument.createElement('div');
text.className = 'content content-text';
text.innerHTML =
item
.getAttribute(xmlRules.feedItemContent);
if (/<\/?[a-z][\s\S]*>/i.test(text.innerHTML)) {
text.className = 'content';
}
entry.append(text);
} else
if (item.getAttribute(xmlRules.feedItemSummary)) {
let text = newDocument.createElement('div');
text.className = 'content content-text';
text.innerHTML =
item
.getAttribute(xmlRules.feedItemSummary);
if (/<\/?[a-z][\s\S]*>/i.test(text.innerHTML)) {
text.className = 'content';
}
entry.append(text);
}
if (item.getAttribute(xmlRules.feedItemEnclosure)) {
let enclosures = newDocument.createElement('div');
enclosures.className = 'enclosures';
enclosures.title = 'Right-click and Save link as…';
// TODO Skip enclosures with empty href
// https://gnu.tiflolinux.org/api/statuses/public_timeline.atom
let file = newDocument.createElement('div');
file.className = 'enclosure';
enclosures.append(file);
let icon = newDocument.createElement('span');
let documentType;
if (item.getAttribute('type')) {
documentType = item.getAttribute('type');
}
icon.setAttribute('icon', documentType);
file.append(icon);
let link = newDocument.createElement('a');
let enclosureBase, enclosureUrl;
if (item.getAttribute(xmlRules.feedItemEnclosure)) {
enclosureUrl = item.getAttribute(xmlRules.feedItemEnclosure);
enclosureBase = enclosureUrl.split('/').pop();
if (!enclosureBase.includes('.')) {
if (['atom','json','rss'].includes(documentType)) {
enclosureBase = 'feed.' + documentType;
} else {
enclosureBase = 'feed';
}
}
}
if (documentType) {
link.textContent = enclosureBase + ' (' + documentType + ')';
} else {
link.textContent = enclosureBase;
}
link.download = enclosureBase;
link.href = enclosureUrl;
file.append(link);
entry.append(enclosures);
}
articles.append(entry);
if (
index > 4 &&
index < items &&
!document.location.search.includes('streamburner_show=all')
)
{
let titleToc = newDocument.createElement('a');
titleToc.textContent = `See all news >`;
titleToc.title = `This feed offers ${items} items`; // NOTE Miscount
listAll = new URL(document.location.href);
listAll.searchParams.set('streamburner_show', 'all');
titleToc.href = listAll.href;
toc.append(titleToc);
break;
}
}
}
}
newDocument.body.append(feed);
newDocument = checkContentEmptiness(newDocument);
placeNewDocument(newDocument);
}
function createPage() {
let domParser = new DOMParser();
let newDocument =
domParser
.parseFromString('', 'text/html');
return newDocument;
}
async function getMinimumItemNumber() {
return await GM.getValue('item-number', 5);
}
function checkContentEmptiness(newDocument) {
if (newDocument.getElementsByClassName('entry').length == 1) {
newDocument.getElementById('toc').remove();
// NOTE https://dbpedia.org/data/Searx.atom
if (!newDocument.getElementById('articles').outerText) {
newDocument.getElementsByClassName('entry')[0].remove();
// Should removed data be added to the htmlEmpty message?
// newDocument.getElementsByClassName('entry')[0].outerHTML;
newDocument.getElementById('articles')
.insertAdjacentHTML('beforeend', htmlEmpty);
}
} else
if (newDocument.getElementsByClassName('entry').length == 0) {
newDocument.getElementById('toc').remove();
newDocument.getElementById('articles')
.insertAdjacentHTML('beforeend', htmlEmpty);
}
return newDocument;
}
// Possible solution for the document.contentType issue
// /questions/40201137/i-need-to-read-a-text-file-from-a-javascript
// https://openuserjs.org/garage/Loading_functions_after_document_is_replaced_by_new_document
function placeNewDocument(newDocument) {
// Failed attempt to force web browser to treat file as HTML
var meta = newDocument.createElement('meta');
meta.setAttribute('http-equiv', 'Content-Type');
meta.setAttribute('content', 'text/html; charset=utf-8');
// Append the <meta> element to the <head> element
newDocument.head.appendChild(meta);
// Failed attempt to force web browser to treat file as HTML
newDocument = purgeStylesheets(newDocument); // FIXME
newDocument = setCssStylesheet(newDocument); // FIXME TODO SET XML-STYLESHEET IF CONTENT-TYPE IS XML
if (xmlStylesheet) {
stylesheetMessage(newDocument)
}
if (document.contentType.endsWith('xml')) {
issue3164Message(newDocument, document.contentType)
}
//newDocument.querySelector('#homepage').href = location.protocol + '//' + location.hostname;
//var newDoc = document.adoptNode(newDoc.documentElement, true);
let insertDocument =
document
.importNode(
newDocument
.documentElement,
true
);
let removeDocument =
document
.documentElement;
document
.replaceChild(
insertDocument,
removeDocument
);
}
// TODO
// The following events don't work on some pages: https://momi.ca/feed.xml
// Perhaps, confine them to some type of window.onload = (event) => { CODE }
function extensionLoader() {
// /questions/381744/is-there-anyway-to-change-the-content-type-of-an-xml-document-in-the-xml-docume
// /questions/23034283/is-it-possible-to-use-htmls-queryselector-to-select-by-xlink-attribute-in-an
//purgeStylesheets(); // FIXME
//setCssStylesheet(); // FIXME TODO SET XML-STYLESHEET IF CONTENT-TYPE IS XML
scrollDown();
decorateEntry();
linksBar();
follow();
subToMe();
setFont();
dark();
toggleMode();
fontSizeControl();
navigation();
direction();
//setBanner();
//truncateToc();
setQuote();
formatDate();
helpPage();
instructions();
compactHelpPage();
supportPage();
homePage();
pickRandomFeed();
generateOPML();
settingsPage();
settings();
noReferrer();
settleFilters();
statusBar();
mailTo();
//geckoHelp();
setNonceUponCSP();
transformFileSize();
trimEnclosureFilename();
bittorrent();
//hideQuote();
}
function noReferrer() {
for (const element of document.querySelectorAll('a[href]')) {
element.rel = 'noreferrer';
}
}
function trimEnclosureFilename() {
for (const fileName of document.querySelectorAll('.enclosure > a')) {
if (fileName.textContent.includes('?')) {
//let newfileName;
//newfileName = fileName.href.split('/').pop();
//newfileName = newfileName.substring(0, newfileName.indexOf('?'));
let newfileName = fileName.textContent.substring(0, fileName.textContent.indexOf('?'));
fileName.textContent = newfileName;
fileName.download = newfileName;
fileName.href = newfileName;
}
}
}
// questions/10420352/converting-file-size-in-bytes-to-human-readable-string
function transformFileSize() {
for (const item of document.querySelectorAll('.size')) {
size = item.textContent;
var i = size == 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024));
item.textContent = (size / Math.pow(1024, i)).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
if (item.textContent == '0 B' ||
item.textContent == 'NaN undefined') {
item.textContent = null;
}
}
}
function truncateToc() {
for (const titleToc of document.querySelectorAll('#toc > li > a')) {
if (titleToc.textContent.length > 70) {
titleToc.title = titleToc.textContent;
titleToc.textContent =
titleToc
.textContent
.substring(0, 70) + ' […]';
}
}
}
function stylesheetMessage(document) {
let aElement = document.createElement('a');
document.body.prepend(aElement);
//aElement.href = location.href.substring(0, location.href.indexOf('#')) + location.search + '?streamburner=0';
let url = new URL(location.href);
url.searchParams.set('streamburner_active','0');
aElement.href = url.href;
aElement.innerHTML = 'View this feed with its own stylesheet'; // This feed has its own stylesheet
aElement.id = 'xslt-message';
}
function issue3164Message(document, mimetype) {
let aElement = document.createElement('a');
document.body.prepend(aElement);
aElement.href = 'https://github.com/greasemonkey/greasemonkey/issues/3164';
aElement.innerHTML = `Some actions might not work on this page (${mimetype}). See issue #3164`;
// NOTE document.contentType when is executed
// directly from this function, returns text/html
aElement.title = mimetype;
aElement.id = 'issue-3164';
}
function setBanner() {
let aElement = document.createElement('a');
aElement.href = 'https://www.falkon.org/?ref=newspaper';
aElement.id = 'feed-banner';
document.body.append(aElement);
aElement.insertAdjacentHTML('beforeend', banner);
}
function setQuote() {
let divElement = document.createElement('div');
divElement.id = 'feed-quote';
document.body.append(divElement);
divElement.insertAdjacentHTML('beforeend', quote);
}
// TODO Write this function in a sensible manner
function getHomeLink(xmlFile, xmlRules) {
let url = null;
console.log(xmlFile.querySelectorAll(xmlRules.feedLink))
let links = xmlFile.querySelectorAll(xmlRules.feedLink)
//links.forEach(link => {
// if (link.getAttribute('rel') == 'alternate') {
// url = link.getAttribute('href');
// }
//})
for (link of links) {
if (link.getAttribute('rel') == 'alternate') {
url = link.getAttribute('href');
break;
}
}
for (link of links) {
if (url) { break; }
let rel = link.getAttribute('rel');
if (rel && rel != 'alternate') { continue; }
if (link.getAttribute('href')) {
url = link.getAttribute('href');
break;
}
}
for (link of links) {
if (url) { break; }
let rel = link.getAttribute('rel');
if (rel && rel != 'alternate') { continue; }
if (link.textContent.length > 0) {
url = link.textContent;
break;
}
}
// let links = xmlFile.querySelectorAll(xmlRules.feedLink), url = null;
//
// for (let link of links) {
// if (url) break; // if url is already assigned, break the loop
// let rel = link.getAttribute('rel');
// if (['hub', 'self', 'search'].includes(rel)) {
// break;
// }
// if (link.getAttribute('rel') == 'alternate') {
// url = link.getAttribute('href');
// } else if (link.textContent.length > 0) {
// url = link.textContent;
// }
// }
// SMF
if (xmlFile.getElementsByTagName('smf:xml-feed')[0] &&
xmlFile.getElementsByTagName('smf:xml-feed')[0].getAttribute('forum-url')) {
url = xmlFile
.getElementsByTagName('smf:xml-feed')[0]
.getAttribute('forum-url');
//.getAttribute('source');
}
if (url) {
if (url == document.baseURI) {
url = document.location.protocol + '//' + document.location.hostname;
}
return url;
//} else {
// return location.protocol + '//' + location.hostname;
}
}
function generateOPML() {
/*
<?xml version="1.0" encoding="utf-8"?>
<opml version="1.0">
<head>
<title>Liferea Feed List Export</title>
</head>
<body>
<outline title="TITLE" text="TITLE" description="TITLE" type="folder">
<outline title="TITLE" text="TITLE" description="TITLE" type="rss" xmlUrl="URL"/>
</outline>
</body>
</opml>
*/
// https://vegibit.com/how-to-parse-and-generate-xml-in-javascript/
document
.querySelector('#opml-selection')
.addEventListener ('click', function() {
var opmlData = document.implementation.createDocument(null, "opml", null);
opmlData.getElementsByTagName("opml")[0].setAttribute("version", "1.0");
var text = opmlData.createTextNode("Newspaper Feed Selection");
let name = opmlData.createElement("title")
let head = opmlData.createElement("head")
let body = opmlData.createElement("body");
let sections = document.querySelectorAll('#feeds .content .category');
for (const section of sections) {
let title = section.querySelector('h3').outerText;
let category = opmlData.createElement("outline");
category.setAttribute("title", title);
category.setAttribute("text", title);
category.setAttribute("text", title);
category.setAttribute("type", "folder");
let links = section.querySelectorAll('a');
for (const link of links) {
let feed = opmlData.createElement("outline");
let title = link.outerText;
let url = link.href;
feed.setAttribute("title", title);
feed.setAttribute("text", title);
feed.setAttribute("text", title);
// NOTE This value is arbitrary.
// TODO Add type to class.
feed.setAttribute("type", "rss");
feed.setAttribute("xmlUrl", url);
category.appendChild(feed);
}
body.appendChild(category);
}
head.appendChild(name);
name.appendChild(text);
opmlData.getElementsByTagName("opml")[0].appendChild(head);
opmlData.getElementsByTagName("opml")[0].appendChild(body);
var opmlFile = new XMLSerializer().serializeToString(opmlData);
savePage(
opmlFile,
'i2p-schimon-newspaper',
'text/x-opml+xml',
'opml'
)
});
}
function pickRandomFeed() {
//let feeds = document.querySelectorAll('#feeds .content .category a');
let sections = document.querySelectorAll('#feeds .content .category');
let section = sections[Math.floor(Math.random()*sections.length)];
let category = section.querySelector('h3');
let feeds = section.querySelectorAll('a');
let feed = feeds[Math.floor(Math.random()*feeds.length)];
for (const a of document.querySelectorAll('#feeds a.feed-category')) {
a.textContent = category.outerText;
a.href = '#' + section.id;
}
for (const a of document.querySelectorAll('#feeds a.feed-url')) {
a.textContent = feed.outerText;
a.href = feed.href;
}
}
// FIXME https://lw1.at/en/postfeed.xml
function getDateXML(xmlFile, xmlRules) {
//if (xmlFile.getElementsByTagName('smf:xml-feed')[0]) {
// date = xmlFile.getElementsByTagName('smf:xml-feed')[0].getAttribute('generated-date-UTC');
//} else
if (xmlFile.querySelector(xmlRules.feedDate)) {
date = xmlFile.querySelector(xmlRules.feedDate).textContent;
} else
if (xmlFile.querySelector(xmlRules.feedItemDate)) {
date = xmlFile.querySelector(xmlRules.feedItemDate).textContent;
} else {
return null;
}
return date;
}
function feedInfoXML(xmlFile, xmlRules, type) {
// metadata
let
keys = [
'document.contentType',
'description',
'link',
'generator',
'updated',
'type'],
rules = [
null,
xmlRules.feedSubtitle,
null,
xmlRules.feedGenerated,
null,
null];
values = [
document.contentType,
null,
getHomeLink(xmlFile, xmlRules),
null,
getDateXML(xmlFile, xmlRules),
type];
for (let i = 0; i < keys.length; i++) {
let meta = document.createElement('meta');
let name = keys[i];
let content;
if (values[i]) {
content = values[i];
} else
if (xmlFile.querySelector(rules[i])) {
content = xmlFile.querySelector(rules[i]).textContent;
}
if (content) {
meta.setAttribute('name', name);
meta.setAttribute('content', content);
document.head.appendChild(meta);
}
}
let divElement = document.createElement('div');
divElement.id = 'feed-info';
if (date = xmlFile.querySelector(xmlRules.feedDate)) {
// FIXME No date for https://www.parlament.mt/en/rss/?t=calendar
divElement.innerHTML = `${type} syndication updated at <span class="published">${date.textContent}</span>`;
} else {
divElement.innerHTML = `${type} syndication`;
}
document.body.append(divElement);
}
function feedInfoJSON(jsonFile, homeRule, generatedRule, versionRule, dateRule, type) {
// metadata
let
keys = [
'document.contentType',
'link',
'generator',
'version',
'updated',
'type'],
rules = [
null,
homeRule,
generatedRule,
versionRule,
dateRule,
null];
values = [
document.contentType,
homeRule,
null,
null,
null,
type];
for (let i = 0; i < keys.length; i++) {
let meta = document.createElement('meta');
let name = keys[i];
let content;
if (values[i]) {
content = values[i];
} else
if (rules[i]) {
content = rules[i];
}
if (content) {
meta.setAttribute('name', name);
meta.setAttribute('content', content);
document.head.appendChild(meta);
}
}
let divElement = document.createElement('div');
divElement.id = 'feed-info';
if (date = dateRule) {
divElement.innerHTML = `${type} syndication updated at <span class="published">${date}</span>`;
} else {
divElement.innerHTML = `${type} syndication`;
}
document.body.append(divElement);
}
function decorateEntry() {
for (const entry of document.querySelectorAll('.entry')) {
let divElement = document.createElement('span');
divElement.className = 'decor';
entry.parentNode.insertBefore(divElement, entry.nextSibling);
}
}
function formatDate() {
let elements = ['.published', '.updated'];
for (let i = 0; i < elements.length; i++) {
for (const element of document.querySelectorAll(elements[i])) {
let date = new Date(element.textContent);
if (date == 'Invalid Date') continue;
//element.textContent = date.toDateString();
element.textContent = date.toLocaleString();
}
}
}
// TODO SET XML-STYLESHEET IF CONTENT-TYPE IS XML
function setCssStylesheet(document) {
let cssStylesheet = document.createElement('style');
document.head.append(cssStylesheet);
//stylesheet.setAttribute('crossorigin', 'anonymous');
cssStylesheet.type = 'text/css';
cssStylesheet.id = namespace;
// TODO
// Set direction by the letters of the initial
// set of words if no language specified.
if (rtlLocales.includes(document.documentElement.getAttribute('lang'))) {
cssFileBase = cssFileLTR + cssFileRTL;
} else {
cssFileBase = cssFileLTR;
}
cssStylesheet.textContent = cssFileBase;
//cssStylesheet.setAttribute('unsafe-hashes', null);
return document; // FIXME
}
// FIXME Falkon
// Blocked due to server policy
// https://archlinux.org/feeds/packages/
// https://www.openstreetmap.org/traces/rss
// https://artemislena.eu/feed.json
// https://pypi.org/rss/updates.xml
// NOTE
// Consider https://openuserjs.org/libs/BigTSDMB/setStyle
function setNonceUponCSP() {
window.addEventListener("securitypolicyviolation", (e) => {
//let message = e.originalPolicy;
//messageTruncated = message.substring(message.indexOf("'nonce-") + 7);
//let nonceValue = messageTruncated.substring(0, messageTruncated.indexOf("'"));
cssStylesheet = document.getElementById(namespace);
let nonceValue = e.originalPolicy.match(/'nonce-(.*?)'/)[1];
cssStylesheet.setAttribute('nonce', nonceValue);
//let hashValue = e.originalPolicy.match(/sha256-[A-Za-z0-9+/=]+/)[0];
//cssStylesheet.setAttribute('unsafe-inline', hashValue);
// Reload stylesheet
textContent = cssStylesheet.textContent;
cssStylesheet.textContent = null;
cssStylesheet.textContent = textContent;
}, { passive : true, });
}
// NOTE
// https://momi.ca/feed.xml
// https://momi.ca/css/base.css
// https://momi.ca/css/dark.css
function purgeStylesheets(document) {
for (const style of document.querySelectorAll('link[rel="stylesheet"]')) {
style.remove();
}
return document; // FIXME
}
function follow() {
let flw = document.querySelector('#follow');
flw.href = `feed:${location.href}`;
/*
flw.addEventListener ('click', function() {
if (url) {
location.href = `feed:${url}`;
} else {
location.href = `feed:${location.href}`;
}
});
*/
}
function hideQuote() {
document
.querySelector('.quote.content')
.addEventListener ('dblclick', function() {
document
.querySelector('.quote.content')
.style
.display = 'none';
});
}
function bittorrent() {
document
//.querySelector('.category:has(#torrents)')
//.parentElement
.querySelector('#torrents')
.addEventListener ('mouseover', function() {
document
.querySelector('#torrents h3')
//.innerHTML = `<span class="text-icon orange">RSS</span> & BitTorrent. It's A Neverending Love Story...`;
.innerHTML = `<span class="text-icon orange">RSS</span> & BitTorrent. The NeverEnding Story.`;
// TODO Add animated effect which will be activated upon each event mouseover
});
}
function subToMe() {
let stm = document.querySelector('#subtome');
//stm.href = `https://www.subtome.com/#/subscribe?feeds=${location.href}`;
stm.addEventListener ('click', function() {
(function(btn){
let z = document.createElement('script');
document.subtomeBtn = btn;
z.src = "https://www.subtome.com/load.js";
document.body.appendChild(z);
})(stm);
return false;
});
}
async function setFont() {
//if (document.contentType.endsWith('xml')) return;
// type
document.body.style.fontFamily = await GM.getValue('font-type', 'serif');
// size
document.getElementById('articles').style
.fontSize = await GM.getValue('font-size') + 'px';
}
async function dark() {
if (document.contentType.endsWith('xml')) return;
cssSelectors = [
'body', 'code', 'a', '.enclosures', '#empty-feed'];
if (await GM.getValue('view-mode') == 'dark') {
for (cssSelector of cssSelectors) {
for (element of document.querySelectorAll(cssSelector)) {
element.classList.add('dark');
let mode = document.querySelector('#mode');
//mode.textContent = '💡'; // 🌓
//mode.style.filter = 'saturate(7)';
mode.style.filter = 'brightness(0.5)'; // invert
mode.title = 'Switch to bright mode';
}
}
}
}
function toggleMode() {
let mode = document.querySelector('#mode');
cssSelectors = [
'body', 'code', 'a', '.enclosures', '#empty-feed'];
mode.addEventListener ('click', async function() {
if (document.contentType.endsWith('xml')) {
alert('Dark mode is disabled on this page.');
return;
}
try {
if (await GM.getValue('view-mode') == 'dark') {
await GM.setValue('view-mode', 'bright');
//mode.textContent = 'Light View';
//mode.textContent = '💡';
//mode.textContent = '◐';
mode.style.filter = 'saturate(7)'; // revert
mode.title = 'Switch to dark mode';
infoSquare('Bright mode');
for (cssSelector of cssSelectors) {
for (element of document.querySelectorAll(cssSelector)) {
element.classList.remove('dark');
}
}
} else {
await GM.setValue('view-mode', 'dark');
//mode.textContent = 'Dark View';
//mode.textContent = '🌙';
//mode.textContent = '●';
mode.style.filter = 'brightness(0.5)'; // invert
mode.title = 'Switch to bright mode';
infoSquare('Dark mode');
for (cssSelector of cssSelectors) {
for (element of document.querySelectorAll(cssSelector)) {
element.classList.add('dark');
}
}
}
} catch { // Greasemonkey API Not Available
if (document.querySelector('#feed .dark')) {
mode.style.filter = 'saturate(7)'; // revert
mode.title = 'Switch to bright mode';
infoSquare('Dark mode');
for (cssSelector of cssSelectors) {
for (element of document.querySelectorAll(cssSelector)) {
element.classList.remove('dark');
}
}
} else {
mode.style.filter = 'brightness(0.5)'; // invert
mode.title = 'Switch to dark mode';
infoSquare('Bright mode');
for (cssSelector of cssSelectors) {
for (element of document.querySelectorAll(cssSelector)) {
element.classList.add('dark');
}
}
}
}
});
}
/*
function toggleMode() {
let mode = document.querySelector('#mode');
mode.addEventListener ('click', function() {
cssSelectors = [
'body', 'code', 'a', '.enclosures', '#empty-feed'];
for (cssSelector of cssSelectors) {
for (element of document.querySelectorAll(cssSelector)) {
//element.style.color = 'WhiteSmoke';
element.classList.toggle('dark');
}
}
if (document.querySelector('body.dark')) {
mode.textContent = 'Light View';
mode.title = 'Switch to bright mode';
} else {
mode.textContent = 'Dark View';
mode.title = 'Switch to dark mode';
}
//document.querySelector('#links-bar > a:nth-child(1)').style.color = '#333';
//document.body.style.background = '#333';
});
}
*/
// /questions/38627822/increase-the-font-size-with-a-click-of-a-button-using-only-javascript
function fontSizeControl() {
document
.querySelector('#increase')
.addEventListener ('click', async function() {
txt = document.getElementById('articles');
style = window.getComputedStyle(txt, null).getPropertyValue('font-size');
currentSize = parseFloat(style);
if (currentSize < 35) {
txt.style.fontSize = (currentSize + 5) + 'px';
infoSquare('Text size: ' + txt.style.fontSize);
}
await GM.setValue('font-size', currentSize + 5);
});
document
.querySelector('#decrease')
.addEventListener ('click', async function() {
txt = document.getElementById('articles');
style = window.getComputedStyle(txt, null).getPropertyValue('font-size');
currentSize = parseFloat(style);
if (currentSize > 20) {
txt.style.fontSize = (currentSize - 5) + 'px';
infoSquare('Text size: ' + txt.style.fontSize);
}
await GM.setValue('font-size', currentSize - 5);
});
}
// TODO Change variable 'currentEntry' upon scrolling
function navigation() {
let entries = document.querySelectorAll('.entry').length - 1;
var currentEntry = -1;
document.addEventListener('keydown', function(e) {
if (e.ctrlKey && e.shiftKey && e.which == 40) {
currentEntry = itemNext(entries, currentEntry);
}
});
document
.querySelector('#next')
.addEventListener ('click', function() {
currentEntry = itemNext(entries, currentEntry);
});
document.addEventListener('keydown', function(e) {
if (e.ctrlKey && e.shiftKey && e.which == 38) {
currentEntry = itemPrevious(entries, currentEntry);
}
});
document
.querySelector('#previous')
.addEventListener ('click', function() {
currentEntry = itemPrevious(entries, currentEntry);
});
}
function itemNext(entries, currentEntry) {
//currentEntry = entries[currentEntry - 1];
if (currentEntry < entries) {
currentEntry += 1;
}
if (currentEntry > 0) {
document.querySelectorAll('.entry')[currentEntry].previousElementSibling.scrollIntoView();
} else {
document.querySelectorAll('.entry')[currentEntry].parentElement.scrollIntoView();
}
return currentEntry;
}
function itemPrevious(entries, currentEntry) {
//currentEntry = entries[currentEntry - 1];
if (currentEntry > 0) {
currentEntry -= 1;
}
if (currentEntry > 0) {
document.querySelectorAll('.entry')[currentEntry].previousElementSibling.scrollIntoView();
} else {
document.querySelectorAll('.entry')[currentEntry].parentElement.scrollIntoView();
}
return currentEntry;
}
function direction() {
let dire = document.querySelector('#direction');
dire.addEventListener ('click', function() {
if (document.dir == 'ltr' || !document.dir) {
document.dir = 'rtl';
dire.textContent = 'RTL'; // ❰
dire.title = 'Switch to Left-to-right direction';
infoSquare('Right-to-left');
} else {
document.dir = 'ltr';
dire.textContent = 'LTR'; // ❱
dire.title = 'Switch to Right-to-left direction';
infoSquare('Left-to-right');
}
});
}
function instructions() {
// Gecko
programs = ["waterfox", "librewolf", "seamonkey", "firefox"];
for (let i = 0; i < programs.length; i++) {
if (navigator.userAgent.toLowerCase().includes(programs[i])) {
program = programs[i][0].toUpperCase() + programs[i].substring(1);
document
.querySelector('#page-about')
.insertAdjacentHTML('afterbegin', helpGecko);
document
.querySelector('#about-toc')
.insertAdjacentHTML(
'afterbegin',
`
<li>
<a href="#open-in-browser">${program} Help: Enable XML-based Feeds</a>
</li>
<li>
<a href="#gecko">${program} Help: Enable JSON-based Feeds</a>
</li>
`);
document
.querySelector('#open-in-browser-rules')
.addEventListener ('click', function() {
savePage(
ruleSetOpenInBrowser,
'streamburner-open-in-browser-ruleset',
'application/json',
'json'
)
});
}
}
// Header Editor
/* programs = ["waterfox", "librewolf", "seamonkey", "firefox", "chrome", "edge"];
for (let i = 0; i < programs.length; i++) {
if (navigator.userAgent.toLowerCase().includes(programs[i])) {
let program = programs[i][0].toUpperCase() + programs[i].substring(1);
document
.querySelector('#page-about')
.insertAdjacentHTML('beforeend', helpHeaderEditor);
document
.querySelector('#header-editor-install')
.href = (function () {
let link;
switch (programs[i]) {
case 'chrome':
link = 'https://chrome.google.com/webstore/detail/header-editor/eningockdidmgiojffjmkdblpjocbhgh';
break;
case 'edge':
link = 'https://microsoftedge.microsoft.com/addons/detail/header-editor/afopnekiinpekooejpchnkgfffaeceko';
break;
default:
link = 'https://addons.mozilla.org/firefox/addon/header-editor/';
}
return link;
}());
document
.querySelector('#about-toc')
.insertAdjacentHTML(
'beforeend',
`<li><a href="#header-editor">${program} Help: Enable web feeds with Header Editor</a></li>`);
document
.querySelector('#header-editor-rules')
.addEventListener ('click', function() {
savePage(
ruleSetHeaderEditor,
'streamburner-header-editor-ruleset'
'application/json',
'json'
)
});
}
} */
}
function linksBar() {
let divElement = document.createElement('div');
divElement.innerHTML = htmlBar;
let subtitle = document.querySelector('#subtitle');
subtitle.parentNode.insertBefore(divElement, subtitle.nextSibling);
}
function helpPage() {
document.body.insertAdjacentHTML('beforeend', htmlAbout);
let btn = document.querySelector('#about-help');
btn.addEventListener ('click', function() {
document
.querySelector('#page-about')
.style
.display = 'block';
});
// freedos at sourceforge won't allow inline ondblclick
// ondblclick="this.style.display = "none""
/*
let dia = document.querySelector('#page-about');
dia.addEventListener ('dblclick', function() {
document
.querySelector('#page-about')
.style
.display = 'none';
});
*/
}
function compactHelpPage() {
for (const element of document.querySelectorAll('.about-newspaper .decor')) {
element.classList.add('hide');
}
for (const element of document.querySelectorAll('.about-newspaper .segment')) {
if (element.id != 'table-of-contents') {
element.classList.add('hide');
}
}
for (const element of document.querySelectorAll('#about-toc a, a.link')) {
element.addEventListener ('click', function() {
document.querySelector(`${element.href.slice(element.href.indexOf('#'))}`).classList.remove('hide');
document.querySelector('.about-newspaper .back-to-menu').classList.remove('hide');
document.querySelector(`.about-newspaper #table-of-contents`).classList.add('hide');
});
//element.removeAttribute('href');
}
let button = document.querySelector('.about-newspaper .back-to-menu');
button.classList.add('hide');
button.addEventListener ('click', function() {
for (const element of document.querySelectorAll('.segment')) {
if (element.id != 'table-of-contents') {
element.classList.add('hide');
}
}
//button.classList.add('hide');
document
.querySelector('.about-newspaper .back-to-menu')
.classList.add('hide');
document
.querySelector(`#table-of-contents`)
.classList.remove('hide');
});
document
.querySelector('.about-newspaper .return-to-feed')
.addEventListener ('click', function() {
document.querySelector('#page-about').style.display = 'none';
});
}
function homePage() {
let link;
if (document.querySelector('meta[name="link"]')) {
link = document.querySelector('meta[name="link"]').getAttribute('content');
document.querySelector('#homepage').href = link;
} else {
document.querySelector('#homepage').remove();
return;
}
/*
if (!link && document.location.hostname) {
link = document.location.hostname;
} else
if (!link) { // Local file (i.e. file://)
link = document.location.href.slice(0, location.href.lastIndexOf('/'));
}
document.querySelector('#homepage').href = link;
*/
}
function supportPage() {
document.body.insertAdjacentHTML('beforeend', htmlSupport);
let dia = document.querySelector('#page-support');
document.querySelector('#about-support')
.addEventListener ("click", function() {
dia
.style
.display = 'block';
});
// freedos at sourceforge won't allow inline ondblclick
// ondblclick="this.style.display = "none""
document
.querySelector('#page-support .return-to-feed')
.addEventListener ("click", function() {
dia.style.display = 'none';
});
}
function settingsPage() {
document.body.insertAdjacentHTML('beforeend', htmlSettings);
let btn = document.querySelector('#about-settings');
let dia = document.querySelector('#page-settings');
btn.addEventListener ("click", function() {
if (document.contentType.endsWith('xml')) {
alert('Setting are disabled on this page.');
return;
}
dia.style.display = 'block';
});
}
async function settings() {
for (const controller of document.querySelectorAll('#page-settings input, #page-settings select')) {
let value = await GM.getValue(controller.name);
switch (controller.type) {
case ('select-one'):
controller.querySelector(`[value=${value}`).setAttribute('selected', null);
break;
case ('number'):
controller.setAttribute('value', value);
break;
case ('checkbox'):
if (value == true) {
controller.setAttribute('checked', null);
}
break;
case ('radio'):
if (value == controller.id) {
controller.setAttribute('checked', null);
}
break;
}
controller.addEventListener ('input', async function() {
//controller.addEventListener ('click', function() {
let value, key = this.name;
if (this.type == 'radio') {
value = this.id;
} else
if (this.checked) {
value = this.checked;
} else
if (this.value) {
value = this.value;
}
await GM.setValue(key, value);
//console.log(key,':', value);
//console.log(await GM.listValues());
});
}
document
.querySelector('#page-settings #close')
.addEventListener ('click', function() {
document
.querySelector('#page-settings')
.style.display = 'none';
});
document
.querySelector('#page-settings #reload')
.addEventListener ('click', function() {
//window.location.reload(true);
//window.location.reload();
location.reload();
});
}
// TODO Use this function and incorporate it with function mailTo()
function emptyPage() {
document
.querySelector('#articles')
.insertAdjacentHTML('beforeend', htmlEmpty);
}
function mailTo() {
// Add link with emails
if (document.querySelector('#empty-feed')) {
let ele, eml, hyl;
ele = document.querySelector('#empty-feed');
aElement = document.createElement('a');
aElement.id = 'email-link';
aElement.textContent = 'Contact Webmaster';
let una = ['admin', 'contact', 'feedback', 'form',
'hello', 'hi', 'info', 'me', 'office', 'pr',
'press', 'support', 'web', 'webmaster',];
hyl = `${una[0]}@${location.hostname},`
for (let i = 1; i < una.length; i++) {
hyl += `${una[i]}@${location.hostname},`;
}
//hyl = hyl.slice(0. -1);
aElement.href = `mailto:?subject=Web Feeds for ${location.hostname}&body=Hello,%0D%0A%0D%0AI have visited ${document.baseURI.slice(document.baseURI.indexOf(':')+3)} and saw that your Web Feed is empty.%0D%0A%0D%0APlease populate your Web Feed (aka RSS) so that people can easily receive updates from your website.%0D%0A%0D%0AIf you do not know what a Web Feed is or how you can benefit from it, visit aboutfeeds.com to read more about it.%0D%0A%0D%0AKind regards,%0D%0A&bcc=${hyl}`
ele.append(aElement);
}
}
function settleFilters() {
// Hide all links to software that are not of news
for (const element of document.querySelectorAll('#software > div.content a')) {
//if (element.className != 'news') {
if (!element.className.includes('news')) {
element.classList.add('hide');
}
}
// Create toggle mechanism
for (const element of document.querySelectorAll('.filter')) { // #filter > span
if (element.id != 'news') {
element.classList.toggle('grey');
}
element.addEventListener ('click', function() {
element.classList.toggle('grey');
for (const span of document.querySelectorAll(`.${element.id}`)) {
span.classList.toggle('hide');
}
});
}
// TODO set class="background" to system by navigator.platform
// TODO switch () { case }
if (navigator.platform.toLowerCase().includes('ubuntu')) {
document.querySelector('#ubports').classList.add('background');
} else
if (navigator.platform.toLowerCase().includes('tizen')) {
document.querySelector('#tizen').classList.add('background');
} else
if (navigator.platform.toLowerCase().includes('sailfish')) {
document.querySelector('#sailfish-os').classList.add('background');
} else
if (navigator.platform.toLowerCase().includes('kai')) {
document.querySelector('#gerda-os').classList.add('background');
} else
if (navigator.platform.toLowerCase().includes('android')) {
document.querySelector('#android-os').classList.add('background');
} else
if (navigator.platform.toLowerCase().includes('linux') ||
navigator.platform.toLowerCase().includes('bsd')) {
document.querySelector('#unix').classList.add('background');
} else
if (navigator.platform.toLowerCase().includes('mac')) {
document.querySelector('#mac-os').classList.add('background');
} else
if (navigator.platform.toLowerCase().includes('windows') ||
navigator.platform.toLowerCase().includes('react')) {
document.querySelector('#react-os').classList.add('background');
} else
if (navigator.platform.toLowerCase().includes('ipad') ||
navigator.platform.toLowerCase().includes('iphone')) {
document.querySelector('#ios').classList.add('background');
}
}
function statusBar() {
// Display entry title in status bar
for (const element of document.querySelectorAll('.entry')) {
element.addEventListener ('mouseover', function() {
infoSquare(`${this.querySelector('.title > a').textContent}`);
});
}
// Prepare links to be used with status bar
for (const element of document.querySelectorAll('#buttons-action a, #buttons-action span, #buttons-control span, #toc a')) {
element.addEventListener ('mouseover', function() {
//infoSquare(this.title);
if (this.title) {
this.setAttribute('info', this.title);
this.removeAttribute('title');
}
//infoSquare(`<b>Info: </b> ${this.getAttribute('info')}`);
infoSquare(`${this.getAttribute('info')}`);
});
}
// Remove status bar
for (const element of document.querySelectorAll('#links-bar')) {
//for (const element of document.querySelectorAll('#links-bar a')) {
element.addEventListener ('mouseleave', function() { // mouseout
if (document.querySelector('#info-square')) {
document.querySelector('#info-square').remove();
}
});
}
}
function floatBar() {
const cssStylesheet = document.getElementById(namespace);
if (document.querySelector('#links-bar')) {
document.querySelector('#links-bar').style.display = 'auto';
}
if (window.pageYOffset > 300) { // TODO when first entry is focused
cssStylesheet.textContent = cssFileBase + cssFileBar;
topButton();
} else {
cssStylesheet.textContent = cssFileBase;
document.querySelector('#links-bar').removeAttribute('style');
let elements = ['#top-navigation-button']; // '#close-bar'
for (let i = 0; i < elements.length; i++) {
if (document.querySelector(elements[i])) {
document.querySelector(elements[i]).remove();
}
}
}
}
function scrollDown() {
let url;
// Create toolbar and a button when scrolling down
document.addEventListener ('scroll', function() {
if (location.href == url ||
window.pageYOffset < 300) {
floatBar();
}
if (location.href != url) {
url = location.href;
}
});
}
/*
window.addEventListener ('hashchange', function() {
document.querySelector('#links-bar').style.display = 'none';
});
*/
/*
window.addEventListener ('scroll', function() {
const elementTitle = document.querySelector('#title');
const elementStyle = document.getElementById(namespace);
if (isInViewport(elementTitle)) {
elementStyle.textContent = stylesheetBase;
} else {
elementStyle.textContent = stylesheetBase + stylesheetBar;
}
});
*/
/*
// FIXME This is a safer fashion to do this task,
// specifically against server policy.
// NOTE Element is created, albeit without type="text/css",
// but no change applied, not even with !important
window.addEventListener ('scroll', function() {
const elementTitle = document.querySelector('#subtitle');
let elementStyle = document.querySelector('#bar');
if (isInViewport(elementTitle) && elementStyle) {
if (elementStyle) {
elementStyle.remove();
}
} else if (!elementStyle) {
elementStyle = document.createElement('style');
document.head.append(elementStyle);
elementStyle.textContent = stylesheetBar;
elementStyle.type = 'text/css';
elementStyle.id = 'bar';
}
});
*/
function imageData() {
/* TODO handle loading of images by saving bandwidth
document.body.addEventListener ('mouseover', function(e) {
if (e.target && e.target.nodeName == "IMG" && !e.target.src) {
console.log('DELEGATED');
source = e.target.getAttribute('src-data');
e.target.removeAttribute('src-data');
e.target.src = source;
}
});
for (const image of document.querySelectorAll('img')) {
image.addEventListener('mouseover', loadImage(image));
//image.onmouseover = () => {
// image.removeEventListener('mouseover',loadImage(image));
//}
}
*/
/*
for (const image of document.querySelectorAll('img')) {
image.addEventListener('focus',event => {
//image.addEventListener('mouseover',event => {
if (image.getAttribute('src-data')) {
//toggleAttribute(image);
source = image.getAttribute('src-data');
image.removeAttribute('src-data');
image.src = source;
}
}, {passive: true});
image.onmouseover = () => {
if (image.getAttribute('src-data')) {
//toggleAttribute(image);
source = image.getAttribute('src-data');
image.removeAttribute('src-data');
image.src = source;
}
};
}
*/
}
// Create status bar
function infoSquare(text) {
if (document.querySelector('#info-square')) {
document.querySelector('#info-square').remove();
}
let divElement = document.createElement('div');
divElement.id = 'info-square';
divElement.innerHTML = text; // codeberg feeds
//divElement.textContent = text;
document.body.append(divElement);
}
function topButton() {
if (document.querySelector('#top-navigation-button')) return;
let divElement = document.createElement('div');
divElement.id = 'top-navigation-button';
divElement.innerHTML = '^'; // ^ is better than ⬆️⥣⇧⇪➦
// behaviour
divElement.onclick = () => {
window.scrollTo({ top: 0 });
};
document.body.append(divElement);
}
// /questions/123999/how-can-i-tell-if-a-dom-element-is-visible-in-the-current-viewport
// https://www.javascripttutorial.net/dom/css/check-if-an-element-is-visible-in-the-viewport/
function isInViewport(element) {
const rect = element.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
}
function loadImage(image) {
//image.removeEventListener('mouseover',loadImage(image));
console.log('onmouseover');
let source = image.getAttribute('src-data');
image.removeAttribute('src-data');
image.src = source;
}
/* TODO handle loading of images by saving bandwidth
function toggleAttribute(image) {
source = image.getAttribute('src-data');
image.removeAttribute('src-data');
image.src = source;
}
*/
/* TODO handle loading of images by saving bandwidth
for (const image of document.querySelectorAll('img')) {
//source = image.src;
//image.removeAttribute('src');
//image.setAttribute('src-data', source);
image.setAttribute('src-data', image.src);
image.removeAttribute('src');
}
*/
/* TODO remove or parse <aside> or refer to XSLT to parse it as HTML
// https://web.dev/feed.xml
// /questions/9848465/js-remove-a-tag-without-deleting-content
for (const aside of document.querySelectorAll('aside')) {
aside.remove();
}
*/
function queryByXPath(queries) {
let result, i = 0;
do {
result = document.evaluate(
queries[i], document,
null, XPathResult.STRING_TYPE);
i = i + 1;
result = result.stringValue;
} while (!result && i < queries.length);
return result;
}
function pageLoader() {
let
newDocument, insertDocument, removeDocument;
// /questions/6464592/how-to-align-entire-html-body-to-the-center
const
loadPage = `
<html>
<head>
<title>Newspaper</title>
<style>
html, body {
height: 100%; }
html {
display: table;
margin: auto; }
body {
display: table-cell;
vertical-align:middle;
background-color: #f1f1f1;
font-family: system-ui;
cursor:default;
user-select: none;
max-height: 100%;
max-width: 100%; }
div {
font-size: 6vw;
font-weight: bold; }
</style>
</head>
<body>
<div>📰 Newspaper</div>
<div>Web Feed Reader</div>
<div>Loading web feed…</div>
</body>
</html>`,
domParser = new DOMParser();
newDocument = domParser.parseFromString(loadPage, 'text/html');
insertDocument = document.importNode(newDocument.documentElement, true);
removeDocument = document.documentElement;
document.replaceChild(insertDocument, removeDocument);
}
// export file
// /questions/4545311/download-a-file-by-jquery-ajax
// /questions/43135852/javascript-export-to-text-file
var savePage = (function () {
var a = document.createElement("a");
// document.body.appendChild(a);
// a.style = "display: none";
return function (fileData, fileName, fileType, fileExtension) {
var blob = new Blob([fileData], {type: fileType}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName + '.' + fileExtension;
a.click();
window.URL.revokeObjectURL(url);
};
}());