Doomscrolling
I started scrolling content somewhat mindlessly a long time ago. Back in 2008, I started using Twitter, and it was so much fun. The same year, I was also all over Plurk, a similar micro-blogging platform with an horizontal timeline. Surprisingly, it still exists. A couple of years later, I discovered Reddit and 15y ago it was amazing!
In that era, I used Google Reader a lot, building a curated list of feeds that I would religiously read every day; blogs from all over the place that I had usually randomly found through an extra click. I kept that habit even after Google shutdown Reader in 2013. I used Fever RSS for quite a while - probably the only paid self-hosted tool I ever used - then switched to FreshRSS a few years later.
Thinking back, it was a pretty good time for the web. But then everything enshifitied, slowly but steadily, as they usually do. Social media became algorithms, Reddit a close-minded platform and active blogs slowly diseappeared from the surface of the web. Yet, as objectively shitty as they are, these algorithm are good. I finally joined Instagram when Reddit and X nuked their API and 3rd party apps. Reels were already a thing, and doomscrolling term had recently been coined. This was around 2021-22, and it caught me badly.
Fast forward a few years, and now I'm having a hard time letting my brain taskless for more than a few seconds. I finally have a few minutes to lie down on the couch? Let's pull my tiny screen and scroll through a few uninteresting videos. I have to wait for a couple of prompts to run? I open some social media. It's not even that I particularily enjoy the content I'm viewing. It's my brain going for the easiest dopamine source. My attempts at quiting cold turkey have not been successful, I usually come back to them one way or another.
This time, I'm trying something a bit different. If I can't get past the scrolling, I might as well scroll something that has a positive impact. I dusted my FreshRSS instance, deleted hundreds of dead feeds and subscribed to a bunch of new ones. Since I had no idea where to start, I grabbed a bunch of feeds from aggregators. For now, most of the content come from Kagi Small Web, which has a massive database of feeds, and I few other similar OPML links that I found here and there. My goal is to start curating my own list bit by bit, and eventually muting the big aggregators from the main feed.
Now, muscle memory made me realize how bad it actually got. I still caught myself open some social media, mindlessly. So, for the transition time, I asked Claude to write me a small userscript to show a wall in front of these sites.

// ==UserScript==
// @name Scroll gate
// @namespace https://fludiblu.xyz/
// @version 1.0.0
// @description Interrupts opening the X and Reddit feeds and offers the RSS reader instead
// @match *://reddit.com/*
// @match *://*.reddit.com/*
// @match *://x.com/*
// @match *://*.x.com/*
// @match *://twitter.com/*
// @match *://*.twitter.com/*
// @match https://<RSS Reader domain>/*
// @run-at document-start
// @noframes
// @grant GM_setValue
// @grant GM_addValueChangeListener
// @grant GM_removeValueChangeListener
// @grant window.close
// @grant window.focus
// ==/UserScript==
(() => {
"use strict";
const RSS_URL = "<RSS Reader URL>";
const MESSAGE = "Scrolling doesn't mean brainrot";
const SORT = "(?:best|hot|new|top|rising|controversial|gilded)";
const SITES = [
{
name: "Reddit",
host: /(^|\.)reddit\.com$/,
feed: new RegExp(`^/(?:r/[^/]+/?)?(?:${SORT}/?)?$`),
},
{
name: "X",
host: /(^|\.)(x|twitter)\.com$/,
feed: /^\/(?:home\/?|explore(?:\/.*)?)?$/,
},
];
if (location.origin === new URL(RSS_URL).origin) {
GM_addValueChangeListener("rss-focus-request", (_key, _old, id, remote) => {
if (!remote) return;
window.focus();
GM_setValue("rss-focus-ack", id);
});
return;
}
const site = SITES.find((s) => s.host.test(location.hostname));
if (!site || !site.feed.test(location.pathname)) return;
// Only gate fresh opens: reloads, back/forward and links followed within the site pass through.
const navType = performance.getEntriesByType("navigation")[0]?.type;
if (navType === "reload" || navType === "back_forward") return;
if (document.referrer && site.host.test(new URL(document.referrer).hostname))
return;
const CSS = `
.page {
position: fixed;
inset: 0;
display: grid;
place-items: center;
padding: 16px;
background: #f4f1ea;
color: #22201c;
font: 16px/1.5 system-ui, sans-serif;
color-scheme: light dark;
}
@media (prefers-color-scheme: dark) {
.page { background: #161513; color: #ece8df; }
}
main { max-width: 40rem; text-align: center; }
h1 {
margin: 0 0 2.5rem;
font-size: clamp(2rem, 6vw, 3.75rem);
font-weight: 700;
line-height: 1.1;
letter-spacing: -0.02em;
text-wrap: balance;
}
.actions { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; }
button {
font: inherit;
font-weight: 600;
padding: 0.75em 1.5em;
border-radius: 999px;
border: 1.5px solid currentColor;
background: none;
color: inherit;
cursor: pointer;
}
.rss { background: #e8590c; border-color: #e8590c; color: #fff; }
.rss:hover { background: #d9480f; border-color: #d9480f; }
.continue { opacity: 0.55; }
.continue:hover { opacity: 0.9; }
button:focus-visible { outline: 3px solid #e8590c; outline-offset: 3px; }
`;
const el = (tag, props, ...children) => {
const node = Object.assign(document.createElement(tag), props);
node.append(...children);
return node;
};
const openRss = () => {
const id = crypto.randomUUID();
const fallback = setTimeout(() => location.replace(RSS_URL), 500);
const listener = GM_addValueChangeListener(
"rss-focus-ack",
(_key, _old, ackId) => {
if (ackId !== id) return;
clearTimeout(fallback);
GM_removeValueChangeListener(listener);
window.close();
},
);
GM_setValue("rss-focus-request", id);
};
const host = document.createElement("div");
host.style.cssText =
"all: initial; position: fixed; inset: 0; z-index: 2147483647;";
const rssButton = el("button", { className: "rss", textContent: "Open RSS" });
const continueButton = el("button", {
className: "continue",
textContent: `Continue to ${site.name}`,
});
rssButton.addEventListener("click", openRss);
continueButton.addEventListener("click", () => host.remove());
host
.attachShadow({ mode: "closed" })
.append(
el("style", { textContent: CSS }),
el(
"div",
{ className: "page" },
el(
"main",
{},
el("h1", { textContent: MESSAGE }),
el("div", { className: "actions" }, rssButton, continueButton),
),
),
);
document.documentElement.append(host);
rssButton.focus();
})();
I'll come back to this in a few weeks for an update!