Newspaper (Syndication Feed Reader)

Native Feed Viewer. Render syndication feeds (supports ActivityStreams, Atom Syndication Format, JSON Feed, Nostr, OPML, OStatus, RDF, RSS, RSS-in-JSON, SMF, and Twtxt).

Old: v23.06.09 - 2023-06-09 - Change title
New: v23.06.10 - 2023-06-09 - Replace GM_setValue/GM_getValue with GM.setValue/GM.getValue. Special thank you to CY Fung. See: https://gf.zukizuki.org/en/discussions/development/187288-converting-gm-setvalue-gm-getvalue-to-gm-setvalue-gm-getvalue

  • --- /tmp/diffy20250804-3769827-6m9r9o 2025-08-04 22:14:18.259139853 +0000
  • +++ /tmp/diffy20250804-3769827-hbw5cc 2025-08-04 22:14:18.260139869 +0000
  • @@ -159,25 +159,33 @@
  • */
  • // ==UserScript==
  • -// @name Newspaper (Native RSS Reader)
  • -// @namespace i2p.schimon.newspaper
  • -// @description Native Feed Viewer. Render syndication web feeds (supports ActivityStreams, Atom, JSON, RDF and RSS)
  • -// @homepageURL https://sjehuda.github.io/newspaper.html
  • -// @supportURL https://openuserjs.org/scripts/sjehuda/Newspaper/issues
  • -// @updateURL https://openuserjs.org/meta/sjehuda/Newspaper.meta.js
  • -// @downloadURL https://openuserjs.org/install/sjehuda/Newspaper.user.js
  • -// @copyright 2023, Schimon Jehudah (http://schimon.i2p)
  • -// @license MIT; https://opensource.org/licenses/MIT
  • -// @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48dGV4dCB5PSIuOWVtIiBmb250LXNpemU9IjkwIj7wn5OwPC90ZXh0Pjwvc3ZnPgo=
  • -// @exclude *?streamburner=0
  • -// @exclude *?*streamburner=0
  • -// @match *://*/*
  • -// @version 23.06.09
  • -// @run-at document-start
  • -// @grant GM_setValue
  • -// @grant GM_getValue
  • +// @name Newspaper (Native RSS Reader)
  • +// @namespace i2p.schimon.newspaper
  • +// @description Native Feed Viewer. Render syndication web feeds (supports ActivityStreams, Atom, JSON, RDF and RSS)
  • +// @author Schimon Jehudah
  • +// @collaborator CY Fung
  • +// @homepageURL https://sjehuda.github.io/newspaper.html
  • +// @supportURL https://greasyfork.org/en/scripts/465932-newspaper/feedback
  • +// @updateURL https://greasyfork.org/scripts/465932-newspaper/code/Newspaper.meta.js
  • +// @downloadURL https://greasyfork.org/scripts/465932-newspaper/code/Newspaper.user.js
  • +// @copyright 2023, Schimon Jehudah (http://schimon.i2p)
  • +// @license MIT; https://opensource.org/licenses/MIT
  • +// @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48dGV4dCB5PSIuOWVtIiBmb250LXNpemU9IjkwIj7wn5OwPC90ZXh0Pjwvc3ZnPgo=
  • +// @exclude *?streamburner=0
  • +// @exclude *?*streamburner=0
  • +// @match *://*/*
  • +// @version 23.06.10
  • +// @run-at document-start
  • +// @grant GM.setValue
  • +// @grant GM.getValue
  • // ==/UserScript==
  • +// ==GreasyFork==
  • +// @author Schimon Jehudah
  • +// @collaborator CY Fung
  • +// @collaborator NotYou
  • +// ==/GreasyFork==
  • +
  • //window.addEventListener("securitypolicyviolation", (e) => {
  • // console.info(e.originalPolicy);
  • //}, { passive : true, });
  • @@ -2913,10 +2921,10 @@
  • });
  • }
  • -function dark() {
  • +async function dark() {
  • cssSelectors = [
  • 'body', 'code', 'a', '.enclosures', '#empty-feed'];
  • - if (GM_getValue('dark')) {
  • + if (await GM.getValue('dark')) {
  • for (cssSelector of cssSelectors) {
  • for (element of document.querySelectorAll(cssSelector)) {
  • element.classList.add('dark');
  • @@ -2932,9 +2940,9 @@
  • let mode = document.querySelector('#mode');
  • cssSelectors = [
  • 'body', 'code', 'a', '.enclosures', '#empty-feed'];
  • - mode.addEventListener ("click", function() {
  • - if (GM_getValue('dark')) {
  • - GM_setValue('dark', false);
  • + mode.addEventListener ("click", async function() {
  • + if (await GM.getValue('dark')) {
  • + await GM.setValue('dark', false);
  • mode.textContent = 'Dark View';
  • mode.title = 'Switch to dark mode';
  • for (cssSelector of cssSelectors) {
  • @@ -2943,7 +2951,7 @@
  • }
  • }
  • } else {
  • - GM_setValue('dark', true);
  • + await GM.setValue('dark', true);
  • mode.textContent = 'Light View';
  • mode.title = 'Switch to bright mode';
  • for (cssSelector of cssSelectors) {