Skip to content

Instantly share code, notes, and snippets.

@examosa
Last active January 8, 2026 15:42
Show Gist options
  • Select an option

  • Save examosa/50eb28bc16a006b62b3f43893ab457e7 to your computer and use it in GitHub Desktop.

Select an option

Save examosa/50eb28bc16a006b62b3f43893ab457e7 to your computer and use it in GitHub Desktop.
Userscripts
const cdn = (path) => new URL(path, 'https://nobsdelivr.private.coffee/');
const withCatch =
(action) =>
(...args) =>
Promise.try(action, ...args).catch((error) => {
console.error('Caught error:', error);
});
const getJson = withCatch((url) =>
fetch(url, { headers: { Accept: 'application/json' } }).then((response) =>
response.json(),
),
);
async function testBackups() {
const backups = [
'https://jsonblob.com/api/jsonBlob/1392945386074857472',
'https://api.npoint.io/6ee2cb1b5a1aa6f10be5',
'https://api.pastes.dev/VSjbFP63yq',
'https://api.codetabs.com/v1/proxy/?quest=https%3A%2F%2Fstarb.in%2Fraw%2FMgDjym',
'https://bytebin.lucko.me/bDAxqrUNqD',
];
const results = await Promise.all(backups.map((backup) => getJson(backup)));
for (const index of results.keys()) {
const result = results[index];
if (!result) {
const backup = backups[index];
console.warn(`Stale backup: ${backup}`);
}
}
}
async function fetchInstances() {
const instances = {
ducksforducks: ['https://ducksforducks.private.coffee'],
nerdsfornerds: ['https://nn.vern.cc'],
};
const providers = {
libredirect: {
source: 'libredirect/instances/data.json',
normalize: (result) =>
Object.entries(result).map(([name, instances]) => ({
type: name.toLowerCase(),
instances: instances.clearnet,
})),
},
farside: {
source: 'benbusby/farside/services.json',
normalize: (result) =>
result.map((service) => ({
type: service.type,
instances: service.instances.concat(service.fallback),
})),
},
fastside: {
source: 'cofob/fastside/services.json',
normalize: (result) =>
result.services.map((service) => ({
type: service.type,
instances: service.instances
.filter((instance) => instance.tags.includes('clearnet'))
.map((instance) => instance.url),
})),
},
};
const promises = Object.values(providers).map(async (provider) => {
const result = await getJson(cdn(`gh/${provider.source}`));
if (!result) {
return [];
}
return provider.normalize(result);
});
const sources = await Promise.all(promises);
for (const source of sources.flat()) {
const list = (instances[source.type] ??= []);
for (const url of source.instances) {
if (!list.includes(url)) {
list.push(url);
}
}
}
return instances;
}
await testBackups();
await fetchInstances();
// ==UserScript==
// @name Shortside
// @version 1.3.2
// @description Redirects the configured websites to third-party privacy-respecting front ends.
// @author examosa
// @license AGPLv3-or-later
// @updateUrl https://gist.github.com/examosa/50eb28bc16a006b62b3f43893ab457e7/raw/shortside.user.js
// @downloadUrl https://gist.github.com/examosa/50eb28bc16a006b62b3f43893ab457e7/raw/shortside.user.js
// @match https://www.fandom.com/*
// @match https://www.geeksforgeeks.org/*
// @match https://genius.com/*
// @match https://www.medium.com/*
// @match https://medium.com/*
// @match https://stackoverflow.com/*
// @match https://www.reddit.com/*
// @match https://*.youtube.com/*
// @match https://www.quora.com/*
// @match https://www.reuters.com/*
// @match https://www.tumblr.com/*
// @match https://twitter.com/*
// @match https://www.urbandictionary.com/*
// @match https://x.com/*
// @run-at document_start
// @allFrames false
// @noframes
// ==/UserScript==
function getRedirect() {
const instances = {
ducksforducks: ["https://ducksforducks.private.coffee"],
nerdsfornerds: ["https://nn.vern.cc"],
invidious: [
"https://inv.nadeko.net",
"https://invidious.nerdvpn.de",
"https://invidious.f5.si",
"https://yewtu.be",
"https://invidious.snopyta.org",
],
nitter: [
"https://xcancel.com",
"https://nitter.privacyredirect.com",
"https://lightbrd.com",
"https://nitter.space",
"https://nitter.tiekoetter.com",
"https://nuku.trabun.org",
"https://nitter.net",
],
redlib: [
"https://redlib.catsarch.com",
"https://redlib.perennialte.ch",
"https://redlib.privacyredirect.com",
"https://reddit.nerdvpn.de",
"https://reddit.adminforge.de",
"https://rl.blitzw.in",
"https://redlib.orangenet.cc",
"https://redlib.privadency.com",
"https://l.opnxng.com",
"https://red.artemislena.eu",
"https://redlib.nadeko.net",
"https://rl.bloat.cat",
"https://safereddit.com",
"https://redlib.freedit.eu",
],
scribe: [
"https://scribe.rip",
"https://scribe.nixnet.services",
"https://scribe.citizen4.eu",
"https://scribe.froth.zone",
"https://scribe.rawbit.ninja",
"https://sc.vern.cc",
"https://scribe.r4fo.com",
"https://scribe.privacyredirect.com",
"https://scribe.privacyredirect.com/",
"https://scribe.rawbit.ninja/",
"https://scribe.rip/",
],
small: ["https://small.private.coffee"],
quetre: [
"https://quetre.iket.me",
"https://qr.vern.cc",
"https://quetre.pussthecat.org",
"https://ask.habedieeh.re",
"https://quetre.blackdrgn.nl",
"https://quetre.lunar.icu",
"https://quetre.drgns.space",
"https://quetre.r4fo.com",
"https://quetre.ducks.party",
"https://quetre.private.coffee",
"https://quetre.canine.tools",
"https://qt.bloat.cat",
"https://quetre.jeikobu.net",
"https://q.307200.xyz",
"https://quora.nerdvpn.de",
"https://quetre.privacyredirect.com",
"https://quora.vern.cc",
"https://quetre.pufe.org",
"https://questions.whateveritworks.org",
"https://quetre.odyssey346.dev/",
"https://quetre.pussthecat.org/",
],
breezewiki: [
"https://breezewiki.com",
"https://antifandom.com",
"https://breezewiki.pussthecat.org",
"https://bw.projectsegfau.lt",
"https://breeze.hostux.net",
"https://bw.artemislena.eu",
"https://breeze.nohost.network",
"https://breeze.whateveritworks.org",
"https://z.opnxng.com",
"https://breezewiki.hyperreal.coffee",
"https://breezewiki.catsarch.com",
"https://breeze.mint.lgbt",
"https://breezewiki.nadeko.net",
"https://fandom.reallyaweso.me",
"https://breezewiki.r4fo.com",
"https://breezewiki.private.coffee",
"https://fan.blitzw.in",
"https://antifandom.com/",
"https://breezewiki.com/",
"https://breezewiki.nadeko.net/",
"https://breezewiki.pussthecat.org/",
"https://bw.projectsegfau.lt/",
],
neuters: ["https://neuters.de", "https://nu.vern.cc"],
ruraldictionary: [
"https://rd.vern.cc",
"https://rd.bloat.cat",
"https://rd.thirtysix.pw",
],
libmedium: [
"https://libmedium.batsense.net",
"https://md.vern.cc",
"https://medium.hostux.net",
"https://libmedium.batsense.net/",
],
dumb: [
"https://dm.vern.cc",
"https://dumb.lunar.icu",
"https://dumb.ducks.party",
"https://dumb.hyperreal.coffee",
"https://dumb.bloat.cat",
"https://dumb.jeikobu.net",
"https://dumb.canine.tools",
"https://lyr.dc09.ru",
"https://db.kuuro.net",
"https://dumb.ducks.party/",
"https://dumb.lunar.icu/",
],
anonymousoverflow: [
"https://code.whatever.social",
"https://ao.vern.cc",
"https://overflow.lunar.icu",
"https://overflow.adminforge.de",
"https://overflow.hostux.net",
"https://overflow.projectsegfau.lt",
"https://overflow.fascinated.cc",
"https://ao.bloat.cat",
"https://ao.owo.si",
"https://overflow.freedit.eu",
"https://anonoverflow.hyperreal.coffee",
"https://overflow.r4fo.com",
"https://overflow.ducks.party",
"https://overflow.snine.nl",
"https://anonymousoverflow.privacyredirect.com",
"https://soflow.nerdvpn.de",
"https://overflow.einfachzocken.eu",
"https://overflow.seasi.dev",
"https://anonymousoverflow.catsarch.com",
"https://overflow.darkness.services",
"https://anonflow.aketawi.space",
"https://overflow.canine.tools",
"https://ao.bloat.cat/",
],
priviblur: [
"https://pb.bloat.cat",
"https://tb.opnxng.com",
"https://priviblur.pussthecat.org",
"https://priviblur.thebunny.zone",
"https://priviblur.canine.tools",
"https://pb.cleberg.net",
"https://tumblr.nerdvpn.de",
],
eddrit: ["https://eddrit.com/"],
intellectual: [
"https://in.bloat.cat/",
"https://intellectual.catsarch.com/",
"https://intellectual.insprill.net/",
],
"photon-reddit": ["https://photon-reddit.com/"],
};
const replacements = Object.entries({
fandom: ['breezewiki'],
geeksforgeeks: ['ducksforducks', 'nerdsfornerds'],
genius: ['dumb', 'intellectual'],
medium: ['libmedium', 'scribe', 'small'],
quora: ['quetre'],
reddit: ['eddrit', 'photon-reddit', 'redlib'],
reuters: ['neuters'],
stackoverflow: ['anonymousoverflow'],
tumblr: ['priviblur'],
twitter: ['nitter'],
urbandictionary: ['ruraldictionary'],
'x.com': ['nitter'],
youtube: ['invidious'],
});
const replacement = replacements.find(([host]) =>
location.hostname.includes(host),
);
if (replacement) {
const chooseRandom = (list) =>
list.at(Math.floor(Math.random() * list.length));
const [, options] = replacement;
const type = chooseRandom(options);
const instancesForType = instances[type];
if (instancesForType?.length > 0) {
const instance = chooseRandom(instancesForType);
const redirect = new URL(location.pathname, instance);
return redirect;
}
}
const redirect = new URL('https://farside.link');
redirect.pathname = `/_/${location.href}`;
return redirect;
}
function main() {
const redirect = getRedirect();
location.replace(redirect);
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment