about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorHygna <hygna@proton.me>2022-09-29 18:32:03 +0100
committerHygna <hygna@proton.me>2022-09-29 18:32:03 +0100
commitf1b8b64c48fede90ee9c828c1b82e641c0fe653d (patch)
tree44b55dfde203a223d57e6dcfd717dad7614e3b54
parentUnify cookies (diff)
downloadlibredirect-f1b8b64c48fede90ee9c828c1b82e641c0fe653d.zip
Changes:
Improved instance fetcher

Added instance updating

Fix a few bugs
-rw-r--r--package.json8
-rw-r--r--src/assets/javascripts/general.js2
-rw-r--r--src/assets/javascripts/imdb.js216
-rw-r--r--src/assets/javascripts/imgur.js216
-rw-r--r--src/assets/javascripts/instagram.js244
-rw-r--r--src/assets/javascripts/lbry.js218
-rw-r--r--src/assets/javascripts/maps.js304
-rw-r--r--src/assets/javascripts/medium.js222
-rw-r--r--src/assets/javascripts/peertube.js204
-rw-r--r--src/assets/javascripts/quora.js202
-rw-r--r--src/assets/javascripts/reddit.js394
-rw-r--r--src/assets/javascripts/reuters.js150
-rw-r--r--src/assets/javascripts/search.js576
-rw-r--r--src/assets/javascripts/sendTargets.js195
-rw-r--r--src/assets/javascripts/services.js39
-rw-r--r--src/assets/javascripts/tiktok.js246
-rw-r--r--src/assets/javascripts/translate/get_lingva_preferences.js10
-rw-r--r--src/assets/javascripts/translate/set_lingva_preferences.js9
-rw-r--r--src/assets/javascripts/translate/translate.js372
-rw-r--r--src/assets/javascripts/twitter.js268
-rw-r--r--src/assets/javascripts/utils.js60
-rw-r--r--src/assets/javascripts/wikipedia.js242
-rw-r--r--src/assets/javascripts/youtube/get_pipedMaterial_preferences.js5
-rw-r--r--src/assets/javascripts/youtube/get_piped_preferences.js22
-rw-r--r--src/assets/javascripts/youtube/set_pipedMaterial_preferences.js7
-rw-r--r--src/assets/javascripts/youtube/set_piped_preferences.js45
-rw-r--r--src/assets/javascripts/youtube/youtube.js792
-rw-r--r--src/assets/javascripts/youtubeMusic.js327
-rw-r--r--src/config/config.json2
-rw-r--r--src/instances/get_instances.py77
-rw-r--r--src/pages/options/widgets/general.js3
-rw-r--r--src/pages/options/widgets/services.js2
32 files changed, 71 insertions, 5608 deletions
diff --git a/package.json b/package.json
index ec39aee4..74bb60b3 100644
--- a/package.json
+++ b/package.json
@@ -14,17 +14,17 @@
 	},
 	"repository": {
 		"type": "git",
-		"url": "git+https://github.com/LibRedirect/LibRedirect.git"
+		"url": "git+https://codeberg.org/LibRedirect/LibRedirect.git"
 	},
 	"author": "LibRedirect",
 	"license": "GPL-3.0-only",
 	"bugs": {
-		"url": "https://github.com/LibRedirect/LibRedirect/issues"
+		"url": "https://codeberg.org/LibRedirect/LibRedirect/issues"
 	},
-	"homepage": "https://libredirect.github.io",
+	"homepage": "https://libredirect.codeberg.page",
 	"devDependencies": {
 		"prettier": "2.7.1",
-		"web-ext": "^6.7.0"
+		"web-ext": "^7.2.0"
 	},
 	"dependencies": {
 		"buffer": "^6.0.3",
diff --git a/src/assets/javascripts/general.js b/src/assets/javascripts/general.js
index 9dcba752..6eb0a454 100644
--- a/src/assets/javascripts/general.js
+++ b/src/assets/javascripts/general.js
@@ -12,7 +12,7 @@ function isException(url) {
 function init() {
 	return new Promise(resolve => {
 		browser.storage.local.get("options", r => {
-			exceptions = r.options.exceptions
+			if (r.options) exceptions = r.options.exceptions
 			resolve()
 		})
 	})
diff --git a/src/assets/javascripts/imdb.js b/src/assets/javascripts/imdb.js
deleted file mode 100644
index 57368557..00000000
--- a/src/assets/javascripts/imdb.js
+++ /dev/null
@@ -1,216 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}(?:www\.|)imdb\.com.*/]
-
-const frontends = new Array("libremdb")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.libremdb = val
-		libremdbNormalRedirectsChecks = [...redirects.libremdb.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = libremdbNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) libremdbNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			imdbRedirects: redirects,
-			libremdbNormalRedirectsChecks,
-			libremdbTorRedirectsChecks: [...redirects.libremdb.tor],
-			libremdbI2pRedirectsChecks: [...redirects.libremdb.i2p],
-			libremdbLokiRedirectsChecks: [...redirects.libremdb.loki],
-		})
-	})
-}
-
-let disableImdb,
-	protocol,
-	protocolFallback,
-	imdbRedirects,
-	libremdbNormalRedirectsChecks,
-	libremdbNormalCustomRedirects,
-	libremdbTorRedirectsChecks,
-	libremdbTorCustomRedirects,
-	libremdbI2pCustomRedirects,
-	libremdbLokiCustomRedirects
-
-function init() {
-	return new Promise(async resolve => {
-		browser.storage.local.get(
-			[
-				"disableImdb",
-				"protocol",
-				"protocolFallback",
-				"imdbRedirects",
-				"libremdbNormalRedirectsChecks",
-				"libremdbNormalCustomRedirects",
-				"libremdbTorRedirectsChecks",
-				"libremdbTorCustomRedirects",
-				"libremdbI2pCustomRedirects",
-				"libremdbLokiCustomRedirects",
-			],
-			r => {
-				disableImdb = r.disableImdb
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				imdbRedirects = r.imdbRedirects
-				libremdbNormalRedirectsChecks = r.libremdbNormalRedirectsChecks
-				libremdbNormalCustomRedirects = r.libremdbNormalCustomRedirects
-				libremdbTorRedirectsChecks = r.libremdbTorRedirectsChecks
-				libremdbTorCustomRedirects = r.libremdbTorCustomRedirects
-				libremdbI2pCustomRedirects = r.libremdbI2pCustomRedirects
-				libremdbLokiCustomRedirects = r.libremdbLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disableImdb && !disableOverride) return
-	if (url.pathname == "/") return
-	if (type != "main_frame") return
-	const all = [...imdbRedirects.libremdb.normal, ...libremdbNormalCustomRedirects]
-	if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return
-	if (!targets.some(rx => rx.test(url.href))) return
-
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...libremdbLokiCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...libremdbI2pCustomRedirects]
-	else if (protocol == "tor") instancesList = [...libremdbTorRedirectsChecks, ...libremdbTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...libremdbNormalRedirectsChecks, ...libremdbNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) {
-		return
-	}
-
-	const randomInstance = utils.getRandomInstance(instancesList)
-	return `${randomInstance}${url.pathname}`
-}
-
-function reverse(url) {
-	return new Promise(async resolve => {
-		await init()
-		let protocolHost = utils.protocolHost(url)
-		const all = [
-			...imdbRedirects.libremdb.normal,
-			...imdbRedirects.libremdb.tor,
-			...libremdbNormalCustomRedirects,
-			...libremdbTorCustomRedirects,
-			...libremdbI2pCustomRedirects,
-			...libremdbLokiCustomRedirects,
-		]
-		if (!all.includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		resolve(`https://imdb.com${url.pathname}${url.search}`)
-	})
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableImdb && !disableOverride) {
-			resolve()
-			return
-		}
-		let protocolHost = utils.protocolHost(url)
-		const all = [
-			...imdbRedirects.libremdb.tor,
-			...imdbRedirects.libremdb.normal,
-
-			...libremdbNormalCustomRedirects,
-			...libremdbTorCustomRedirects,
-			...libremdbI2pCustomRedirects,
-			...libremdbLokiCustomRedirects,
-		]
-		if (!all.includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...libremdbLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...libremdbI2pCustomRedirects]
-		else if (protocol == "tor") instancesList = [...libremdbTorRedirectsChecks, ...libremdbTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...libremdbNormalRedirectsChecks, ...libremdbNormalCustomRedirects]
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(async resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					libremdbNormalRedirectsChecks = [...redirects.libremdb.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = libremdbNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) libremdbNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableImdb: true,
-							imdbRedirects: redirects,
-
-							libremdbNormalRedirectsChecks,
-							libremdbNormalCustomRedirects: [],
-
-							libremdbTorRedirectsChecks: [...redirects.libremdb.tor],
-							libremdbTorCustomRedirects: [],
-
-							libremdbI2pRedirectsChecks: [],
-							libremdbI2pCustomRedirects: [],
-
-							libremdbLokiRedirectsChecks: [],
-							libremdbLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-
-	redirect,
-	reverse,
-	switchInstance,
-
-	initDefaults,
-}
diff --git a/src/assets/javascripts/imgur.js b/src/assets/javascripts/imgur.js
deleted file mode 100644
index 15b9ccac..00000000
--- a/src/assets/javascripts/imgur.js
+++ /dev/null
@@ -1,216 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = /^https?:\/{2}([im]\.)?imgur\.(com|io)(\/|$)/
-
-const frontends = new Array("rimgo")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.rimgo = val
-		rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = rimgoNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) rimgoNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			imgurRedirects: redirects,
-			rimgoNormalRedirectsChecks,
-			rimgoTorRedirectsChecks: [...redirects.rimgo.tor],
-			rimgoI2pRedirectsChecks: [...redirects.rimgo.i2p],
-			rimgoLokiRedirectsChecks: [...redirects.rimgo.loki],
-		})
-	})
-}
-
-let disableImgur,
-	imgurRedirects,
-	protocol,
-	protocolFallback,
-	rimgoNormalRedirectsChecks,
-	rimgoNormalCustomRedirects,
-	rimgoTorRedirectsChecks,
-	rimgoTorCustomRedirects,
-	rimgoI2pRedirectsChecks,
-	rimgoI2pCustomRedirects,
-	rimgoLokiCustomRedirects
-
-function init() {
-	return new Promise(async resolve => {
-		browser.storage.local.get(
-			[
-				"disableImgur",
-				"imgurRedirects",
-				"protocol",
-				"protocolFallback",
-				"rimgoNormalRedirectsChecks",
-				"rimgoNormalCustomRedirects",
-				"rimgoTorRedirectsChecks",
-				"rimgoTorCustomRedirects",
-				"rimgoI2pRedirectsChecks",
-				"rimgoI2pCustomRedirects",
-				"rimgoLokiCustomRedirects",
-			],
-			r => {
-				disableImgur = r.disableImgur
-				imgurRedirects = r.imgurRedirects
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				rimgoNormalRedirectsChecks = r.rimgoNormalRedirectsChecks
-				rimgoNormalCustomRedirects = r.rimgoNormalCustomRedirects
-				rimgoTorRedirectsChecks = r.rimgoTorRedirectsChecks
-				rimgoTorCustomRedirects = r.rimgoTorCustomRedirects
-				rimgoI2pRedirectsChecks = r.rimgoI2pRedirectsChecks
-				rimgoI2pCustomRedirects = r.rimgoI2pCustomRedirects
-				rimgoLokiCustomRedirects = r.rimgoLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-// https://imgur.com/gallery/s4WXQmn
-// https://imgur.com/a/H8M4rcp
-// https://imgur.com/gallery/gYiQLWy
-// https://imgur.com/gallery/cTRwaJU
-// https://i.imgur.com/CFSQArP.jpeg
-
-function all() {
-	return [
-		...imgurRedirects.rimgo.normal,
-		...imgurRedirects.rimgo.tor,
-		...imgurRedirects.rimgo.i2p,
-		...rimgoNormalCustomRedirects,
-		...rimgoTorCustomRedirects,
-		...rimgoI2pCustomRedirects,
-		...rimgoLokiCustomRedirects,
-	]
-}
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disableImgur && !disableOverride) return
-	if (url.pathname == "/" && !disableOverride) return
-	if (!["main_frame", "sub_frame", "xmlhttprequest", "other", "image", "media"].includes(type)) return
-	if (initiator && (all().includes(initiator.origin) || targets.test(initiator.host))) return
-	if (!targets.test(url.href)) return
-	if (url.pathname.includes("delete/")) return
-
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...rimgoLokiCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...rimgoI2pCustomRedirects, ...rimgoI2pRedirectsChecks]
-	else if (protocol == "tor") instancesList = [...rimgoTorRedirectsChecks, ...rimgoTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...rimgoNormalRedirectsChecks, ...rimgoNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) {
-		return
-	}
-
-	const randomInstance = utils.getRandomInstance(instancesList)
-	return `${randomInstance}${url.pathname}${url.search}`
-}
-
-function reverse(url) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-		resolve(`https://imgur.com${url.pathname}${url.search}`)
-	})
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableImgur && !disableOverride) {
-			resolve()
-			return
-		}
-		let protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...rimgoLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...rimgoI2pCustomRedirects, ...rimgoI2pRedirectsChecks]
-		else if (protocol == "tor") instancesList = [...rimgoTorRedirectsChecks, ...rimgoTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...rimgoNormalRedirectsChecks, ...rimgoNormalCustomRedirects]
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = rimgoNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) rimgoNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableImgur: false,
-							imgurRedirects: redirects,
-
-							rimgoNormalRedirectsChecks: rimgoNormalRedirectsChecks,
-							rimgoNormalCustomRedirects: [],
-
-							rimgoTorRedirectsChecks: [...redirects.rimgo.tor],
-							rimgoTorCustomRedirects: [],
-
-							rimgoI2pRedirectsChecks: [...redirects.rimgo.i2p],
-							rimgoI2pCustomRedirects: [],
-
-							rimgoLokiRedirectsChecks: [...redirects.rimgo.loki],
-							rimgoLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	redirect,
-	reverse,
-	initDefaults,
-	switchInstance,
-}
diff --git a/src/assets/javascripts/instagram.js b/src/assets/javascripts/instagram.js
deleted file mode 100644
index d0aa07c0..00000000
--- a/src/assets/javascripts/instagram.js
+++ /dev/null
@@ -1,244 +0,0 @@
-window.browser = window.browser || window.chrome
-import utils from "./utils.js"
-
-const targets = ["instagram.com", "www.instagram.com"]
-
-const frontends = new Array("bibliogram")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-		redirects.bibliogram = val
-		bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = bibliogramNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) bibliogramNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			instagramRedirects: redirects,
-			bibliogramNormalRedirectsChecks,
-			bibliogramTorRedirectsChecks: [...redirects.bibliogram.tor],
-			bibliogramI2pRedirectsChecks: [...redirects.bibliogram.i2p],
-			bibliogramLokiRedirectsChecks: [...redirects.bibliogram.loki],
-		})
-	})
-}
-
-let disableInstagram,
-	protocol,
-	protocolFallback,
-	instagramRedirects,
-	bibliogramNormalRedirectsChecks,
-	bibliogramTorRedirectsChecks,
-	bibliogramNormalCustomRedirects,
-	bibliogramTorCustomRedirects,
-	bibliogramI2pCustomRedirects,
-	bibliogramLokiCustomRedirects
-
-function init() {
-	return new Promise(async resolve => {
-		browser.storage.local.get(
-			[
-				"disableInstagram",
-				"protocol",
-				"protocolFallback",
-				"instagramRedirects",
-				"bibliogramNormalRedirectsChecks",
-				"bibliogramTorRedirectsChecks",
-				"bibliogramNormalCustomRedirects",
-				"bibliogramTorCustomRedirects",
-				"bibliogramI2pCustomRedirects",
-				"bibliogramLokiCustomRedirects",
-			],
-			r => {
-				disableInstagram = r.disableInstagram
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				instagramRedirects = r.instagramRedirects
-				bibliogramNormalRedirectsChecks = r.bibliogramNormalRedirectsChecks
-				bibliogramTorRedirectsChecks = r.bibliogramTorRedirectsChecks
-				bibliogramNormalCustomRedirects = r.bibliogramNormalCustomRedirects
-				bibliogramTorCustomRedirects = r.bibliogramTorCustomRedirects
-				bibliogramI2pCustomRedirects = r.bibliogramI2pCustomRedirects
-				bibliogramLokiCustomRedirects = r.bibliogramLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function initBibliogramPreferences(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(from)
-		if (
-			![
-				...bibliogramNormalRedirectsChecks,
-				...bibliogramTorRedirectsChecks,
-				...bibliogramNormalCustomRedirects,
-				...bibliogramTorCustomRedirects,
-				...bibliogramI2pCustomRedirects,
-				...bibliogramLokiCustomRedirects,
-			].includes(protocolHost)
-		) {
-			resolve()
-			return
-		}
-
-		if (!test) {
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...bibliogramLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...bibliogramI2pCustomRedirects]
-			else if (protocol == "tor") checkedInstances = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects]
-			}
-			await utils.getPreferencesFromToken("bibliogram", from, checkedInstances, "settings", "settings.json")
-		}
-		resolve(true)
-	})
-}
-
-function all() {
-	return [
-		...bibliogramNormalRedirectsChecks,
-		...bibliogramTorRedirectsChecks,
-		...bibliogramNormalCustomRedirects,
-		...bibliogramTorCustomRedirects,
-		...bibliogramI2pCustomRedirects,
-		...bibliogramLokiCustomRedirects,
-	]
-}
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disableInstagram && !disableOverride) return
-	if (!targets.includes(url.host)) return
-	if (initiator && all().includes(initiator.origin)) return "BYPASSTAB"
-	if (!["main_frame", "sub_frame", "xmlhttprequest", "other", "image", "media"].includes(type)) return
-
-	const bypassPaths = [/about/, /explore/, /support/, /press/, /api/, /privacy/, /safety/, /admin/, /\/(accounts\/|embeds?.js)/]
-	if (bypassPaths.some(rx => rx.test(url.pathname))) return
-
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...bibliogramLokiCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...bibliogramI2pCustomRedirects]
-	else if (protocol == "tor") instancesList = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) {
-		return
-	}
-	let randomInstance = utils.getRandomInstance(instancesList)
-
-	const reservedPaths = ["u", "p", "privacy"]
-	if (url.pathname === "/" || reservedPaths.includes(url.pathname.split("/")[1])) return `${randomInstance}${url.pathname}${url.search}`
-	if (url.pathname.startsWith("/reel") || url.pathname.startsWith("/tv")) return `${randomInstance}/p${url.pathname.replace(/\/reel|\/tv/i, "")}${url.search}`
-	else return `${randomInstance}/u${url.pathname}${url.search}` // Likely a user profile, redirect to '/u/...'
-}
-
-function reverse(url) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		if (url.pathname.startsWith("/p")) resolve(`https://instagram.com${url.pathname.replace("/p", "")}${url.search}`)
-		if (url.pathname.startsWith("/u")) resolve(`https://instagram.com${url.pathname.replace("/u", "")}${url.search}`)
-		resolve(`https://instagram.com${url.pathname}${url.search}`)
-	})
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableInstagram && !disableOverride) {
-			resolve()
-			return
-		}
-		let protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...bibliogramLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...bibliogramI2pCustomRedirects]
-		else if (protocol == "tor") instancesList = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects]
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = bibliogramNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) bibliogramNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set({
-						disableInstagram: false,
-						instagramRedirects: redirects,
-
-						bibliogramNormalRedirectsChecks,
-						bibliogramNormalCustomRedirects: [],
-
-						bibliogramTorRedirectsChecks: [...redirects.bibliogram.tor],
-						bibliogramTorCustomRedirects: [],
-
-						bibliogramI2pRedirectsChecks: [...redirects.bibliogram.i2p],
-						bibliogramI2pCustomRedirects: [],
-
-						bibliogramLokiRedirectsChecks: [...redirects.bibliogram.loki],
-						bibliogramLokiCustomRedirects: [],
-					})
-					resolve()
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	initBibliogramPreferences,
-	reverse,
-	redirect,
-	initDefaults,
-	switchInstance,
-}
diff --git a/src/assets/javascripts/lbry.js b/src/assets/javascripts/lbry.js
deleted file mode 100644
index 5e285ada..00000000
--- a/src/assets/javascripts/lbry.js
+++ /dev/null
@@ -1,218 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}odysee\.com/]
-
-const frontends = new Array("librarian")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.librarian = val
-		librarianNormalRedirectsChecks = [...redirects.librarian.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = librarianNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) librarianNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			lbryTargetsRedirects: redirects,
-			librarianNormalRedirectsChecks,
-			librarianTorRedirectsChecks: [...redirects.librarian.tor],
-			librarianI2pRedirectsChecks: [...redirects.librarian.i2p],
-			librarianLokiRedirectsChecks: [...redirects.librarian.loki],
-		})
-	})
-}
-
-let disableLbryTargets,
-	lbryFrontend,
-	protocol,
-	protocolFallback,
-	lbryTargetsRedirects,
-	lbryRedirectType,
-	librarianNormalRedirectsChecks,
-	librarianNormalCustomRedirects,
-	librarianTorRedirectsChecks,
-	librarianTorCustomRedirects,
-	librarianI2pRedirectsChecks,
-	librarianI2pCustomRedirects,
-	librarianLokiCustomRedirects
-
-function init() {
-	return new Promise(resolve => {
-		browser.storage.local.get(
-			[
-				"disableLbryTargets",
-				"lbryFrontend",
-				"protocol",
-				"protocolFallback",
-				"lbryTargetsRedirects",
-				"lbryRedirectType",
-				"librarianNormalRedirectsChecks",
-				"librarianNormalCustomRedirects",
-				"librarianTorRedirectsChecks",
-				"librarianTorCustomRedirects",
-				"librarianI2pRedirectsChecks",
-				"librarianI2pCustomRedirects",
-				"librarianLokiCustomRedirects",
-			],
-			r => {
-				disableLbryTargets = r.disableLbryTargets
-				lbryFrontend = r.lbryFrontend
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				lbryTargetsRedirects = r.lbryTargetsRedirects
-				lbryRedirectType = r.lbryRedirectType
-				librarianNormalRedirectsChecks = r.librarianNormalRedirectsChecks
-				librarianNormalCustomRedirects = r.librarianNormalCustomRedirects
-				librarianTorRedirectsChecks = r.librarianTorRedirectsChecks
-				librarianTorCustomRedirects = r.librarianTorCustomRedirects
-				librarianI2pRedirectsChecks = r.librarianI2pRedirectsChecks
-				librarianI2pCustomRedirects = r.librarianI2pCustomRedirects
-				librarianLokiCustomRedirects = r.librarianLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
-	return [...redirects.librarian.normal, ...redirects.librarian.tor, ...librarianNormalCustomRedirects, ...librarianTorCustomRedirects, ...librarianI2pCustomRedirects, ...librarianLokiCustomRedirects]
-}
-
-function getInstancesList() {
-	let tmpList = []
-	switch (protocol) {
-		case "loki":
-			tmpList = [...librarianLokiCustomRedirects]
-			break
-		case "i2p":
-			tmpList = [...librarianI2pRedirectsChecks, ...librarianI2pCustomRedirects]
-			break
-		case "tor":
-			tmpList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects]
-	}
-	if ((tmpList.length === 0 && protocolFallback) || protocol == "normal") {
-		tmpList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects]
-	}
-	return tmpList
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableLbryTargets && !disableOverride) {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...librarianLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...librarianI2pCustomRedirects]
-		else if (protocol == "tor") instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects]
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disableLbryTargets && !disableOverride) return
-	if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) return
-	if (!targets.some(rx => rx.test(url.href))) return
-	if ((type == "main_frame" && lbryRedirectType == "sub_frame") || (type == "sub_frame" && lbryRedirectType == "main_frame")) return
-
-	const instancesList = getInstancesList()
-	switch (type) {
-		case "main_frame":
-			switch (lbryFrontend) {
-				case "librarian":
-					if (instancesList.length === 0) return
-					const randomInstance = utils.getRandomInstance(instancesList)
-					return `${randomInstance}${url.pathname}${url.search}`
-				case "lbryDesktop":
-					if (type == "main_frame") {
-						return url.href.replace(/^https?:\/{2}odysee\.com\//, "lbry://").replace(/:(?=[a-zA-Z0-9])/g, "#")
-					}
-			}
-		case "sub_frame":
-			if (instancesList.length === 0) return
-			const randomInstance = utils.getRandomInstance(instancesList)
-			return `${randomInstance}${url.pathname}${url.search}`.replace(/\/(?=[a-f0-9]{40})/, ":")
-	}
-}
-
-function initDefaults() {
-	return new Promise(async resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					librarianNormalRedirectsChecks = [...redirects.librarian.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = librarianNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) librarianNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableLbryTargets: true,
-							lbryFrontend: "librarian",
-							lbryTargetsRedirects: redirects,
-							lbryRedirectType: "both",
-
-							librarianNormalRedirectsChecks,
-							librarianNormalCustomRedirects: [],
-
-							librarianTorRedirectsChecks: [...redirects.librarian.tor],
-							librarianTorCustomRedirects: [],
-
-							librarianI2pRedirectsChecks: [...redirects.librarian.i2p],
-							librarianI2pCustomRedirects: [],
-
-							librarianLokiRedirectsChecks: [...redirects.librarian.loki],
-							librarianLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	switchInstance,
-	redirect,
-	initDefaults,
-}
diff --git a/src/assets/javascripts/maps.js b/src/assets/javascripts/maps.js
deleted file mode 100644
index 6e3c9af0..00000000
--- a/src/assets/javascripts/maps.js
+++ /dev/null
@@ -1,304 +0,0 @@
-"use strict"
-
-window.browser = window.browser || window.chrome
-import utils from "./utils.js"
-
-const targets = /^https?:\/{2}(((www|maps)\.)?(google\.).*(\/maps)|maps\.(google\.).*)/
-
-const frontends = new Array("facil")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-redirects.osm = {}
-redirects.osm.normal = ["https://www.openstreetmap.org"]
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.facil = val
-		facilNormalRedirectsChecks = [...redirects.facil.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = facilNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) facilNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			mapsRedirects: redirects,
-			facilNormalRedirectsChecks,
-			facilTorRedirectsChecks: [...redirects.facil.tor],
-			facilI2pRedirectsChecks: [...redirects.facil.i2p],
-			facilLokiRedirectsChecks: [...redirects.facil.loki],
-		})
-	})
-}
-
-let disableMaps,
-	mapsFrontend,
-	protocol,
-	protocolFallback,
-	facilNormalRedirectsChecks,
-	facilNormalCustomRedirects,
-	facilTorRedirectsChecks,
-	facilTorCustomRedirects,
-	facilI2pRedirectsChecks,
-	facilI2pCustomRedirects,
-	facilLokiRedirectsChecks,
-	facilLokiCustomRedirects
-
-function init() {
-	browser.storage.local.get(
-		[
-			"disableMaps",
-			"mapsFrontend",
-			"protocol",
-			"protocolFallback",
-			"facilNormalRedirectsChecks",
-			"facilNormalCustomRedirects",
-			"facilTorRedirectsChecks",
-			"facilTorCustomRedirects",
-			"facilI2pRedirectsChecks",
-			"facilI2pCustomRedirects",
-			"facilLokiRedirectsChecks",
-			"facilLokiCustomRedirects",
-		],
-		r => {
-			disableMaps = r.disableMaps
-			mapsFrontend = r.mapsFrontend
-			protocol = r.protocol
-			protocolFallback = r.protocolFallback
-			facilNormalRedirectsChecks = r.facilNormalRedirectsChecks
-			facilNormalCustomRedirects = r.facilNormalCustomRedirects
-			facilTorRedirectsChecks = r.facilTorRedirectsChecks
-			facilTorCustomRedirects = r.facilTorCustomRedirects
-			facilI2pRedirectsChecks = r.facilI2pRedirectsChecks
-			facilI2pCustomRedirects = r.facilI2pCustomRedirects
-			facilLokiRedirectsChecks = r.facilLokiRedirectsChecks
-			facilLokiCustomRedirects = r.facilLokiCustomRedirects
-		}
-	)
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, initiator) {
-	if (disableMaps) return
-	if (initiator && initiator.host === "earth.google.com") return
-	if (!url.href.match(targets)) return
-	const mapCentreRegex = /@(-?\d[0-9.]*),(-?\d[0-9.]*),(\d{1,2})[.z]/
-	const dataLatLngRegex = /!3d(-?[0-9]{1,}.[0-9]{1,})!4d(-?[0-9]{1,}.[0-9]{1,})/
-	const placeRegex = /\/place\/(.*)\//
-	const travelModes = {
-		driving: "fossgis_osrm_car",
-		walking: "fossgis_osrm_foot",
-		bicycling: "fossgis_osrm_bike",
-		transit: "fossgis_osrm_car", // not implemented on OSM, default to car.
-	}
-	const travelModesFacil = {
-		driving: "car",
-		walking: "pedestrian",
-		bicycling: "bicycle",
-		transit: "car", // not implemented on Facil, default to car.
-	}
-	const osmLayers = {
-		none: "S",
-		transit: "T",
-		traffic: "S", // not implemented on OSM, default to standard.
-		bicycling: "C",
-	}
-	function addressToLatLng(address) {
-		const xmlhttp = new XMLHttpRequest()
-		xmlhttp.open("GET", `https://nominatim.openstreetmap.org/search/${address}?format=json&limit=1`, false)
-		xmlhttp.send()
-		if (xmlhttp.status === 200) {
-			const json = JSON.parse(xmlhttp.responseText)[0]
-			if (json) {
-				console.log("json", json)
-				return [`${json.lat},${json.lon}`, `${json.boundingbox[2]},${json.boundingbox[1]},${json.boundingbox[3]},${json.boundingbox[0]}`]
-			}
-		}
-		console.info("Error: Status is " + xmlhttp.status)
-	}
-
-	let instancesList
-	switch (mapsFrontend) {
-		case "osm":
-			instancesList = [...redirects.osm.normal]
-			break
-		case "facil":
-			switch (protocol) {
-				case "loki":
-					instancesList = [...facilLokiRedirectsChecks, ...facilLokiCustomRedirects]
-					break
-				case "i2p":
-					instancesList = [...facilI2pRedirectsChecks, ...facilI2pCustomRedirects]
-					break
-				case "tor":
-					instancesList = [...facilTorRedirectsChecks, ...facilTorCustomRedirects]
-			}
-			if ((instancesList == "" && protocolFallback) || protocol == "normal") {
-				instancesList = [...facilNormalRedirectsChecks, ...facilNormalCustomRedirects]
-			}
-	}
-	const randomInstance = utils.getRandomInstance(instancesList)
-
-	let mapCentre = "#"
-	let prefs = {}
-
-	if (url.pathname.match(mapCentreRegex)) {
-		// Set map centre if present
-		var [, lat, lon, zoom] = url.pathname.match(mapCentreRegex)
-	} else if (url.searchParams.has("center")) {
-		var [lat, lon] = url.searchParams.get("center").split(",")
-		var zoom = url.searchParams.get("zoom") ?? "17"
-	}
-
-	if (lat && lon && zoom) {
-		if (mapsFrontend == "osm") mapCentre = `#map=${zoom}/${lat}/${lon}`
-		if (mapsFrontend == "facil") mapCentre = `#${zoom}/${lat}/${lon}`
-	}
-
-	if (url.searchParams.get("layer")) prefs.layers = osmLayers[url.searchParams.get("layer")]
-
-	if (url.pathname.includes("/embed")) {
-		// Handle Google Maps Embed API
-		// https://www.google.com/maps/embed/v1/place?key=AIzaSyD4iE2xVSpkLLOXoyqT-RuPwURN3ddScAI&q=Eiffel+Tower,Paris+France
-		console.log("embed life")
-
-		let query = ""
-		if (url.searchParams.has("q")) query = url.searchParams.get("q")
-		else if (url.searchParams.has("query")) query = url.searchParams.has("query")
-		else if (url.searchParams.has("pb"))
-			try {
-				query = url.searchParams.get("pb").split(/!2s(.*?)!/)[1]
-			} catch (error) {
-				console.error(error)
-			} // Unable to find map marker in URL.
-
-		let [coords, boundingbox] = addressToLatLng(query)
-		prefs.bbox = boundingbox
-		prefs.marker = coords
-		prefs.layer = "mapnik"
-		let prefsEncoded = new URLSearchParams(prefs).toString()
-		if (mapsFrontend == "osm") return `${randomInstance}/export/embed.html?${prefsEncoded}`
-		if (mapsFrontend == "facil") return `${randomInstance}/#q=${query}`
-	} else if (url.pathname.includes("/dir")) {
-		// Handle Google Maps Directions
-		// https://www.google.com/maps/dir/?api=1&origin=Space+Needle+Seattle+WA&destination=Pike+Place+Market+Seattle+WA&travelmode=bicycling
-
-		let travMod = url.searchParams.get("travelmode")
-		if (url.searchParams.has("travelmode")) prefs.engine = travelModes[travMod]
-
-		let orgVal = url.searchParams.get("origin")
-		let destVal = url.searchParams.get("destination")
-
-		let org
-		addressToLatLng(orgVal, a => (org = a))
-		let dest
-		addressToLatLng(destVal, a => (dest = a))
-		prefs.route = `${org};${dest}`
-
-		let prefsEncoded = new URLSearchParams(prefs).toString()
-		if (mapsFrontend == "osm") return `${randomInstance}/directions?${prefsEncoded}${mapCentre}`
-		if (mapsFrontend == "facil") return `${randomInstance}/#q=${orgVal}%20to%20${destVal}%20by%20${travelModesFacil[travMod]}`
-	} else if (url.pathname.includes("data=") && url.pathname.match(dataLatLngRegex)) {
-		// Get marker from data attribute
-		// https://www.google.com/maps/place/41%C2%B001'58.2%22N+40%C2%B029'18.2%22E/@41.032833,40.4862063,17z/data=!3m1!4b1!4m6!3m5!1s0x0:0xf64286eaf72fc49d!7e2!8m2!3d41.0328329!4d40.4883948
-		console.log("data life")
-
-		let [, mlat, mlon] = url.pathname.match(dataLatLngRegex)
-
-		if (mapsFrontend == "osm") return `${randomInstance}/search?query=${mlat}%2C${mlon}`
-		if (mapsFrontend == "facil") return `${randomInstance}/#q=${mlat}%2C${mlon}`
-	} else if (url.searchParams.has("ll")) {
-		// Get marker from ll param
-		// https://maps.google.com/?ll=38.882147,-76.99017
-		console.log("ll life")
-
-		const [mlat, mlon] = url.searchParams.get("ll").split(",")
-
-		if (mapsFrontend == "osm") return `${randomInstance}/search?query=${mlat}%2C${mlon}`
-		if (mapsFrontend == "facil") return `${randomInstance}/#q=${mlat}%2C${mlon}`
-	} else if (url.searchParams.has("viewpoint")) {
-		// Get marker from viewpoint param.
-		// https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=48.857832,2.295226&heading=-45&pitch=38&fov=80
-		console.log("viewpoint life")
-
-		const [mlat, mlon] = url.searchParams.get("viewpoint").split(",")
-
-		if (mapsFrontend == "osm") return `${randomInstance}/search?query=${mlat}%2C${mlon}`
-		if (mapsFrontend == "facil") return `${randomInstance}/#q=${mlat}%2C${mlon}`
-	} else {
-		// Use query as search if present.
-		console.log("normal life")
-
-		let query
-		if (url.searchParams.has("q")) query = url.searchParams.get("q")
-		else if (url.searchParams.has("query")) query = url.searchParams.get("query")
-		else if (url.pathname.match(placeRegex)) query = url.pathname.match(placeRegex)[1]
-
-		let prefsEncoded = new URLSearchParams(prefs).toString()
-		if (query) {
-			if (mapsFrontend == "osm") return `${randomInstance}/search?query="${query}${mapCentre}&${prefsEncoded}`
-			if (mapsFrontend == "facil") return `${randomInstance}/${mapCentre}/Mpnk/${query}`
-		}
-	}
-
-	let prefsEncoded = new URLSearchParams(prefs).toString()
-	console.log("mapCentre", mapCentre)
-	console.log("prefs", prefs)
-	console.log("prefsEncoded", prefsEncoded)
-	if (mapsFrontend == "osm") return `${randomInstance}/${mapCentre}&${prefsEncoded}`
-	if (mapsFrontend == "facil") return `${randomInstance}/${mapCentre}/Mpnk`
-}
-
-function initDefaults() {
-	return new Promise(async resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					facilNormalRedirectsChecks = [...redirects.facil.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = facilNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) facilNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableMaps: false,
-							mapsFrontend: "osm",
-							mapsRedirects: redirects,
-							facilNormalRedirectsChecks,
-							facilNormalCustomRedirects: [],
-
-							facilTorRedirectsChecks: [...redirects.facil.tor],
-							facilTorCustomRedirects: [],
-
-							facilI2pRedirectsChecks: [...redirects.facil.i2p],
-							facilI2pCustomRedirects: [],
-
-							facilLokiRedirectsChecks: [...redirects.facil.loki],
-							facilLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	redirect,
-	initDefaults,
-}
diff --git a/src/assets/javascripts/medium.js b/src/assets/javascripts/medium.js
deleted file mode 100644
index e5cb1dc4..00000000
--- a/src/assets/javascripts/medium.js
+++ /dev/null
@@ -1,222 +0,0 @@
-window.browser = window.browser || window.chrome
-import utils from "./utils.js"
-
-const targets = [
-	// /(?:.*\.)*(?<!(link\.|cdn\-images\-\d+\.))medium\.com(\/.*)?$/,
-	/^medium\.com/,
-	/.*\.medium\.com/,
-	// // Other domains of medium blogs, source(s): https://findingtom.com/best-medium-blogs-to-follow/#1-forge
-
-	/^towardsdatascience\.com/,
-	/^uxdesign\.cc/,
-	/^uxplanet\.org/,
-	/^betterprogramming\.pub/,
-	/^aninjusticemag\.com/,
-	/^betterhumans\.pub/,
-	/^psiloveyou\.xyz/,
-	/^entrepreneurshandbook\.co/,
-	/^blog\.coinbase\.com/,
-
-	/^ levelup\.gitconnected\.com /,
-	/^javascript\.plainenglish\.io /,
-	/^blog\.bitsrc\.io /,
-	/^ itnext\.io /,
-	/^codeburst\.io /,
-	/^infosecwriteups\.com /,
-	/^ blog\.devgenius.io /,
-	/^ writingcooperative\.com /,
-]
-
-const frontends = new Array("scribe")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.scribe = val
-		scribeNormalRedirectsChecks = [...redirects.scribe.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = scribeNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) scribeNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			mediumRedirects: redirects,
-			scribeNormalRedirectsChecks,
-			scribeTorRedirectsChecks: [...redirects.scribe.tor],
-			scribeI2pRedirectsChecks: [...redirects.scribe.i2p],
-			scribeLokiRedirectsChecks: [...redirects.scribe.loki],
-		})
-	})
-}
-
-let disableMedium,
-	mediumRedirects,
-	scribeNormalRedirectsChecks,
-	scribeNormalCustomRedirects,
-	scribeTorRedirectsChecks,
-	scribeTorCustomRedirects,
-	scribeI2pCustomRedirects,
-	scribeLokiCustomRedirects,
-	protocol,
-	protocolFallback
-
-function init() {
-	return new Promise(resolve => {
-		browser.storage.local.get(
-			[
-				"disableMedium",
-				"mediumRedirects",
-				"scribeNormalRedirectsChecks",
-				"scribeNormalCustomRedirects",
-				"scribeTorRedirectsChecks",
-				"scribeTorCustomRedirects",
-				"scribeI2pCustomRedirects",
-				"scribeLokiCustomRedirects",
-				"protocol",
-				"protocolFallback",
-			],
-			r => {
-				disableMedium = r.disableMedium
-				mediumRedirects = r.mediumRedirects
-				scribeNormalRedirectsChecks = r.scribeNormalRedirectsChecks
-				scribeNormalCustomRedirects = r.scribeNormalCustomRedirects
-				scribeTorRedirectsChecks = r.scribeTorRedirectsChecks
-				scribeTorCustomRedirects = r.scribeTorCustomRedirects
-				scribeI2pCustomRedirects = r.scribeI2pCustomRedirects
-				scribeLokiCustomRedirects = r.scribeLokiCustomRedirects
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disableMedium && !disableOverride) return
-	if (url.pathname == "/" && !disableOverride) return
-	if (type != "main_frame" && "sub_frame" && "xmlhttprequest" && "other") return
-	if (
-		initiator &&
-		[...mediumRedirects.scribe.normal, ...mediumRedirects.scribe.tor, ...scribeNormalCustomRedirects, ...scribeTorCustomRedirects, ...scribeI2pCustomRedirects, ...scribeLokiCustomRedirects].includes(
-			initiator.origin
-		)
-	)
-		return
-
-	if (!targets.some(rx => rx.test(url.host))) return
-	if (/^\/(@[a-zA-Z.]{0,}(\/|)$)/.test(url.pathname)) return
-
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...scribeLokiCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...scribeI2pCustomRedirects]
-	else if (protocol == "tor") instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) {
-		return
-	}
-
-	const randomInstance = utils.getRandomInstance(instancesList)
-	return `${randomInstance}${url.pathname}${url.search}`
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableMedium && !disableOverride) {
-			resolve()
-			return
-		}
-		let protocolHost = utils.protocolHost(url)
-		const all = [
-			...mediumRedirects.scribe.tor,
-			...mediumRedirects.scribe.normal,
-
-			...scribeNormalCustomRedirects,
-			...scribeTorCustomRedirects,
-			...scribeI2pCustomRedirects,
-			...scribeLokiCustomRedirects,
-		]
-		if (!all.includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...scribeLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...scribeI2pCustomRedirects]
-		else if (protocol == "tor") instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects]
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					scribeNormalRedirectsChecks = [...redirects.scribe.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = scribeNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) scribeNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableMedium: false,
-							mediumRedirects: redirects,
-
-							scribeNormalRedirectsChecks,
-							scribeNormalCustomRedirects: [],
-
-							scribeTorRedirectsChecks: [...redirects.scribe.tor],
-							scribeTorCustomRedirects: [],
-
-							scribeI2pRedirectsChecks: [...redirects.scribe.i2p],
-							scribeI2pCustomRedirects: [],
-
-							scribeLokiRedirectsChecks: [...redirects.scribe.loki],
-							scribeLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	redirect,
-	switchInstance,
-	initDefaults,
-}
diff --git a/src/assets/javascripts/peertube.js b/src/assets/javascripts/peertube.js
deleted file mode 100644
index 478a18f0..00000000
--- a/src/assets/javascripts/peertube.js
+++ /dev/null
@@ -1,204 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const frontends = new Array("simpleertube")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.simpleertube = val
-		simpleertubeNormalRedirectsChecks = [...redirects.simpleertube.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = simpleertubeNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) simpleertubeNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			peertubeRedirects: redirects,
-			simpleertubeNormalRedirectsChecks,
-			simpleertubeTorRedirectsChecks: [...redirects.simpleertube.tor],
-			simpleertubeI2pRedirectsChecks: [...redirects.simpleertube.i2p],
-			simpleertubeLokiRedirectsChecks: [...redirects.simpleertube.loki],
-		})
-	})
-}
-
-let disablePeertubeTargets,
-	peertubeRedirects,
-	simpleertubeNormalRedirectsChecks,
-	simpleertubeNormalCustomRedirects,
-	simpleertubeTorRedirectsChecks,
-	simpleertubeTorCustomRedirects,
-	simpleertubeI2pRedirectsChecks,
-	simpleertubeI2pCustomRedirects,
-	simpleertubeLokiRedirectsChecks,
-	simpleertubeLokiCustomRedirects,
-	peerTubeTargets,
-	protocol,
-	protocolFallback
-
-function init() {
-	return new Promise(resolve => {
-		browser.storage.local.get(
-			[
-				"disablePeertubeTargets",
-				"peertubeRedirects",
-				"simpleertubeNormalRedirectsChecks",
-				"simpleertubeNormalCustomRedirects",
-				"simpleertubeTorRedirectsChecks",
-				"simpleertubeTorCustomRedirects",
-				"simpleertubeI2pRedirectsChecks",
-				"simpleertubeI2pCustomRedirects",
-				"simpleertubeLokiRedirectsChecks",
-				"simpleertubeLokiCustomRedirects",
-				"peerTubeTargets",
-				"protocol",
-				"protocolFallback",
-			],
-			r => {
-				disablePeertubeTargets = r.disablePeertubeTargets
-				peertubeRedirects = r.peertubeRedirects
-				simpleertubeNormalRedirectsChecks = r.simpleertubeNormalRedirectsChecks
-				simpleertubeNormalCustomRedirects = r.simpleertubeNormalCustomRedirects
-				simpleertubeTorRedirectsChecks = r.simpleertubeTorRedirectsChecks
-				simpleertubeTorCustomRedirects = r.simpleertubeTorCustomRedirects
-				simpleertubeI2pRedirectsChecks = r.simpleertubeI2pRedirectsChecks
-				simpleertubeI2pCustomRedirects = r.simpleertubeI2pCustomRedirects
-				simpleertubeLokiRedirectsChecks = r.simpleertubeLokiRedirectsChecks
-				simpleertubeLokiCustomRedirects = r.simpleertubeLokiCustomRedirects
-				peerTubeTargets = r.peerTubeTargets
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
-	return [
-		...simpleertubeNormalRedirectsChecks,
-		...simpleertubeTorRedirectsChecks,
-		...simpleertubeI2pRedirectsChecks,
-		...simpleertubeLokiRedirectsChecks,
-		...simpleertubeNormalCustomRedirects,
-		...simpleertubeTorCustomRedirects,
-		...simpleertubeI2pCustomRedirects,
-		...simpleertubeLokiCustomRedirects,
-	]
-}
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disablePeertubeTargets && !disableOverride) return
-	if (initiator && (all().includes(initiator.origin) || peerTubeTargets.includes(initiator.host))) return
-	let protocolHost = utils.protocolHost(url)
-	if (!peerTubeTargets.includes(protocolHost)) return
-	if (type != "main_frame") return
-
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...simpleertubeLokiRedirectsChecks, ...simpleertubeLokiCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...simpleertubeI2pRedirectsChecks, ...simpleertubeI2pCustomRedirects]
-	else if (protocol == "tor") instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) {
-		return
-	}
-
-	const randomInstance = utils.getRandomInstance(instancesList)
-	if (url.host == "search.joinpeertube.org" || url.host == "sepiasearch.org") return randomInstance
-	return `${randomInstance}/${url.host}${url.pathname}${url.search}`
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disablePeertubeTargets && !disableOverride) {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...simpleertubeLokiRedirectsChecks, ...simpleertubeLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...simpleertubeI2pRedirectsChecks, ...simpleertubeI2pCustomRedirects]
-		else if (protocol == "tor") instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects]
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					simpleertubeNormalRedirectsChecks = [...redirects.simpleertube.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = simpleertubeNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) simpleertubeNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							peerTubeTargets: ["https://search.joinpeertube.org", ...dataJson.peertube],
-							disablePeertubeTargets: true,
-							peertubeRedirects: redirects,
-
-							simpleertubeNormalRedirectsChecks,
-							simpleertubeNormalCustomRedirects: [],
-
-							simpleertubeTorRedirectsChecks: [...redirects.simpleertube.tor],
-							simpleertubeTorCustomRedirects: [],
-
-							simpleertubeI2pRedirectsChecks: [...redirects.simpleertube.i2p],
-							simpleertubeI2pCustomRedirects: [],
-
-							simpleertubeLokiRedirectsChecks: [...redirects.simpleertube.loki],
-							simpleertubeLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	switchInstance,
-	redirect,
-	initDefaults,
-}
diff --git a/src/assets/javascripts/quora.js b/src/assets/javascripts/quora.js
deleted file mode 100644
index 578cfe76..00000000
--- a/src/assets/javascripts/quora.js
+++ /dev/null
@@ -1,202 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}(www\.|)quora\.com.*/]
-
-let redirects = {}
-
-const frontends = new Array("quetre")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.quetre = val
-		quetreNormalRedirectsChecks = [...redirects.quetre.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = quetreNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) quetreNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			quoraRedirects: redirects,
-			quetreNormalRedirectsChecks,
-			quetreTorRedirectsChecks: [...redirects.quetre.tor],
-			quetreI2pRedirectsChecks: [...redirects.quetre.i2p],
-			quetreLokiRedirectsChecks: [...redirects.quetre.loki],
-		})
-	})
-}
-
-let disableQuora,
-	protocol,
-	protocolFallback,
-	quoraRedirects,
-	quetreNormalRedirectsChecks,
-	quetreNormalCustomRedirects,
-	quetreTorRedirectsChecks,
-	quetreTorCustomRedirects,
-	quetreI2pCustomRedirects,
-	quetreLokiCustomRedirects
-
-function init() {
-	return new Promise(async resolve => {
-		browser.storage.local.get(
-			[
-				"disableQuora",
-				"protocol",
-				"protocolFallback",
-				"quoraRedirects",
-				"quetreNormalRedirectsChecks",
-				"quetreNormalCustomRedirects",
-				"quetreTorRedirectsChecks",
-				"quetreTorCustomRedirects",
-				"quetreI2pCustomRedirects",
-				"quetreLokiCustomRedirects",
-			],
-			r => {
-				disableQuora = r.disableQuora
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				quoraRedirects = r.quoraRedirects
-				quetreNormalRedirectsChecks = r.quetreNormalRedirectsChecks
-				quetreNormalCustomRedirects = r.quetreNormalCustomRedirects
-				quetreTorRedirectsChecks = r.quetreTorRedirectsChecks
-				quetreTorCustomRedirects = r.quetreTorCustomRedirects
-				quetreI2pCustomRedirects = r.quetreI2pCustomRedirects
-				quetreLokiCustomRedirects = r.quetreLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disableQuora && !disableOverride) return
-	if (url.pathname == "/" && !disableOverride) return
-	if (type != "main_frame") return
-	const all = [...quoraRedirects.quetre.normal, ...quetreNormalCustomRedirects]
-	if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return
-	if (!targets.some(rx => rx.test(url.href))) return
-
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...quetreLokiCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...quetreI2pCustomRedirects]
-	else if (protocol == "tor") instancesList = [...quetreTorRedirectsChecks, ...quetreTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...quetreNormalRedirectsChecks, ...quetreNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) {
-		return
-	}
-
-	const randomInstance = utils.getRandomInstance(instancesList)
-	return `${randomInstance}${url.pathname}`
-}
-
-function reverse(url) {
-	return new Promise(async resolve => {
-		await init()
-		let protocolHost = utils.protocolHost(url)
-		const all = [...quoraRedirects.quetre.normal, ...quoraRedirects.quetre.tor, ...quetreNormalCustomRedirects, ...quetreTorCustomRedirects, ...quetreI2pCustomRedirects, ...quetreLokiCustomRedirects]
-		if (!all.includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		resolve(`https://quora.com${url.pathname}${url.search}`)
-	})
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableQuora && !disableOverride) {
-			resolve()
-			return
-		}
-		let protocolHost = utils.protocolHost(url)
-		const all = [...quoraRedirects.quetre.tor, ...quoraRedirects.quetre.normal, ...quetreNormalCustomRedirects, ...quetreTorCustomRedirects, ...quetreI2pCustomRedirects, ...quetreLokiCustomRedirects]
-		if (!all.includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...quetreLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...quetreI2pCustomRedirects]
-		else if (protocol == "tor") instancesList = [...quetreTorRedirectsChecks, ...quetreTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...quetreNormalRedirectsChecks, ...quetreNormalCustomRedirects]
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(async resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					quetreNormalRedirectsChecks = [...redirects.quetre.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = quetreNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) quetreNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableQuora: false,
-
-							quoraRedirects: redirects,
-
-							quetreNormalRedirectsChecks,
-							quetreNormalCustomRedirects: [],
-
-							quetreTorRedirectsChecks: [...redirects.quetre.tor],
-							quetreTorCustomRedirects: [],
-
-							quetreI2pRedirectsChecks: [...redirects.quetre.i2p],
-							quetreI2pCustomRedirects: [],
-
-							quetreLokiRedirectsChecks: [...redirects.quetre.loki],
-							quetreLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-
-	redirect,
-	reverse,
-	switchInstance,
-
-	initDefaults,
-}
diff --git a/src/assets/javascripts/reddit.js b/src/assets/javascripts/reddit.js
deleted file mode 100644
index ca1993b5..00000000
--- a/src/assets/javascripts/reddit.js
+++ /dev/null
@@ -1,394 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}(www\.|old\.|np\.|new\.|amp\.|)reddit\.com/, /^https?:\/{2}(i\.|preview\.)redd\.it/]
-let redirects = {}
-
-const frontends = new Array("libreddit", "teddit")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects = val
-		libredditNormalRedirectsChecks = [...redirects.libreddit.normal]
-		tedditNormalRedirectsChecks = [...redirects.teddit.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = libredditNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) libredditNormalRedirectsChecks.splice(a, 1)
-
-			const b = tedditNormalRedirectsChecks.indexOf(instance)
-			if (b > -1) tedditNormalRedirectsChecks.splice(b, 1)
-		}
-		browser.storage.local.set({
-			redditRedirects: redirects,
-			libredditNormalRedirectsChecks,
-			libredditTorRedirectsChecks: [...redirects.libreddit.tor],
-			libredditI2pRedirectsChecks: [...redirects.libreddit.i2p],
-			libredditLokiRedirectsChecks: [...redirects.libreddit.loki],
-			tedditNormalRedirectsChecks,
-			tedditTorRedirectsChecks: [...redirects.teddit.tor],
-			tedditI2pRedirectsChecks: [...redirects.teddit.i2p],
-			tedditLokiRedirectsChecks: [...redirects.teddit.loki],
-		})
-	})
-}
-
-let disableReddit,
-	redditFrontend,
-	redditRedirects,
-	protocol,
-	protocolFallback,
-	libredditNormalRedirectsChecks,
-	libredditNormalCustomRedirects,
-	libredditTorRedirectsChecks,
-	libredditTorCustomRedirects,
-	libredditI2pCustomRedirects,
-	libredditLokiCustomRedirects,
-	tedditNormalRedirectsChecks,
-	tedditNormalCustomRedirects,
-	tedditTorRedirectsChecks,
-	tedditTorCustomRedirects,
-	tedditI2pCustomRedirects,
-	tedditLokiCustomRedirects
-
-function init() {
-	return new Promise(resolve => {
-		browser.storage.local.get(
-			[
-				"disableReddit",
-				"redditFrontend",
-				"redditRedirects",
-				"protocol",
-				"protocolFallback",
-				"libredditNormalRedirectsChecks",
-				"libredditNormalCustomRedirects",
-				"libredditTorRedirectsChecks",
-				"libredditTorCustomRedirects",
-				"libredditI2pCustomRedirects",
-				"libredditLokiCustomRedirects",
-				"tedditNormalRedirectsChecks",
-				"tedditNormalCustomRedirects",
-				"tedditTorRedirectsChecks",
-				"tedditTorCustomRedirects",
-				"tedditI2pCustomRedirects",
-				"tedditLokiCustomRedirects",
-			],
-			r => {
-				disableReddit = r.disableReddit
-				redditFrontend = r.redditFrontend
-				redditRedirects = r.redditRedirects
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				libredditNormalRedirectsChecks = r.libredditNormalRedirectsChecks
-				libredditNormalCustomRedirects = r.libredditNormalCustomRedirects
-				libredditTorRedirectsChecks = r.libredditTorRedirectsChecks
-				libredditTorCustomRedirects = r.libredditTorCustomRedirects
-				libredditI2pCustomRedirects = r.libredditI2pCustomRedirects
-				libredditLokiCustomRedirects = r.libredditLokiCustomRedirects
-				tedditNormalRedirectsChecks = r.tedditNormalRedirectsChecks
-				tedditNormalCustomRedirects = r.tedditNormalCustomRedirects
-				tedditTorRedirectsChecks = r.tedditTorRedirectsChecks
-				tedditTorCustomRedirects = r.tedditTorCustomRedirects
-				tedditI2pCustomRedirects = r.tedditI2pCustomRedirects
-				tedditLokiCustomRedirects = r.tedditLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function initLibredditCookies(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(from)
-		if (
-			![
-				...libredditNormalRedirectsChecks,
-				...libredditTorRedirectsChecks,
-				...libredditNormalCustomRedirects,
-				...libredditTorCustomRedirects,
-				...libredditI2pCustomRedirects,
-				...libredditLokiCustomRedirects,
-			].includes(protocolHost)
-		) {
-			resolve()
-			return
-		}
-
-		if (!test) {
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...libredditLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...libredditI2pCustomRedirects]
-			else if (protocol == "tor") checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
-			}
-			await utils.copyCookie("libreddit", from, checkedInstances, "theme")
-			await utils.copyCookie("libreddit", from, checkedInstances, "front_page")
-			await utils.copyCookie("libreddit", from, checkedInstances, "layout")
-			await utils.copyCookie("libreddit", from, checkedInstances, "wide")
-			await utils.copyCookie("libreddit", from, checkedInstances, "post_sort")
-			await utils.copyCookie("libreddit", from, checkedInstances, "comment_sort")
-			await utils.copyCookie("libreddit", from, checkedInstances, "show_nsfw")
-			await utils.copyCookie("libreddit", from, checkedInstances, "autoplay_videos")
-			await utils.copyCookie("libreddit", from, checkedInstances, "use_hls")
-			await utils.copyCookie("libreddit", from, checkedInstances, "hide_hls_notification")
-			await utils.copyCookie("libreddit", from, checkedInstances, "subscriptions")
-			await utils.copyCookie("libreddit", from, checkedInstances, "filters")
-		}
-		resolve(true)
-	})
-}
-
-function initTedditCookies(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		let protocolHost = utils.protocolHost(from)
-		if (
-			![...tedditNormalRedirectsChecks, ...tedditTorRedirectsChecks, ...tedditNormalCustomRedirects, ...tedditTorCustomRedirects, ...tedditI2pCustomRedirects, ...tedditI2pCustomRedirects].includes(
-				protocolHost
-			)
-		)
-			resolve()
-
-		if (!test) {
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...tedditLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...tedditI2pCustomRedirects]
-			else if (protocol == "tor") checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
-			}
-			await utils.copyCookie("teddit", from, checkedInstances, "collapse_child_comments")
-			await utils.copyCookie("teddit", from, checkedInstances, "domain_instagram")
-			await utils.copyCookie("teddit", from, checkedInstances, "domain_twitter")
-			await utils.copyCookie("teddit", from, checkedInstances, "domain_youtube")
-			await utils.copyCookie("teddit", from, checkedInstances, "flairs")
-			await utils.copyCookie("teddit", from, checkedInstances, "highlight_controversial")
-			await utils.copyCookie("teddit", from, checkedInstances, "nsfw_enabled")
-			await utils.copyCookie("teddit", from, checkedInstances, "post_media_max_height")
-			await utils.copyCookie("teddit", from, checkedInstances, "show_upvoted_percentage")
-			await utils.copyCookie("teddit", from, checkedInstances, "show_upvotes")
-			await utils.copyCookie("teddit", from, checkedInstances, "theme")
-			await utils.copyCookie("teddit", from, checkedInstances, "videos_muted")
-		}
-		resolve(true)
-	})
-}
-
-function all() {
-	return [
-		...redditRedirects.libreddit.normal,
-		...redditRedirects.libreddit.tor,
-		...redditRedirects.teddit.normal,
-		...redditRedirects.teddit.tor,
-		...libredditNormalCustomRedirects,
-		...libredditTorCustomRedirects,
-		...libredditI2pCustomRedirects,
-		...libredditLokiCustomRedirects,
-		...tedditNormalCustomRedirects,
-		...tedditTorCustomRedirects,
-		...tedditI2pCustomRedirects,
-		...tedditLokiCustomRedirects,
-	]
-}
-
-// https://libreddit.exonip.de/vid/1mq8d0ma3yk81/720.mp4
-// https://libreddit.exonip.de/img/4v3t1vgvrzk81.png
-
-// https://teddit.net/vids/1mq8d0ma3yk81.mp4
-// https://teddit.net/pics/w:null_4v3t1vgvrzk81.png
-
-// redd.it/t5379n
-// https://v.redd.it/z08avb339n801/DASH_1_2_M
-// https://i.redd.it/bfkhs659tzk81.jpg
-function redirect(url, type, initiator, disableOverride) {
-	if (disableReddit && !disableOverride) return
-	if (!targets.some(rx => rx.test(url.href))) return
-	if (initiator && all().includes(initiator.origin)) return "BYPASSTAB"
-	if (!["main_frame", "xmlhttprequest", "other", "image", "media"].includes(type)) return
-	const bypassPaths = /\/(gallery\/poll\/rpan\/settings\/topics)/
-	if (url.pathname.match(bypassPaths)) return
-
-	let libredditInstancesList = []
-	let tedditInstancesList = []
-
-	if (protocol == "loki") {
-		libredditInstancesList = [...libredditLokiCustomRedirects]
-		tedditInstancesList = [...tedditLokiCustomRedirects]
-	} else if (protocol == "i2p") {
-		libredditInstancesList = [...libredditI2pCustomRedirects]
-		tedditInstancesList = [...tedditI2pCustomRedirects]
-	} else if (protocol == "tor") {
-		libredditInstancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
-		tedditInstancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
-	}
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		libredditInstancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
-		tedditInstancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
-	}
-
-	if (url.host === "i.redd.it") {
-		if (redditFrontend == "teddit") {
-			if (tedditInstancesList.length === 0) return
-			let tedditRandomInstance = utils.getRandomInstance(tedditInstancesList)
-			return `${tedditRandomInstance}/pics/w:null_${url.pathname.substring(1)}${url.search}`
-		}
-		if (redditFrontend == "libreddit") {
-			if (libredditInstancesList.length === 0) return
-			let libredditRandomInstance = utils.getRandomInstance(libredditInstancesList)
-			return `${libredditRandomInstance}/img${url.pathname}${url.search}`
-		}
-	} else if (url.host === "redd.it") {
-		if (redditFrontend == "libreddit" && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/)) {
-			if (libredditInstancesList.length === 0) return
-			let libredditRandomInstance = utils.getRandomInstance(libredditInstancesList)
-			// https://redd.it/foo => https://libredd.it/comments/foo
-			return `${libredditRandomInstance}/comments${url.pathname}${url.search}`
-		}
-		if (redditFrontend == "teddit" && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/)) {
-			if (tedditInstancesList.length === 0) return
-			let tedditRandomInstance = utils.getRandomInstance(tedditInstancesList)
-			// https://redd.it/foo => https://teddit.net/comments/foo
-			return `${tedditRandomInstance}/comments${url.pathname}${url.search}`
-		}
-	} else if (url.host === "preview.redd.it") {
-		if (redditFrontend == "teddit") return
-		if (redditFrontend == "libreddit") {
-			if (libredditInstancesList.length === 0) return
-			const libredditRandomInstance = utils.getRandomInstance(libredditInstancesList)
-			return `${libredditRandomInstance}/preview/pre${url.pathname}${url.search}`
-		}
-	}
-
-	let randomInstance
-	if (redditFrontend == "libreddit") {
-		if (libredditInstancesList.length === 0) return
-		randomInstance = utils.getRandomInstance(libredditInstancesList)
-	}
-	if (redditFrontend == "teddit") {
-		if (tedditInstancesList.length === 0) return
-		randomInstance = utils.getRandomInstance(tedditInstancesList)
-	}
-	return `${randomInstance}${url.pathname}${url.search}`
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableReddit && !disableOverride) {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-		let instancesList = []
-		if (redditFrontend == "libreddit") {
-			if (protocol == "loki") instancesList = [...libredditLokiCustomRedirects]
-			else if (protocol == "i2p") instancesList = [...libredditI2pCustomRedirects]
-			else if (protocol == "tor") instancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
-			if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-				instancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
-			}
-			if ([...redditRedirects.teddit.normal, ...redditRedirects.teddit.tor].includes(protocolHost)) url.pathname = url.pathname.replace("/pics/w:null_", "/img/")
-		} else if (redditFrontend == "teddit") {
-			if (protocol == "loki") instancesList = [...tedditLokiCustomRedirects]
-			else if (protocol == "i2p") instancesList = [...tedditI2pCustomRedirects]
-			else if (protocol == "tor") instancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
-			if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-				instancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
-			}
-			if ([...redditRedirects.libreddit.normal, ...redditRedirects.libreddit.tor].includes(protocolHost)) url.pathname = url.pathname.replace("/img/", "/pics/w:null_")
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					libredditNormalRedirectsChecks = [...redirects.libreddit.normal]
-					tedditNormalRedirectsChecks = [...redirects.teddit.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = libredditNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) libredditNormalRedirectsChecks.splice(a, 1)
-
-						const b = tedditNormalRedirectsChecks.indexOf(instance)
-						if (b > -1) tedditNormalRedirectsChecks.splice(b, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableReddit: false,
-							redditFrontend: "libreddit",
-							redditRedirects: redirects,
-
-							libredditNormalRedirectsChecks,
-							libredditNormalCustomRedirects: [],
-
-							libredditTorRedirectsChecks: [...redirects.libreddit.tor],
-							libredditTorCustomRedirects: [],
-
-							libredditI2pRedirectsChecks: [...redirects.libreddit.i2p],
-							libredditI2pCustomRedirects: [],
-
-							libredditLokiRedirectsChecks: [...redirects.libreddit.loki],
-							libredditLokiCustomRedirects: [],
-
-							tedditNormalRedirectsChecks,
-							tedditNormalCustomRedirects: [],
-
-							tedditTorRedirectsChecks: [...redirects.teddit.tor],
-							tedditTorCustomRedirects: [],
-
-							tedditI2pRedirectsChecks: [...redirects.teddit.i2p],
-							tedditI2pCustomRedirects: [],
-
-							tedditLokiRedirectsChecks: [...redirects.teddit.loki],
-							tedditLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	initLibredditCookies,
-	initTedditCookies,
-
-	redirect,
-	initDefaults,
-	switchInstance,
-}
diff --git a/src/assets/javascripts/reuters.js b/src/assets/javascripts/reuters.js
deleted file mode 100644
index 51d16329..00000000
--- a/src/assets/javascripts/reuters.js
+++ /dev/null
@@ -1,150 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}(www\.|)reuters\.com.*/]
-
-const frontends = new Array("neuters")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.neuters = val
-		neutersNormalRedirectsChecks = [...redirects.neuters.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = neutersNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) neutersNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			neutersRedirects: redirects,
-			neutersNormalRedirectsChecks,
-			neutersTorRedirectsChecks: [...redirects.neuters.tor],
-			neutersI2pRedirectsChecks: [...redirects.neuters.i2p],
-			neutersLokiRedirectsChecks: [...redirects.neuters.loki],
-		})
-	})
-}
-
-let disableReuters,
-	protocol,
-	protocolFallback,
-	reutersRedirects,
-	neutersNormalRedirectsChecks,
-	neutersNormalCustomRedirects,
-	neutersTorRedirectsChecks,
-	neutersTorCustomRedirects,
-	neutersI2pCustomRedirects,
-	neutersLokiCustomRedirects
-
-function init() {
-	return new Promise(async resolve => {
-		browser.storage.local.get(
-			[
-				"disableReuters",
-				"protocol",
-				"protocolFallback",
-				"reutersRedirects",
-				"neutersNormalRedirectsChecks",
-				"neutersNormalCustomRedirects",
-				"neutersTorRedirectsChecks",
-				"neutersTorCustomRedirects",
-				"neutersI2pCustomRedirects",
-				"neutersLokiCustomRedirects",
-			],
-			r => {
-				disableReuters = r.disableReuters
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				reutersRedirects = r.reutersRedirects
-				neutersNormalRedirectsChecks = r.neutersNormalRedirectsChecks
-				neutersNormalCustomRedirects = r.neutersNormalCustomRedirects
-				neutersTorRedirectsChecks = r.neutersTorRedirectsChecks
-				neutersTorCustomRedirects = r.neutersTorCustomRedirects
-				neutersI2pCustomRedirects = r.neutersI2pCustomRedirects
-				neutersLokiCustomRedirects = r.neutersLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disableReuters && !disableOverride) return
-	if (type != "main_frame") return
-	const all = [...reutersRedirects.neuters.normal, ...neutersNormalCustomRedirects]
-	if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return
-	if (!targets.some(rx => rx.test(url.href))) return
-
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...neutersLokiCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...neutersI2pCustomRedirects]
-	else if (protocol == "tor") instancesList = [...neutersTorRedirectsChecks, ...neutersTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...neutersNormalRedirectsChecks, ...neutersNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) return
-
-	const randomInstance = utils.getRandomInstance(instancesList)
-	// stolen from https://addons.mozilla.org/en-US/firefox/addon/reuters-redirect/
-	if (url.pathname.startsWith("/article/") || url.pathname.startsWith("/pf/") || url.pathname.startsWith("/arc/") || url.pathname.startsWith("/resizer/")) return null
-	else if (url.pathname.endsWith("/")) return `${randomInstance}${url.pathname}`
-	else return `${randomInstance}${url.pathname}/`
-}
-
-function initDefaults() {
-	return new Promise(async resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					neutersNormalRedirectsChecks = [...redirects.neuters.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = neutersNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) neutersNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableReuters: true,
-
-							reutersRedirects: redirects,
-
-							neutersNormalRedirectsChecks,
-							neutersNormalCustomRedirects: [],
-
-							neutersTorRedirectsChecks: [...redirects.neuters.tor],
-							neutersTorCustomRedirects: [],
-
-							neutersI2pRedirectsChecks: [...redirects.neuters.i2p],
-							neutersI2pCustomRedirects: [],
-
-							neutersLokiRedirectsChecks: [...redirects.neuters.loki],
-							neutersLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	redirect,
-	initDefaults,
-}
diff --git a/src/assets/javascripts/search.js b/src/assets/javascripts/search.js
deleted file mode 100644
index 64b56caa..00000000
--- a/src/assets/javascripts/search.js
+++ /dev/null
@@ -1,576 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}search\.libredirect\.invalid/]
-// Ill optimise all of assets/javascripts at a later date. For now, I'll just add librex and optimse options javascript
-const frontends = new Array("searx", "searxng", "whoogle", "librex")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects = val
-		searxNormalRedirectsChecks = [...redirects.searx.normal]
-		searxngNormalRedirectsChecks = [...redirects.searxng.normal]
-		whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]
-		librexNormalRedirectsChecks = [...redirects.librex.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = searxNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) searxNormalRedirectsChecks.splice(a, 1)
-
-			const b = searxngNormalRedirectsChecks.indexOf(instance)
-			if (b > -1) searxngNormalRedirectsChecks.splice(b, 1)
-
-			const c = whoogleNormalRedirectsChecks.indexOf(instance)
-			if (c > -1) whoogleNormalRedirectsChecks.splice(c, 1)
-
-			const d = librexNormalRedirectsChecks.indexOf(instance)
-			if (d > -1) librexNormalRedirectsChecks.splice(d, 1)
-		}
-		browser.storage.local.set({
-			searchRedirects: redirects,
-			searxNormalRedirectsChecks,
-			searxTorRedirectsChecks: [...redirects.searx.tor],
-			searxI2pRedirectsChecks: [...redirects.searx.i2p],
-			searxLokiRedirectsChecks: [...redirects.searx.loki],
-			searxngNormalRedirectsChecks,
-			searxngTorRedirectsChecks: [...redirects.searxng.tor],
-			searxngI2pRedirectsChecks: [...redirects.searxng.i2p],
-			searxngLokiRedirectsChecks: [...redirects.searxng.loki],
-			whoogleNormalRedirectsChecks,
-			whoogleTorRedirectsChecks: [...redirects.whoogle.tor],
-			whoogleI2pRedirectsChecks: [...redirects.whoogle.i2p],
-			whoogleLokiRedirectsChecks: [...redirects.whoogle.loki],
-			librexNormalRedirectsChecks,
-			librexTorRedirectsChecks: [...redirects.librex.tor],
-			librexI2pRedirectsChecks: [...redirects.librex.i2p],
-			librexLokiRedirectsChecks: [...redirects.librex.loki],
-		})
-	})
-}
-
-let disableSearch,
-	searchFrontend,
-	searchRedirects,
-	protocol,
-	protocolFallback,
-	whoogleNormalRedirectsChecks,
-	whoogleNormalCustomRedirects,
-	whoogleTorRedirectsChecks,
-	whoogleTorCustomRedirects,
-	whoogleI2pRedirectsChecks,
-	whoogleI2pCustomRedirects,
-	whoogleLokiCustomRedirects,
-	searxNormalRedirectsChecks,
-	searxNormalCustomRedirects,
-	searxTorRedirectsChecks,
-	searxTorCustomRedirects,
-	searxI2pRedirectsChecks,
-	searxI2pCustomRedirects,
-	searxLokiCustomRedirects,
-	searxngNormalRedirectsChecks,
-	searxngNormalCustomRedirects,
-	searxngTorRedirectsChecks,
-	searxngTorCustomRedirects,
-	searxngI2pRedirectsChecks,
-	searxngI2pCustomRedirects,
-	searxngLokiCustomRedirects,
-	librexNormalRedirectsChecks,
-	librexNormalCustomRedirects,
-	librexTorRedirectsChecks,
-	librexTorCustomRedirects,
-	librexI2pRedirectsChecks,
-	librexI2pCustomRedirects,
-	librexLokiCustomRedirects
-
-function init() {
-	return new Promise(async resolve => {
-		browser.storage.local.get(
-			[
-				"disableSearch",
-				"searchFrontend",
-				"searchRedirects",
-				"protocol",
-				"protocolFallback",
-				"whoogleNormalRedirectsChecks",
-				"whoogleNormalCustomRedirects",
-				"whoogleTorRedirectsChecks",
-				"whoogleTorCustomRedirects",
-				"whoogleI2pRedirectsChecks",
-				"whoogleI2pCustomRedirects",
-				"whoogleLokiCustomRedirects",
-				"searxNormalRedirectsChecks",
-				"searxNormalCustomRedirects",
-				"searxTorRedirectsChecks",
-				"searxTorCustomRedirects",
-				"searxI2pRedirectsChecks",
-				"searxI2pCustomRedirects",
-				"searxLokiCustomRedirects",
-				"searxngNormalRedirectsChecks",
-				"searxngNormalCustomRedirects",
-				"searxngTorRedirectsChecks",
-				"searxngTorCustomRedirects",
-				"searxngI2pRedirectsChecks",
-				"searxngI2pCustomRedirects",
-				"searxngLokiCustomRedirects",
-				"librexNormalRedirectsChecks",
-				"librexNormalCustomRedirects",
-				"librexTorRedirectsChecks",
-				"librexTorCustomRedirects",
-				"librexI2pRedirectsChecks",
-				"librexI2pCustomRedirects",
-				"librexLokiCustomRedirects",
-			],
-			r => {
-				disableSearch = r.disableSearch
-				searchFrontend = r.searchFrontend
-				searchRedirects = r.searchRedirects
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				whoogleNormalRedirectsChecks = r.whoogleNormalRedirectsChecks
-				whoogleNormalCustomRedirects = r.whoogleNormalCustomRedirects
-				whoogleTorRedirectsChecks = r.whoogleTorRedirectsChecks
-				whoogleTorCustomRedirects = r.whoogleTorCustomRedirects
-				whoogleI2pRedirectsChecks = r.whoogleI2pRedirectsChecks
-				whoogleI2pCustomRedirects = r.whoogleI2pCustomRedirects
-				whoogleLokiCustomRedirects = r.whoogleLokiCustomRedirects
-				searxNormalRedirectsChecks = r.searxNormalRedirectsChecks
-				searxNormalCustomRedirects = r.searxNormalCustomRedirects
-				searxTorRedirectsChecks = r.searxTorRedirectsChecks
-				searxTorCustomRedirects = r.searxTorCustomRedirects
-				searxI2pRedirectsChecks = r.searxI2pRedirectsChecks
-				searxI2pCustomRedirects = r.searxI2pCustomRedirects
-				searxLokiCustomRedirects = r.searxLokiCustomRedirects
-				searxngNormalRedirectsChecks = r.searxngNormalRedirectsChecks
-				searxngNormalCustomRedirects = r.searxngNormalCustomRedirects
-				searxngTorRedirectsChecks = r.searxngTorRedirectsChecks
-				searxngTorCustomRedirects = r.searxngTorCustomRedirects
-				searxngI2pRedirectsChecks = r.searxngI2pRedirectsChecks
-				searxngI2pCustomRedirects = r.searxngI2pCustomRedirects
-				searxngLokiCustomRedirects = r.searxngLokiCustomRedirects
-				librexNormalRedirectsChecks = r.librexNormalRedirectsChecks
-				librexNormalCustomRedirects = r.librexNormalCustomRedirects
-				librexTorRedirectsChecks = r.librexTorRedirectsChecks
-				librexTorCustomRedirects = r.librexTorCustomRedirects
-				librexI2pRedirectsChecks = r.librexI2pRedirectsChecks
-				librexI2pCustomRedirects = r.librexI2pCustomRedirects
-				librexLokiCustomRedirects = r.librexLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function initSearxCookies(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		let protocolHost = utils.protocolHost(from)
-		if (
-			![
-				...searxNormalRedirectsChecks,
-				...searxNormalCustomRedirects,
-				...searxTorRedirectsChecks,
-				...searxTorCustomRedirects,
-				...searxI2pRedirectsChecks,
-				...searxI2pCustomRedirects,
-				...searxLokiCustomRedirects,
-			].includes(protocolHost)
-		) {
-			resolve()
-			return
-		}
-
-		if (!test) {
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...searxLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...searxI2pCustomRedirects, ...searxI2pRedirectsChecks]
-			else if (protocol == "tor") checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]
-			}
-			await utils.copyCookie("searx", from, checkedInstances, "advanced_search")
-			await utils.copyCookie("searx", from, checkedInstances, "autocomplete")
-			await utils.copyCookie("searx", from, checkedInstances, "categories")
-			await utils.copyCookie("searx", from, checkedInstances, "disabled_engines")
-			await utils.copyCookie("searx", from, checkedInstances, "disabled_plugins")
-			await utils.copyCookie("searx", from, checkedInstances, "doi_resolver")
-			await utils.copyCookie("searx", from, checkedInstances, "enabled_engines")
-			await utils.copyCookie("searx", from, checkedInstances, "enabled_plugins")
-			await utils.copyCookie("searx", from, checkedInstances, "image_proxy")
-			await utils.copyCookie("searx", from, checkedInstances, "language")
-			await utils.copyCookie("searx", from, checkedInstances, "locale")
-			await utils.copyCookie("searx", from, checkedInstances, "method")
-			await utils.copyCookie("searx", from, checkedInstances, "oscar-style")
-			await utils.copyCookie("searx", from, checkedInstances, "results_on_new_tab")
-			await utils.copyCookie("searx", from, checkedInstances, "safesearch")
-			await utils.copyCookie("searx", from, checkedInstances, "theme")
-			await utils.copyCookie("searx", from, checkedInstances, "tokens")
-		}
-		resolve(true)
-	})
-}
-
-function initSearxngCookies(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		let protocolHost = utils.protocolHost(from)
-		if (
-			![
-				...searxngNormalRedirectsChecks,
-				...searxngNormalCustomRedirects,
-				...searxngTorRedirectsChecks,
-				...searxngTorCustomRedirects,
-				...searxngI2pRedirectsChecks,
-				...searxngI2pCustomRedirects,
-				...searxngLokiCustomRedirects,
-			].includes(protocolHost)
-		) {
-			resolve()
-			return
-		}
-
-		if (!test) {
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...searxngLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...searxngI2pCustomRedirects, ...searxngI2pRedirectsChecks]
-			else if (protocol == "tor") checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]
-			}
-			await utils.copyCookie("searxng", from, checkedInstances, "autocomplete")
-			await utils.copyCookie("searxng", from, checkedInstances, "categories")
-			await utils.copyCookie("searxng", from, checkedInstances, "disabled_engines")
-			await utils.copyCookie("searxng", from, checkedInstances, "disabled_plugins")
-			await utils.copyCookie("searxng", from, checkedInstances, "doi_resolver")
-			await utils.copyCookie("searxng", from, checkedInstances, "enabled_plugins")
-			await utils.copyCookie("searxng", from, checkedInstances, "enabled_engines")
-			await utils.copyCookie("searxng", from, checkedInstances, "image_proxy")
-			await utils.copyCookie("searxng", from, checkedInstances, "infinite_scroll")
-			await utils.copyCookie("searxng", from, checkedInstances, "language")
-			await utils.copyCookie("searxng", from, checkedInstances, "locale")
-			await utils.copyCookie("searxng", from, checkedInstances, "maintab")
-			await utils.copyCookie("searxng", from, checkedInstances, "method")
-			await utils.copyCookie("searxng", from, checkedInstances, "query_in_title")
-			await utils.copyCookie("searxng", from, checkedInstances, "results_on_new_tab")
-			await utils.copyCookie("searxng", from, checkedInstances, "safesearch")
-			await utils.copyCookie("searxng", from, checkedInstances, "simple_style")
-			await utils.copyCookie("searxng", from, checkedInstances, "theme")
-			await utils.copyCookie("searxng", from, checkedInstances, "tokens")
-		}
-		resolve(true)
-	})
-}
-
-function initLibrexCookies(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		let protocolHost = utils.protocolHost(from)
-		if (
-			![
-				...librexNormalRedirectsChecks,
-				...librexNormalCustomRedirects,
-				...librexTorRedirectsChecks,
-				...librexTorCustomRedirects,
-				...librexI2pRedirectsChecks,
-				...librexI2pCustomRedirects,
-				...librexLokiCustomRedirects,
-			].includes(protocolHost)
-		) {
-			resolve()
-			return
-		}
-
-		if (!test) {
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...librexLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...librexI2pCustomRedirects, ...librexI2pRedirectsChecks]
-			else if (protocol == "tor") checkedInstances = [...librexTorRedirectsChecks, ...librexTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects]
-			}
-			await utils.copyCookie("librex", from, checkedInstances, "bibliogram")
-			await utils.copyCookie("librex", from, checkedInstances, "disable_special")
-			await utils.copyCookie("librex", from, checkedInstances, "invidious")
-			await utils.copyCookie("librex", from, checkedInstances, "libreddit")
-			await utils.copyCookie("librex", from, checkedInstances, "nitter")
-			await utils.copyCookie("librex", from, checkedInstances, "proxitok")
-			await utils.copyCookie("librex", from, checkedInstances, "theme")
-			await utils.copyCookie("librex", from, checkedInstances, "wikiless")
-		}
-		resolve(true)
-	})
-}
-
-function redirect(url, disableOverride) {
-	if (disableSearch && !disableOverride) return
-	if (!targets.some(rx => rx.test(url.href))) return
-	if (url.searchParams.has("tbm")) return
-	if (url.hostname.includes("google") && !url.searchParams.has("q") && url.pathname != "/") return
-	let randomInstance
-	let path
-	if (searchFrontend == "searx") {
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...searxLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...searxI2pCustomRedirects, ...searxI2pRedirectsChecks]
-		else if (protocol == "tor") instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]
-		}
-		if (instancesList.length === 0) {
-			return
-		}
-
-		randomInstance = utils.getRandomInstance(instancesList)
-		path = "/"
-	} else if (searchFrontend == "searxng") {
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...searxngLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...searxngI2pCustomRedirects, ...searxngI2pRedirectsChecks]
-		else if (protocol == "tor") instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]
-		}
-		if (instancesList.length === 0) {
-			return
-		}
-
-		randomInstance = utils.getRandomInstance(instancesList)
-		path = "/"
-	} else if (searchFrontend == "whoogle") {
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...whoogleLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...whoogleI2pCustomRedirects, ...whoogleI2pRedirectsChecks]
-		else if (protocol == "tor") instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects]
-		}
-		if (instancesList.length === 0) {
-			return
-		}
-
-		randomInstance = utils.getRandomInstance(instancesList)
-		path = "/search"
-	} else if (searchFrontend == "librex") {
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...librexLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...librexI2pCustomRedirects, ...librexI2pRedirectsChecks]
-		else if (protocol == "tor") instancesList = [...librexTorRedirectsChecks, ...librexTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects]
-		}
-		if (instancesList.length === 0) {
-			return
-		}
-
-		randomInstance = utils.getRandomInstance(instancesList)
-		path = "/search.php"
-	}
-
-	if (((url.hostname.includes("google") || url.hostname.includes("bing")) && !url.searchParams.has("q")) || (url.hostname.includes("yandex") && !url.searchParams.has("text"))) path = "/"
-
-	let searchQuery = ""
-	if ((url.hostname.includes("google") || url.hostname.includes("bing") || url.hostname.includes("search.libredirect.invalid")) && url.searchParams.has("q"))
-		searchQuery = `?q=${encodeURIComponent(url.searchParams.get("q"))}`
-	if (url.hostname.includes("yandex") && url.searchParams.has("text")) searchQuery = `?q=${url.searchParams.get("text")}`
-
-	return `${randomInstance}${path}${searchQuery}`
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableSearch && !disableOverride) {
-			resolve()
-			return
-		}
-		let protocolHost = utils.protocolHost(url)
-		if (
-			![
-				...searchRedirects.searx.normal,
-				...searchRedirects.searx.tor,
-				...searchRedirects.searx.i2p,
-
-				...searchRedirects.searxng.normal,
-				...searchRedirects.searxng.tor,
-				...searchRedirects.searxng.i2p,
-
-				...searchRedirects.whoogle.normal,
-				...searchRedirects.whoogle.tor,
-				...searchRedirects.whoogle.i2p,
-
-				...searchRedirects.librex.normal,
-				...searchRedirects.librex.tor,
-				...searchRedirects.librex.i2p,
-
-				...searxNormalCustomRedirects,
-				...searxTorCustomRedirects,
-				...searxI2pCustomRedirects,
-				...searxLokiCustomRedirects,
-
-				...searxngNormalCustomRedirects,
-				...searxngTorCustomRedirects,
-				...searxngI2pCustomRedirects,
-				...searxngLokiCustomRedirects,
-
-				...whoogleNormalCustomRedirects,
-				...whoogleTorCustomRedirects,
-				...whoogleI2pCustomRedirects,
-				...whoogleLokiCustomRedirects,
-
-				...librexNormalCustomRedirects,
-				...librexTorCustomRedirects,
-				...librexI2pCustomRedirects,
-				...librexLokiCustomRedirects,
-			].includes(protocolHost)
-		) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-
-		if (protocol == "loki") {
-			if (searchFrontend == "searx") instancesList = [...searxLokiCustomRedirects]
-			else if (searchFrontend == "searxng") instancesList = [...searxngLokiCustomRedirects]
-			else if (searchFrontend == "whoogle") instancesList = [...whoogleLokiCustomRedirects]
-			else if (searchFrontend == "librex") instancesList = [...librexLokiCustomRedirects]
-		} else if (protocol == "tor") {
-			if (searchFrontend == "searx") instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]
-			else if (searchFrontend == "searxng") instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]
-			else if (searchFrontend == "whoogle") instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects]
-			else if (searchFrontend == "librex") instancesList = [...librexTorRedirectsChecks, ...librexTorCustomRedirects]
-		} else if (protocol == "i2p") {
-			if (searchFrontend == "searx") instancesList = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects]
-			else if (searchFrontend == "searxng") instancesList = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects]
-			else if (searchFrontend == "whoogle") instancesList = [...whoogleI2pRedirectsChecks, ...whoogleI2pCustomRedirects]
-			else if (searchFrontend == "librex") instancesList = [...librexI2pRedirectsChecks, ...librexI2pCustomRedirects]
-		}
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			if (searchFrontend == "searx") instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]
-			else if (searchFrontend == "searxng") instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]
-			else if (searchFrontend == "whoogle") instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects]
-			else if (searchFrontend == "librex") instancesList = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects]
-		}
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(async resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					searxNormalRedirectsChecks = [...redirects.searx.normal]
-					searxngNormalRedirectsChecks = [...redirects.searxng.normal]
-					whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]
-					librexNormalRedirectsChecks = [...redirects.librex.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = searxNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) searxNormalRedirectsChecks.splice(a, 1)
-
-						const b = searxngNormalRedirectsChecks.indexOf(instance)
-						if (b > -1) searxngNormalRedirectsChecks.splice(b, 1)
-
-						const c = whoogleNormalRedirectsChecks.indexOf(instance)
-						if (c > -1) whoogleNormalRedirectsChecks.splice(c, 1)
-
-						const d = librexNormalRedirectsChecks.indexOf(instance)
-						if (d > -1) librexNormalRedirectsChecks.splice(d, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableSearch: false,
-							searchFrontend: "searxng",
-							searchRedirects: redirects,
-							searxngCustomSettings: false,
-
-							whoogleNormalRedirectsChecks,
-							whoogleNormalCustomRedirects: [],
-
-							whoogleTorRedirectsChecks: [...redirects.whoogle.tor],
-							whoogleTorCustomRedirects: [],
-
-							whoogleI2pRedirectsChecks: [...redirects.whoogle.i2p],
-							whoogleI2pCustomRedirects: [],
-
-							whoogleLokiRedirectsChecks: [...redirects.whoogle.loki],
-							whoogleLokiCustomRedirects: [],
-
-							searxNormalRedirectsChecks,
-							searxNormalCustomRedirects: [],
-
-							searxTorRedirectsChecks: [...redirects.searx.tor],
-							searxTorCustomRedirects: [],
-
-							searxI2pRedirectsChecks: [...redirects.searx.i2p],
-							searxI2pCustomRedirects: [],
-
-							searxLokiRedirectsChecks: [...redirects.searx.loki],
-							searxLokiCustomRedirects: [],
-
-							searxngNormalRedirectsChecks,
-							searxngNormalCustomRedirects: [],
-
-							searxngTorRedirectsChecks: [...redirects.searxng.tor],
-							searxngTorCustomRedirects: [],
-
-							searxngI2pRedirectsChecks: [...redirects.searxng.i2p],
-							searxngI2pCustomRedirects: [],
-
-							searxngLokiRedirectsChecks: [...redirects.searxng.loki],
-							searxngLokiCustomRedirects: [],
-
-							librexNormalRedirectsChecks,
-							librexNormalCustomRedirects: [],
-
-							librexTorRedirectsChecks: [...redirects.librex.tor],
-							librexTorCustomRedirects: [],
-
-							librexI2pRedirectsChecks: [...redirects.librex.i2p],
-							librexI2pCustomRedirects: [],
-
-							librexLokiRedirectsChecks: [...redirects.librex.loki],
-							librexLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	initSearxCookies,
-	initSearxngCookies,
-	initLibrexCookies,
-	redirect,
-	initDefaults,
-	switchInstance,
-}
diff --git a/src/assets/javascripts/sendTargets.js b/src/assets/javascripts/sendTargets.js
deleted file mode 100644
index a52ab6ff..00000000
--- a/src/assets/javascripts/sendTargets.js
+++ /dev/null
@@ -1,195 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}send\.libredirect\.invalid\/$/, /^ https ?: \/\/send\.firefox\.com\/$/, /^https?:\/{2}sendfiles\.online\/$/]
-
-const frontends = new Array("send")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.send = val
-		sendNormalRedirectsChecks = [...redirects.send.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = sendNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) sendNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			sendTargetsRedirects: redirects,
-			sendNormalRedirectsChecks,
-			sendTorRedirectsChecks: [...redirects.send.tor],
-			sendI2pRedirectsChecks: [...redirects.send.i2p],
-			sendLokiRedirectsChecks: [...redirects.send.loki],
-		})
-	})
-}
-
-let disableSendTarget,
-	sendTargetsRedirects,
-	sendNormalRedirectsChecks,
-	sendNormalCustomRedirects,
-	sendTorRedirectsChecks,
-	sendTorCustomRedirects,
-	sendI2pCustomRedirects,
-	sendLokiCustomRedirects,
-	protocol,
-	protocolFallback
-
-function init() {
-	return new Promise(resolve => {
-		browser.storage.local.get(
-			[
-				"disableSendTarget",
-				"sendTargetsRedirects",
-				"protocol",
-				"protocolFallback",
-				"sendNormalRedirectsChecks",
-				"sendNormalCustomRedirects",
-				"sendTorRedirectsChecks",
-				"sendTorCustomRedirects",
-				"sendI2pCustomRedirects",
-				"sendLokiCustomRedirects",
-			],
-			r => {
-				disableSendTarget = r.disableSendTarget
-				sendTargetsRedirects = r.sendTargetsRedirects
-				sendNormalRedirectsChecks = r.sendNormalRedirectsChecks
-				sendNormalCustomRedirects = r.sendNormalCustomRedirects
-				sendTorRedirectsChecks = r.sendTorRedirectsChecks
-				sendTorCustomRedirects = r.sendTorCustomRedirects
-				sendI2pCustomRedirects = r.sendI2pCustomRedirects
-				sendLokiCustomRedirects = r.sendLokiCustomRedirects
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
-	return [
-		...sendTargetsRedirects.send.normal,
-		...sendTargetsRedirects.send.tor,
-		...sendNormalCustomRedirects,
-		...sendTorRedirectsChecks,
-		...sendTorCustomRedirects,
-		...sendI2pCustomRedirects,
-		...sendLokiCustomRedirects,
-	]
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableSendTarget && !disableOverride) {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-		if (url.pathname != "/") {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...sendLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...sendI2pCustomRedirects]
-		else if (protocol == "tor") instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects]
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disableSendTarget && !disableOverride) return
-	if (type != "main_frame") return
-	if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) return
-	if (!targets.some(rx => rx.test(url.href))) return
-
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...sendLokiCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...sendI2pCustomRedirects]
-	else if (protocol == "tor") instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) return
-
-	const randomInstance = utils.getRandomInstance(instancesList)
-	return randomInstance
-}
-
-function initDefaults() {
-	return new Promise(resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					sendNormalRedirectsChecks = [...redirects.send.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = sendNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) sendNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableSendTarget: false,
-							sendTargetsRedirects: redirects,
-
-							sendNormalRedirectsChecks,
-							sendNormalCustomRedirects: [],
-
-							sendTorRedirectsChecks: [...redirects.send.tor],
-							sendTorCustomRedirects: [],
-
-							sendI2pRedirectsChecks: [...redirects.send.i2p],
-							sendI2pCustomRedirects: [],
-
-							sendLokiRedirectsChecks: [...redirects.send.loki],
-							sendLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	redirect,
-	switchInstance,
-	initDefaults,
-}
diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js
index 3db12595..49af6d1f 100644
--- a/src/assets/javascripts/services.js
+++ b/src/assets/javascripts/services.js
@@ -550,29 +550,30 @@ function unifyPreferences(url) {
 }

 

 function setRedirects(redirects) {

-	browser.storage.local.get(["options", "blacklists"], async r => {

-		let options = r.options

-		let targets = {}

-		for (const service in config.services) {

-			if (config.services[service].targets == "datajson") {

-				targets[service] = redirects[service]

-			}

-			for (const frontend in config.services[service].frontends) {

-				if (config.services[service].frontends[frontend].instanceList) {

-					for (const network in config.networks) {

-						options[frontend][network].enabled = redirects[frontend][network]

-					}

-					for (const blacklist in r.blacklists) {

-						for (const instance of blacklist) {

-							let i = options[frontend].clearnet.enabled.indexOf(instance)

-							if (i > -1) options[frontend].clearnet.enabled.splice(i, 1)

-						}

+	//browser.storage.local.get(["options", "blacklists"], async r => {

+	//let options = r.options

+	let targets = {}

+	for (const service in config.services) {

+		if (config.services[service].targets == "datajson") {

+			targets[service] = redirects[service]

+		}

+		for (const frontend in config.services[service].frontends) {

+			if (config.services[service].frontends[frontend].instanceList) {

+				for (const network in config.networks) {

+					options[frontend][network].enabled = redirects[frontend][network]

+				}

+				for (const blacklist in blacklists) {

+					for (const instance of blacklist) {

+						let i = options[frontend].clearnet.enabled.indexOf(instance)

+						if (i > -1) options[frontend].clearnet.enabled.splice(i, 1)

 					}

 				}

 			}

 		}

-		browser.storage.local.set({ redirects, targets, options })

-	})

+	}

+	console.log(redirects)

+	browser.storage.local.set({ redirects, targets, options })

+	//})

 }

 

 export default {

diff --git a/src/assets/javascripts/tiktok.js b/src/assets/javascripts/tiktok.js
deleted file mode 100644
index 71f07687..00000000
--- a/src/assets/javascripts/tiktok.js
+++ /dev/null
@@ -1,246 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}(www\.|)tiktok\.com.*/]
-
-const frontends = new Array("proxiTok")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.proxiTok = val
-		proxiTokNormalRedirectsChecks = [...redirects.proxiTok.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = proxiTokNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) proxiTokNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			tiktokRedirects: redirects,
-			proxiTokNormalRedirectsChecks,
-			proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor],
-			proxiTokI2pRedirectsChecks: [...redirects.proxiTok.i2p],
-			proxiTokLokiRedirectsChecks: [...redirects.proxiTok.loki],
-		})
-	})
-}
-
-function initProxiTokCookies(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		let protocolHost = utils.protocolHost(from)
-		if (
-			![
-				...proxiTokNormalRedirectsChecks,
-				...proxiTokNormalCustomRedirects,
-				...proxiTokTorRedirectsChecks,
-				...proxiTokTorCustomRedirects,
-				...proxiTokI2pCustomRedirects,
-				...proxiTokLokiCustomRedirects,
-			].includes(protocolHost)
-		)
-			resolve()
-
-		if (!test) {
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...proxiTokI2pCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...proxiTokLokiCustomRedirects]
-			else if (protocol == "tor") checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
-			}
-			await utils.copyCookie("proxitok", from, checkedInstances, "theme")
-			await utils.copyCookie("proxitok", from, checkedInstances, "api-legacy")
-		}
-		resolve(true)
-	})
-}
-
-let disableTiktok,
-	protocol,
-	protocolFallback,
-	tiktokRedirects,
-	proxiTokNormalRedirectsChecks,
-	proxiTokNormalCustomRedirects,
-	proxiTokTorRedirectsChecks,
-	proxiTokTorCustomRedirects,
-	proxiTokI2pCustomRedirects,
-	proxiTokLokiCustomRedirects
-
-function init() {
-	return new Promise(async resolve => {
-		browser.storage.local.get(
-			[
-				"disableTiktok",
-				"protocol",
-				"protocolFallback",
-				"tiktokRedirects",
-				"proxiTokNormalRedirectsChecks",
-				"proxiTokNormalCustomRedirects",
-				"proxiTokTorRedirectsChecks",
-				"proxiTokTorCustomRedirects",
-				"proxiTokI2pCustomRedirects",
-				"proxiTokLokiCustomRedirects",
-			],
-			r => {
-				disableTiktok = r.disableTiktok
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				tiktokRedirects = r.tiktokRedirects
-				proxiTokNormalRedirectsChecks = r.proxiTokNormalRedirectsChecks
-				proxiTokNormalCustomRedirects = r.proxiTokNormalCustomRedirects
-				proxiTokTorRedirectsChecks = r.proxiTokTorRedirectsChecks
-				proxiTokTorCustomRedirects = r.proxiTokTorCustomRedirects
-				proxiTokI2pCustomRedirects = r.proxiTokI2pCustomRedirects
-				proxiTokLokiCustomRedirects = r.proxiTokLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-// https://www.tiktok.com/@keysikaspol/video/7061265241887345946
-// https://www.tiktok.com/@keysikaspol
-function redirect(url, type, initiator, disableOverride) {
-	if (disableTiktok && !disableOverride) return
-	if (type != "main_frame") return
-	const all = [...tiktokRedirects.proxiTok.normal, ...proxiTokNormalCustomRedirects]
-	if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return
-	if (!targets.some(rx => rx.test(url.href))) return
-
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...proxiTokI2pCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...proxiTokLokiCustomRedirects]
-	else if (protocol == "tor") instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) return
-
-	const randomInstance = utils.getRandomInstance(instancesList)
-	return `${randomInstance}${url.pathname}`
-}
-
-function reverse(url) {
-	return new Promise(async resolve => {
-		await init()
-		let protocolHost = utils.protocolHost(url)
-		const all = [
-			...tiktokRedirects.proxiTok.normal,
-			...tiktokRedirects.proxiTok.tor,
-			...proxiTokNormalCustomRedirects,
-			...proxiTokTorCustomRedirects,
-			...proxiTokI2pCustomRedirects,
-			...proxiTokLokiCustomRedirects,
-		]
-		if (!all.includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		resolve(`https://tiktok.com${url.pathname}${url.search}`)
-	})
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableTiktok && !disableOverride) {
-			resolve()
-			return
-		}
-		let protocolHost = utils.protocolHost(url)
-		const all = [
-			...tiktokRedirects.proxiTok.tor,
-			...tiktokRedirects.proxiTok.normal,
-
-			...proxiTokNormalCustomRedirects,
-			...proxiTokTorCustomRedirects,
-			...proxiTokI2pCustomRedirects,
-			...proxiTokLokiCustomRedirects,
-		]
-		if (!all.includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...proxiTokI2pCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...proxiTokLokiCustomRedirects]
-		else if (protocol == "tor") instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(async resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					proxiTokNormalRedirectsChecks = [...redirects.proxiTok.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = proxiTokNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) proxiTokNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableTiktok: false,
-
-							tiktokRedirects: redirects,
-
-							proxiTokNormalRedirectsChecks,
-							proxiTokNormalCustomRedirects: [],
-
-							proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor],
-							proxiTokTorCustomRedirects: [],
-
-							proxiTokI2pRedirectsChecks: [...redirects.proxiTok.i2p],
-							proxiTokI2pCustomRedirects: [],
-
-							proxiTokLokiRedirectsChecks: [...redirects.proxiTok.loki],
-							proxiTokLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	redirect,
-	reverse,
-	switchInstance,
-	initProxiTokCookies,
-	initDefaults,
-}
diff --git a/src/assets/javascripts/translate/get_lingva_preferences.js b/src/assets/javascripts/translate/get_lingva_preferences.js
deleted file mode 100644
index 0d6ff6ec..00000000
--- a/src/assets/javascripts/translate/get_lingva_preferences.js
+++ /dev/null
@@ -1,10 +0,0 @@
-window.browser = window.browser || window.chrome
-
-browser.storage.local.set({
-	["lingva_chakra-ui-color-mode"]: localStorage.getItem("chakra-ui-color-mode"),
-	lingva_isauto: localStorage.getItem("isauto"),
-	lingva_source: localStorage.getItem("source"),
-	lingva_target: localStorage.getItem("target"),
-})
-
-console.log(localStorage.getItem("target"))
diff --git a/src/assets/javascripts/translate/set_lingva_preferences.js b/src/assets/javascripts/translate/set_lingva_preferences.js
deleted file mode 100644
index 04a36e1b..00000000
--- a/src/assets/javascripts/translate/set_lingva_preferences.js
+++ /dev/null
@@ -1,9 +0,0 @@
-window.browser = window.browser || window.chrome
-
-browser.storage.local.get(["lingva_chakra-ui-color-mode", "lingva_isauto", "lingva_source", "lingva_target"], r => {
-	if (r["lingva_chakra-ui-color-mode"] !== undefined) localStorage.setItem("chakra-ui-color-mode", r["lingva_chakra-ui-color-mode"])
-	if (r.lingva_isauto !== undefined) localStorage.setItem("isauto", r.lingva_isauto)
-	if (r.lingva_source !== undefined) localStorage.setItem("source", r.lingva_source)
-	if (r.lingva_target !== undefined) localStorage.setItem("target", r.lingva_target)
-	window.close()
-})
diff --git a/src/assets/javascripts/translate/translate.js b/src/assets/javascripts/translate/translate.js
deleted file mode 100644
index 993c630f..00000000
--- a/src/assets/javascripts/translate/translate.js
+++ /dev/null
@@ -1,372 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "../utils.js"
-
-const targets = [/^https?:\/{2}translate\.google(\.[a-z]{2,3}){1,2}\//]
-
-const frontends = new Array("simplyTranslate", "lingva")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-let translateDisable,
-	translateFrontend,
-	protocol,
-	protocolFallback,
-	translateRedirects,
-	simplyTranslateNormalRedirectsChecks,
-	simplyTranslateNormalCustomRedirects,
-	simplyTranslateTorRedirectsChecks,
-	simplyTranslateTorCustomRedirects,
-	simplyTranslateI2pRedirectsChecks,
-	simplyTranslateI2pCustomRedirects,
-	simplyTranslateLokiRedirectsChecks,
-	simplyTranslateLokiCustomRedirects,
-	lingvaNormalRedirectsChecks,
-	lingvaNormalCustomRedirects,
-	lingvaTorRedirectsChecks,
-	lingvaTorCustomRedirects,
-	lingvaI2pCustomRedirects,
-	lingvaLokiCustomRedirects
-
-function init() {
-	return new Promise(resolve => {
-		browser.storage.local.get(
-			[
-				"translateDisable",
-				"translateFrontend",
-				"protocol",
-				"protocolFallback",
-				"translateRedirects",
-				"simplyTranslateNormalRedirectsChecks",
-				"simplyTranslateNormalCustomRedirects",
-				"simplyTranslateTorRedirectsChecks",
-				"simplyTranslateTorCustomRedirects",
-				"simplyTranslateI2pRedirectsChecks",
-				"simplyTranslateI2pCustomRedirects",
-				"simplyTranslateLokiRedirectsChecks",
-				"simplyTranslateLokiCustomRedirects",
-
-				"lingvaNormalRedirectsChecks",
-				"lingvaNormalCustomRedirects",
-				"lingvaTorRedirectsChecks",
-				"lingvaTorCustomRedirects",
-				"lingvaI2pCustomRedirects",
-				"lingvaLokiCustomRedirects",
-			],
-			r => {
-				translateDisable = r.translateDisable
-				translateFrontend = r.translateFrontend
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				translateRedirects = r.translateRedirects
-				simplyTranslateNormalRedirectsChecks = r.simplyTranslateNormalRedirectsChecks
-				simplyTranslateNormalCustomRedirects = r.simplyTranslateNormalCustomRedirects
-				simplyTranslateTorRedirectsChecks = r.simplyTranslateTorRedirectsChecks
-				simplyTranslateTorCustomRedirects = r.simplyTranslateTorCustomRedirects
-				simplyTranslateI2pRedirectsChecks = r.simplyTranslateI2pRedirectsChecks
-				simplyTranslateI2pCustomRedirects = r.simplyTranslateI2pCustomRedirects
-				simplyTranslateLokiRedirectsChecks = r.simplyTranslateLokiRedirectsChecks
-				simplyTranslateLokiCustomRedirects = r.simplyTranslateLokiCustomRedirects
-				lingvaNormalRedirectsChecks = r.lingvaNormalRedirectsChecks
-				lingvaNormalCustomRedirects = r.lingvaNormalCustomRedirects
-				lingvaTorRedirectsChecks = r.lingvaTorRedirectsChecks
-				lingvaTorCustomRedirects = r.lingvaTorCustomRedirects
-				lingvaI2pCustomRedirects = r.lingvaI2pCustomRedirects
-				lingvaLokiCustomRedirects = r.lingvaLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects = val
-		simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal]
-		lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = simplyTranslateNormalCustomRedirects.indexOf(instance)
-			if (a > -1) simplyTranslateNormalCustomRedirects.splice(a, 1)
-
-			const b = lingvaNormalRedirectsChecks.indexOf(instance)
-			if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1)
-		}
-		browser.storage.local.set({
-			translateRedirects: redirects,
-			simplyTranslateNormalRedirectsChecks,
-			simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor],
-			simplyTranslateI2pRedirectsChecks: [...redirects.simplyTranslate.i2p],
-			simplyTranslateLokiRedirectsChecks: [...redirects.simplyTranslate.loki],
-			lingvaNormalRedirectsChecks,
-			lingvaTorRedirectsChecks: [...redirects.lingva.tor],
-			lingvaI2pRedirectsChecks: [...redirects.lingva.i2p],
-			lingvaLokiRedirectsChecks: [...redirects.lingva.loki],
-		})
-	})
-}
-
-function copyPasteLingvaLocalStorage(test, url, tabId) {
-	return new Promise(async resolve => {
-		await init()
-		if (translateDisable || translateFrontend != "lingva") {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (
-			![...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects, ...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects, ...lingvaI2pCustomRedirects, ...lingvaLokiCustomRedirects].includes(
-				protocolHost
-			)
-		) {
-			resolve()
-			return
-		}
-
-		if (!test) {
-			browser.tabs.executeScript(tabId, {
-				file: "/assets/javascripts/translate/get_lingva_preferences.js",
-				runAt: "document_start",
-			})
-
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...lingvaLokiCustomRedirects]
-			//...lingvaLokiRedirectsChecks,
-			else if (protocol == "i2p") checkedInstances = [...lingvaI2pCustomRedirects]
-			//...lingvaI2pRedirectsChecks,
-			else if (protocol == "tor") checkedInstances = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]
-			}
-			const i = checkedInstances.indexOf(protocolHost)
-			if (i !== -1) checkedInstances.splice(i, 1)
-			if (checkedInstances.length === 0) {
-				resolve()
-				return
-			}
-			for (const to of checkedInstances)
-				browser.tabs.create({ url: to }, tab =>
-					browser.tabs.executeScript(tab.id, {
-						file: "/assets/javascripts/translate/set_lingva_preferences.js",
-						runAt: "document_start",
-					})
-				)
-		}
-		resolve(true)
-	})
-}
-
-function copyPasteSimplyTranslateCookies(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(from)
-		if (
-			![
-				...simplyTranslateNormalRedirectsChecks,
-				...simplyTranslateNormalCustomRedirects,
-				...simplyTranslateTorRedirectsChecks,
-				...simplyTranslateTorCustomRedirects,
-				...simplyTranslateI2pRedirectsChecks,
-				...simplyTranslateI2pCustomRedirects,
-				...simplyTranslateLokiRedirectsChecks,
-				...simplyTranslateLokiCustomRedirects,
-			].includes(protocolHost)
-		) {
-			resolve()
-			return
-		}
-		if (!test) {
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...simplyTranslateI2pCustomRedirects, ...simplyTranslateI2pRedirectsChecks]
-			else if (protocol == "tor") checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
-			}
-			await utils.copyCookie("simplyTranslate", from, checkedInstances, "from_lang")
-			await utils.copyCookie("simplyTranslate", from, checkedInstances, "to_lang")
-			await utils.copyCookie("simplyTranslate", from, checkedInstances, "tts_enabled")
-			await utils.copyCookie("simplyTranslate", from, checkedInstances, "use_text_fields")
-		}
-		resolve(true)
-	})
-}
-
-function redirect(url, disableOverride) {
-	if (translateDisable && !disableOverride) return
-	if (!targets.some(rx => rx.test(url.href))) return
-
-	if (translateFrontend == "simplyTranslate") {
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...simplyTranslateI2pRedirectsChecks, ...simplyTranslateI2pCustomRedirects]
-		else if (protocol == "tor") instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
-		}
-		if (instancesList.length === 0) return
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		return `${randomInstance}/${url.search}`
-	} else if (translateFrontend == "lingva") {
-		let params_arr = url.search.split("&")
-		params_arr[0] = params_arr[0].substring(1)
-		let params = {}
-		for (let i = 0; i < params_arr.length; i++) {
-			let pair = params_arr[i].split("=")
-			params[pair[0]] = pair[1]
-		}
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...lingvaLokiCustomRedirects]
-		//...lingvaLokiRedirectsChecks,
-		else if (protocol == "i2p") instancesList = [...lingvaI2pCustomRedirects] //...lingvaI2pRedirectsChecks,
-		if (protocol == "tor") instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]
-		}
-		if (instancesList.length === 0) return
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		if (params.sl && params.tl && params.text) {
-			return `${randomInstance}/${params.sl}/${params.tl}/${params.text}`
-		}
-		return randomInstance
-	}
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (translateDisable && !disableOverride) {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (
-			![
-				...translateRedirects.simplyTranslate.normal,
-				...translateRedirects.simplyTranslate.tor,
-				...translateRedirects.simplyTranslate.i2p,
-				...translateRedirects.simplyTranslate.loki,
-
-				...simplyTranslateNormalCustomRedirects,
-				...simplyTranslateTorCustomRedirects,
-				...simplyTranslateI2pCustomRedirects,
-				...simplyTranslateLokiCustomRedirects,
-
-				...translateRedirects.lingva.normal,
-				...translateRedirects.lingva.tor,
-
-				...lingvaNormalCustomRedirects,
-				...lingvaTorCustomRedirects,
-				...lingvaI2pCustomRedirects,
-				...lingvaLokiCustomRedirects,
-			].includes(protocolHost)
-		) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-
-		if (protocol == "loki") {
-			if (translateFrontend == "simplyTranslate") instancesList = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomRedirects]
-			else if (translateFrontend == "lingva") instancesList = [...lingvaLokiCustomRedirects] //...lingvaLokiRedirectsChecks,
-		} else if (protocol == "i2p") {
-			if (translateFrontend == "simplyTranslate") instancesList = [...simplyTranslateI2pRedirectsChecks, ...simplyTranslateI2pCustomRedirects]
-			else if (translateFrontend == "lingva") instancesList = [...lingvaI2pCustomRedirects] //...lingvaI2pRedirectsChecks,
-		} else if (protocol == "tor") {
-			if (translateFrontend == "simplyTranslate") instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
-			else if (translateFrontend == "lingva") instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]
-		}
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			if (translateFrontend == "simplyTranslate") instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
-			else if (translateFrontend == "lingva") instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(async resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal]
-					lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = simplyTranslateNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) simplyTranslateNormalRedirectsChecks.splice(a, 1)
-
-						const b = lingvaNormalRedirectsChecks.indexOf(instance)
-						if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1)
-					}
-					browser.storage.local.set(
-						{
-							translateDisable: false,
-							translateFrontend: "simplyTranslate",
-							translateRedirects: redirects,
-
-							simplyTranslateNormalRedirectsChecks,
-							simplyTranslateNormalCustomRedirects: [],
-
-							simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor],
-							simplyTranslateTorCustomRedirects: [],
-
-							simplyTranslateI2pRedirectsChecks: [...redirects.simplyTranslate.i2p],
-							simplyTranslateI2pCustomRedirects: [],
-
-							simplyTranslateLokiRedirectsChecks: [...redirects.simplyTranslate.loki],
-							simplyTranslateLokiCustomRedirects: [],
-
-							lingvaNormalRedirectsChecks,
-							lingvaNormalCustomRedirects: [],
-
-							lingvaTorRedirectsChecks: [...redirects.lingva.tor],
-							lingvaTorCustomRedirects: [],
-
-							lingvaI2pRedirectsChecks: [...redirects.lingva.i2p],
-							lingvaI2pCustomRedirects: [],
-
-							lingvaLokiRedirectsChecks: [...redirects.lingva.loki],
-							lingvaLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	copyPasteSimplyTranslateCookies,
-	copyPasteLingvaLocalStorage,
-	setRedirects,
-	redirect,
-	initDefaults,
-	switchInstance,
-}
diff --git a/src/assets/javascripts/twitter.js b/src/assets/javascripts/twitter.js
deleted file mode 100644
index 7111ad00..00000000
--- a/src/assets/javascripts/twitter.js
+++ /dev/null
@@ -1,268 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}(www\.|mobile\.|)twitter\.com/, /^https?:\/{2}(pbs\.|video\.|)twimg\.com/, /^https?:\/{2}platform\.twitter\.com\/embed/, /^https?:\/{2}t\.co/]
-
-const frontends = new Array("nitter")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList", "offlineBlackList"], r => {
-		redirects.nitter = val
-		nitterNormalRedirectsChecks = [...redirects.nitter.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList, ...r.offlineBlackList]) {
-			let i = nitterNormalRedirectsChecks.indexOf(instance)
-			if (i > -1) nitterNormalRedirectsChecks.splice(i, 1)
-		}
-		browser.storage.local.set({
-			twitterRedirects: redirects,
-			nitterNormalRedirectsChecks,
-			nitterTorRedirectsChecks: [...redirects.nitter.tor],
-			nitterI2pRedirectsChecks: [...redirects.nitter.i2p],
-			nitterLokiRedirectsChecks: [...redirects.nitter.loki],
-		})
-	})
-}
-
-let disableTwitter,
-	protocol,
-	protocolFallback,
-	twitterRedirects,
-	twitterRedirectType,
-	nitterNormalRedirectsChecks,
-	nitterNormalCustomRedirects,
-	nitterTorRedirectsChecks,
-	nitterTorCustomRedirects,
-	nitterI2pCustomRedirects,
-	nitterLokiCustomRedirects
-
-function init() {
-	return new Promise(async resolve => {
-		browser.storage.local.get(
-			[
-				"disableTwitter",
-				"protocol",
-				"protocolFallback",
-				"twitterRedirects",
-				"twitterRedirectType",
-				"nitterNormalRedirectsChecks",
-				"nitterNormalCustomRedirects",
-				"nitterTorRedirectsChecks",
-				"nitterTorCustomRedirects",
-				"nitterI2pCustomRedirects",
-				"nitterLokiCustomRedirects",
-			],
-			r => {
-				disableTwitter = r.disableTwitter
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				twitterRedirects = r.twitterRedirects
-				twitterRedirectType = r.twitterRedirectType
-				nitterNormalRedirectsChecks = r.nitterNormalRedirectsChecks
-				nitterNormalCustomRedirects = r.nitterNormalCustomRedirects
-				nitterTorRedirectsChecks = r.nitterTorRedirectsChecks
-				nitterTorCustomRedirects = r.nitterTorCustomRedirects
-				nitterI2pCustomRedirects = r.nitterI2pCustomRedirects
-				nitterLokiCustomRedirects = r.nitterLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
-	return [...nitterNormalRedirectsChecks, ...nitterTorRedirectsChecks, ...nitterNormalCustomRedirects, ...nitterTorCustomRedirects, ...nitterI2pCustomRedirects, ...nitterLokiCustomRedirects]
-}
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disableTwitter && !disableOverride) return
-	if (!targets.some(rx => rx.test(url.href))) return
-	if (url.pathname.split("/").includes("home")) return
-	if (initiator && all().includes(initiator.origin)) return "BYPASSTAB"
-	if (twitterRedirectType == "sub_frame" && type == "main_frame") return
-	if (twitterRedirectType == "main_frame" && type != "main_frame") return
-
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...nitterI2pCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...nitterLokiCustomRedirects]
-	else if (protocol == "tor") instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) return
-
-	const randomInstance = utils.getRandomInstance(instancesList)
-	// https://pbs.twimg.com/profile_images/648888480974508032/66_cUYfj_400x400.jpg
-	if (url.host.split(".")[0] === "pbs" || url.host.split(".")[0] === "video") {
-		const [, id, format, extra] = url.search.match(/(.*)\?format=(.*)&(.*)/)
-		const query = encodeURIComponent(`${id}.${format}?${extra}`)
-		return `${randomInstance}/pic${url.pathname}${query}`
-	} else if (url.pathname.split("/").includes("tweets")) return `${randomInstance}${url.pathname.replace("/tweets", "")}${url.search}`
-	else if (url.host == "t.co") return `${randomInstance}/t.co${url.pathname}`
-	else return `${randomInstance}${url.pathname}${url.search}`
-}
-
-function reverse(url) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-		resolve(`https://twitter.com${url.pathname}${url.search}`)
-	})
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableTwitter && !disableOverride) {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...nitterI2pCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...nitterLokiCustomRedirects]
-		else if (protocol == "tor") instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
-		}
-
-		let index = instancesList.indexOf(protocolHost)
-		if (index > -1) instancesList.splice(index, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function removeXFrameOptions(e) {
-	if (e.type != "sub_frame") return
-	let url = new URL(e.url)
-	let protocolHost = utils.protocolHost(url)
-	if (!all().includes(protocolHost)) return
-	let isChanged = false
-	for (const i in e.responseHeaders) {
-		if (e.responseHeaders[i].name == "x-frame-options") {
-			e.responseHeaders.splice(i, 1)
-			isChanged = true
-		} else if (e.responseHeaders[i].name == "content-security-policy") {
-			e.responseHeaders.splice(i, 1)
-			isChanged = true
-		}
-	}
-	if (isChanged) return { responseHeaders: e.responseHeaders }
-}
-
-function initNitterCookies(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(from)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-		if (!test) {
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...nitterI2pCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...nitterLokiCustomRedirects]
-			else if (protocol == "tor") checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
-			}
-			await utils.copyCookie("nitter", from, checkedInstances, "theme")
-			await utils.copyCookie("nitter", from, checkedInstances, "infiniteScroll")
-			await utils.copyCookie("nitter", from, checkedInstances, "stickyProfile")
-			await utils.copyCookie("nitter", from, checkedInstances, "bidiSupport")
-			await utils.copyCookie("nitter", from, checkedInstances, "hideTweetStats")
-			await utils.copyCookie("nitter", from, checkedInstances, "hideBanner")
-			await utils.copyCookie("nitter", from, checkedInstances, "hidePins")
-			await utils.copyCookie("nitter", from, checkedInstances, "hideReplies")
-			await utils.copyCookie("nitter", from, checkedInstances, "squareAvatars")
-			await utils.copyCookie("nitter", from, checkedInstances, "mp4Playback")
-			await utils.copyCookie("nitter", from, checkedInstances, "hlsPlayback")
-			await utils.copyCookie("nitter", from, checkedInstances, "proxyVideos")
-			await utils.copyCookie("nitter", from, checkedInstances, "muteVideos")
-			await utils.copyCookie("nitter", from, checkedInstances, "autoplayGifs")
-
-			await utils.copyCookie("nitter", from, checkedInstances, "replaceInstagram")
-			await utils.copyCookie("nitter", from, checkedInstances, "replaceReddit")
-			await utils.copyCookie("nitter", from, checkedInstances, "replaceTwitter")
-			await utils.copyCookie("nitter", from, checkedInstances, "replaceYouTube")
-		}
-		resolve(true)
-	})
-}
-
-function initDefaults() {
-	return new Promise(resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList", "offlineBlackList"], async r => {
-					nitterNormalRedirectsChecks = [...redirects.nitter.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList, ...r.offlineBlackList]) {
-						let i = nitterNormalRedirectsChecks.indexOf(instance)
-						if (i > -1) nitterNormalRedirectsChecks.splice(i, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableTwitter: false,
-							twitterRedirects: redirects,
-							twitterRedirectType: "both",
-
-							nitterNormalRedirectsChecks,
-							nitterNormalCustomRedirects: [],
-
-							nitterTorRedirectsChecks: [...redirects.nitter.tor],
-							nitterTorCustomRedirects: [],
-
-							nitterI2pRedirectsChecks: [...redirects.nitter.i2p],
-							nitterI2pCustomRedirects: [],
-
-							nitterLokiRedirectsChecks: [...redirects.nitter.loki],
-							nitterLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	redirect,
-	switchInstance,
-	reverse,
-	removeXFrameOptions,
-	initNitterCookies,
-	initDefaults,
-}
diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js
index 70a93240..186fae43 100644
--- a/src/assets/javascripts/utils.js
+++ b/src/assets/javascripts/utils.js
@@ -1,22 +1,5 @@
 window.browser = window.browser || window.chrome
-import twitterHelper from "./twitter.js"
-import youtubeHelper from "./youtube/youtube.js"
-import instagramHelper from "./instagram.js"
-import mediumHelper from "./medium.js"
-import redditHelper from "./reddit.js"
-import searchHelper from "./search.js"
-import translateHelper from "./translate/translate.js"
-import wikipediaHelper from "./wikipedia.js"
-import peertubeHelper from "./peertube.js"
-import lbryHelper from "./lbry.js"
-import sendTargetsHelper from "./sendTargets.js"
-import tiktokHelper from "./tiktok.js"
-import quoraHelper from "./quora.js"
-import libremdbHelper from "./imdb.js"
-import imgurHelper from "./imgur.js"
-import reutersHelper from "./reuters.js"
-import youtubeMusicHelper from "./youtubeMusic.js"
-import mapsHelper from "./maps.js"
+
 import localise from "./localise.js"
 import servicesHelper from "./services.js"
 
@@ -48,10 +31,10 @@ function updateInstances() {
 	return new Promise(async resolve => {
 		let http = new XMLHttpRequest()
 		let fallback = new XMLHttpRequest()
-		http.open("GET", "https://raw.githubusercontent.com/libredirect/libredirect/master/src/instances/data.json", false)
+		http.open("GET", "https://codeberg.org/LibRedirect/libredirect/raw/branch/master/src/instances/data.json", false)
 		http.send(null)
 		if (http.status != 200) {
-			fallback.open("GET", "https://codeberg.org/LibRedirect/libredirect/raw/branch/master/src/instances/data.json", false)
+			fallback.open("GET", "https://raw.githubusercontent.com/libredirect/libredirect/master/src/instances/data.json", false)
 			fallback.send(null)
 			if (fallback.status === 200) {
 				http = fallback
@@ -63,42 +46,7 @@ function updateInstances() {
 		await initBlackList()
 		const instances = JSON.parse(http.responseText)
 
-		youtubeHelper.setRedirects({
-			invidious: instances.invidious,
-			piped: instances.piped,
-			pipedMaterial: instances.pipedMaterial,
-			cloudtube: instances.cloudtube,
-		})
-		twitterHelper.setRedirects(instances.nitter)
-		instagramHelper.setRedirects(instances.bibliogram)
-		redditHelper.setRedirects({
-			libreddit: instances.libreddit,
-			teddit: instances.teddit,
-		})
-		translateHelper.setRedirects({
-			simplyTranslate: instances.simplyTranslate,
-			lingva: instances.lingva,
-		})
-		searchHelper.setRedirects({
-			searx: instances.searx,
-			searxng: instances.searxng,
-			whoogle: instances.whoogle,
-			librex: instances.librex,
-		})
-		wikipediaHelper.setRedirects(instances.wikiless)
-		mediumHelper.setRedirects(instances.scribe)
-		quoraHelper.setRedirects(instances.quetre)
-		libremdbHelper.setRedirects(instances.libremdb)
-		sendTargetsHelper.setRedirects(instances.send)
-		tiktokHelper.setRedirects(instances.proxiTok)
-		lbryHelper.setRedirects(instances.librarian)
-		reutersHelper.setRedirects(instances.neuters)
-		youtubeMusicHelper.setRedirects({
-			beatbump: instances.beatbump,
-			hyperpipe: instances.hyperpipe,
-		})
-		mapsHelper.setRedirects(instances.facil)
-		peertubeHelper.setRedirects(instances.simpleertube)
+		servicesHelper.setRedirects(instances)
 
 		console.info("Successfully updated Instances")
 		resolve(true)
diff --git a/src/assets/javascripts/wikipedia.js b/src/assets/javascripts/wikipedia.js
deleted file mode 100644
index 2d0f75a1..00000000
--- a/src/assets/javascripts/wikipedia.js
+++ /dev/null
@@ -1,242 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = /^https?:\/{2}([a-z]+\.)*wikipedia\.org/
-
-const frontends = new Array("wikiless")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects.wikiless = val
-		wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = wikilessNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1)
-		}
-		browser.storage.local.set({
-			wikipediaRedirects: redirects,
-			wikilessNormalRedirectsChecks,
-			wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
-			wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p],
-			wikilessLokiRedirectsChecks: [...redirects.wikiless.loki],
-		})
-	})
-}
-
-let disableWikipedia,
-	wikipediaRedirects,
-	protocol,
-	protocolFallback,
-	wikilessNormalRedirectsChecks,
-	wikilessTorRedirectsChecks,
-	wikilessI2pRedirectsChecks,
-	wikilessNormalCustomRedirects,
-	wikilessTorCustomRedirects,
-	wikilessI2pCustomRedirects,
-	wikilessLokiCustomRedirects
-
-function init() {
-	return new Promise(async resolve => {
-		browser.storage.local.get(
-			[
-				"disableWikipedia",
-				"wikipediaRedirects",
-				"protocol",
-				"protocolFallback",
-				"wikilessNormalRedirectsChecks",
-				"wikilessTorRedirectsChecks",
-				"wikilessI2pRedirectsChecks",
-				"wikilessNormalCustomRedirects",
-				"wikilessTorCustomRedirects",
-				"wikilessI2pCustomRedirects",
-				"wikilessLokiCustomRedirects",
-			],
-			r => {
-				disableWikipedia = r.disableWikipedia
-				wikipediaRedirects = r.wikipediaRedirects
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				wikilessNormalRedirectsChecks = r.wikilessNormalRedirectsChecks
-				wikilessTorRedirectsChecks = r.wikilessTorRedirectsChecks
-				wikilessI2pRedirectsChecks = r.wikilessI2pRedirectsChecks
-				wikilessNormalCustomRedirects = r.wikilessNormalCustomRedirects
-				wikilessTorCustomRedirects = r.wikilessTorCustomRedirects
-				wikilessI2pCustomRedirects = r.wikilessI2pCustomRedirects
-				wikilessLokiCustomRedirects = r.wikilessLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function initWikilessCookies(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(from)
-		const all = [
-			...wikilessNormalRedirectsChecks,
-			...wikilessNormalCustomRedirects,
-			...wikilessTorRedirectsChecks,
-			...wikilessTorCustomRedirects,
-			...wikilessI2pRedirectsChecks,
-			...wikilessI2pCustomRedirects,
-			...wikilessLokiCustomRedirects,
-		]
-		if (!all.includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		if (!test) {
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...wikilessLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]
-			else if (protocol == "tor") checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
-			}
-			await utils.copyCookie("wikiless", from, checkedInstances, "theme")
-			await utils.copyCookie("wikiless", from, checkedInstances, "default_lang")
-		}
-		resolve(true)
-	})
-}
-
-function redirect(url, disableOverride) {
-	if (disableWikipedia && !disableOverride) return
-	if (!targets.test(url.href)) return
-
-	let GETArguments = []
-	if (url.search.length > 0) {
-		let search = url.search.substring(1) //get rid of '?'
-		let argstrings = search.split("&")
-		for (let i = 0; i < argstrings.length; i++) {
-			let args = argstrings[i].split("=")
-			GETArguments.push([args[0], args[1]])
-		}
-	}
-	let instancesList = []
-	if (protocol == "loki") instancesList = [...wikilessLokiCustomRedirects]
-	else if (protocol == "i2p") instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]
-	else if (protocol == "tor") instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
-	if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-		instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
-	}
-	if (instancesList.length === 0) return
-	const randomInstance = utils.getRandomInstance(instancesList)
-
-	let link = `${randomInstance}${url.pathname}`
-	let urlSplit = url.host.split(".")
-	if (urlSplit[0] != "wikipedia" && urlSplit[0] != "www") {
-		if (urlSplit[0] == "m") GETArguments.push(["mobileaction", "toggle_view_mobile"])
-		else GETArguments.push(["lang", urlSplit[0]])
-		if (urlSplit[1] == "m") GETArguments.push(["mobileaction", "toggle_view_mobile"])
-		// wikiless doesn't have mobile view support yet
-	}
-	for (let i = 0; i < GETArguments.length; i++) link += (i == 0 ? "?" : "&") + GETArguments[i][0] + "=" + GETArguments[i][1]
-	return link
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableWikipedia && !disableOverride) {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		const wikipediaList = [
-			...wikipediaRedirects.wikiless.normal,
-			...wikipediaRedirects.wikiless.tor,
-			...wikipediaRedirects.wikiless.i2p,
-
-			...wikilessNormalCustomRedirects,
-			...wikilessTorCustomRedirects,
-			...wikilessI2pCustomRedirects,
-			...wikilessLokiCustomRedirects,
-		]
-		if (!wikipediaList.includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-		if (protocol == "loki") instancesList = [...wikilessLokiCustomRedirects]
-		else if (protocol == "i2p") instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]
-		else if (protocol == "tor") instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
-		}
-
-		let index = instancesList.indexOf(protocolHost)
-		if (index > -1) instancesList.splice(index, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = wikilessNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableWikipedia: true,
-							wikipediaRedirects: redirects,
-
-							wikilessNormalRedirectsChecks,
-							wikilessNormalCustomRedirects: [],
-
-							wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
-							wikilessTorCustomRedirects: [],
-
-							wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p],
-							wikilessI2pCustomRedirects: [],
-
-							wikilessLokiRedirectsChecks: [...redirects.wikiless.loki],
-							wikilessLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	initWikilessCookies,
-	redirect,
-	initDefaults,
-	switchInstance,
-}
diff --git a/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js b/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js
deleted file mode 100644
index df79e13c..00000000
--- a/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js
+++ /dev/null
@@ -1,5 +0,0 @@
-window.browser = window.browser || window.chrome
-
-browser.storage.local.set({
-	pipedMaterial_PREFERENCES: localStorage.getItem("PREFERENCES"),
-})
diff --git a/src/assets/javascripts/youtube/get_piped_preferences.js b/src/assets/javascripts/youtube/get_piped_preferences.js
deleted file mode 100644
index 388ecd19..00000000
--- a/src/assets/javascripts/youtube/get_piped_preferences.js
+++ /dev/null
@@ -1,22 +0,0 @@
-window.browser = window.browser || window.chrome
-
-browser.storage.local.set({
-	piped_bufferGoal: localStorage.getItem("bufferGoal"),
-	piped_comments: localStorage.getItem("comments"),
-	piped_disableLBRY: localStorage.getItem("disableLBRY"),
-	piped_enabledCodecs: localStorage.getItem("enabledCodecs"),
-	piped_hl: localStorage.getItem("hl"),
-	piped_homepage: localStorage.getItem("homepage"),
-	piped_instance: localStorage.getItem("instance"),
-	piped_listen: localStorage.getItem("listen"),
-	piped_minimizeDescription: localStorage.getItem("minimizeDescription"),
-	piped_playerAutoPlay: localStorage.getItem("playerAutoPlay"),
-	piped_proxyLBRY: localStorage.getItem("proxyLBRY"),
-	piped_quality: localStorage.getItem("quality"),
-	piped_region: localStorage.getItem("region"),
-	piped_selectedSkip: localStorage.getItem("selectedSkip"),
-	piped_sponsorblock: localStorage.getItem("sponsorblock"),
-	piped_theme: localStorage.getItem("theme"),
-	piped_volume: localStorage.getItem("volume"),
-	piped_watchHistory: localStorage.getItem("watchHistory"),
-})
diff --git a/src/assets/javascripts/youtube/set_pipedMaterial_preferences.js b/src/assets/javascripts/youtube/set_pipedMaterial_preferences.js
deleted file mode 100644
index 59d6dcc4..00000000
--- a/src/assets/javascripts/youtube/set_pipedMaterial_preferences.js
+++ /dev/null
@@ -1,7 +0,0 @@
-window.browser = window.browser || window.chrome
-
-browser.storage.local.get("pipedMaterial_PREFERENCES", r => {
-	if (r.pipedMaterial_PREFERENCES !== undefined) localStorage.setItem("PREFERENCES", r.pipedMaterial_PREFERENCES)
-
-	window.close()
-})
diff --git a/src/assets/javascripts/youtube/set_piped_preferences.js b/src/assets/javascripts/youtube/set_piped_preferences.js
deleted file mode 100644
index 374f2d61..00000000
--- a/src/assets/javascripts/youtube/set_piped_preferences.js
+++ /dev/null
@@ -1,45 +0,0 @@
-window.browser = window.browser || window.chrome
-
-browser.storage.local.get(
-	[
-		"piped_bufferGoal",
-		"piped_comments",
-		"piped_disableLBRY",
-		"piped_enabledCodecs",
-		"piped_homepage",
-		"piped_instance",
-		"piped_listen",
-		"piped_minimizeDescription",
-		"piped_playerAutoPlay",
-		"piped_proxyLBRY",
-		"piped_quality",
-		"piped_region",
-		"piped_selectedSkip",
-		"piped_sponsorblock",
-		"piped_theme",
-		"piped_volume",
-		"piped_watchHistory",
-	],
-	r => {
-		if (r.piped_bufferGoal !== undefined) localStorage.setItem("bufferGoal", r.piped_bufferGoal)
-		if (r.piped_comments !== undefined) localStorage.setItem("comments", r.piped_comments)
-		if (r.piped_disableLBRY !== undefined) localStorage.setItem("disableLBRY", r.piped_disableLBRY)
-		if (r.piped_hl !== undefined) localStorage.setItem("hl", r.piped_hl)
-		if (r.piped_enabledCodecs !== undefined) localStorage.setItem("enabledCodecs", r.piped_enabledCodecs)
-		if (r.piped_homepage !== undefined) localStorage.setItem("homepage", r.piped_homepage)
-		if (r.piped_instance !== undefined) localStorage.setItem("instance", r.piped_instance)
-		if (r.piped_listen !== undefined) localStorage.setItem("listen", r.piped_listen)
-		if (r.piped_minimizeDescription !== undefined) localStorage.setItem("minimizeDescription", r.piped_minimizeDescription)
-		if (r.piped_playerAutoPlay !== undefined) localStorage.setItem("playerAutoPlay", r.piped_playerAutoPlay)
-		if (r.piped_proxyLBRY !== undefined) localStorage.setItem("proxyLBRY", r.piped_proxyLBRY)
-		if (r.piped_quality !== undefined) localStorage.setItem("quality", r.piped_quality)
-		if (r.piped_region !== undefined) localStorage.setItem("region", r.piped_region)
-		if (r.piped_selectedSkip !== undefined) localStorage.setItem("selectedSkip", r.piped_selectedSkip)
-		if (r.piped_sponsorblock !== undefined) localStorage.setItem("sponsorblock", r.piped_sponsorblock)
-		if (r.piped_theme !== undefined) localStorage.setItem("theme", r.piped_theme)
-		if (r.piped_volume !== undefined) localStorage.setItem("volume", r.piped_volume)
-		if (r.piped_watchHistory !== undefined) localStorage.setItem("watchHistory", r.piped_watchHistory)
-
-		window.close()
-	}
-)
diff --git a/src/assets/javascripts/youtube/youtube.js b/src/assets/javascripts/youtube/youtube.js
deleted file mode 100644
index 32f06b9c..00000000
--- a/src/assets/javascripts/youtube/youtube.js
+++ /dev/null
@@ -1,792 +0,0 @@
-"use strict"
-
-window.browser = window.browser || window.chrome
-
-import utils from "../utils.js"
-
-const targets = [
-	/^https?:\/{2}(www\.|music\.|m\.|)youtube\.com(\/.*|$)/,
-
-	/^https?:\/{2}img\.youtube\.com\/vi\/.*\/..*/, // https://stackoverflow.com/questions/2068344/how-do-i-get-a-youtube-video-thumbnail-from-the-youtube-api
-	/^https?:\/{2}(i|s)\.ytimg\.com\/vi\/.*\/..*/,
-
-	/^https?:\/{2}(www\.|music\.|)youtube\.com\/watch\?v\=..*/,
-
-	/^https?:\/{2}youtu\.be\/..*/,
-
-	/^https?:\/{2}(www\.|)(youtube|youtube-nocookie)\.com\/embed\/..*/,
-]
-
-const frontends = new Array("invidious", "piped", "pipedMaterial", "cloudtube")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects = val
-		invidiousNormalRedirectsChecks = [...redirects.invidious.normal]
-		pipedNormalRedirectsChecks = [...redirects.piped.normal]
-		pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]
-		cloudtubeNormalRedirectsChecks = [...redirects.cloudtube.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = invidiousNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1)
-
-			const b = pipedNormalRedirectsChecks.indexOf(instance)
-			if (b > -1) pipedNormalRedirectsChecks.splice(b, 1)
-
-			const c = pipedMaterialNormalRedirectsChecks.indexOf(instance)
-			if (c > -1) pipedMaterialNormalRedirectsChecks.splice(c, 1)
-
-			const d = cloudtubeNormalRedirectsChecks.indexOf(instance)
-			if (c > -1) cloudtubeNormalRedirectsChecks.splice(d, 1)
-		}
-		browser.storage.local.set({
-			youtubeRedirects: redirects,
-			invidiousNormalRedirectsChecks,
-			invidiousTorRedirectsChecks: [...redirects.invidious.tor],
-			invidiousI2pRedirectsChecks: [...redirects.invidious.i2p],
-			invidiousLokiRedirectsChecks: [...redirects.invidious.loki],
-			pipedNormalRedirectsChecks,
-			pipedTorRedirectsChecks: [...redirects.piped.tor],
-			pipedI2pRedirectsChecks: [...redirects.piped.i2p],
-			pipedLokiRedirectsChecks: [...redirects.piped.loki],
-			pipedMaterialNormalRedirectsChecks,
-			pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor],
-			pipedMaterialI2pRedirectsChecks: [...redirects.pipedMaterial.i2p],
-			pipedMaterialLokiRedirectsChecks: [...redirects.pipedMaterial.loki],
-			cloudtubeNormalRedirectsChecks,
-			cloudtubeTorRedirectsChecks: [...redirects.cloudtube.tor],
-			cloudtubeI2pRedirectsChecks: [...redirects.cloudtube.i2p],
-			cloudtubeLokiRedirectsChecks: [...redirects.cloudtube.loki],
-		})
-	})
-}
-
-let disableYoutube,
-	onlyEmbeddedVideo,
-	youtubeFrontend,
-	protocol,
-	protocolFallback,
-	youtubeEmbedFrontend,
-	youtubeRedirects,
-	invidiousNormalRedirectsChecks,
-	invidiousNormalCustomRedirects,
-	invidiousTorRedirectsChecks,
-	invidiousTorCustomRedirects,
-	invidiousI2pRedirectsChecks,
-	invidiousI2pCustomRedirects,
-	invidiousLokiRedirectsChecks,
-	invidiousLokiCustomRedirects,
-	pipedNormalRedirectsChecks,
-	pipedNormalCustomRedirects,
-	pipedTorRedirectsChecks,
-	pipedTorCustomRedirects,
-	pipedI2pRedirectsChecks,
-	pipedI2pCustomRedirects,
-	pipedLokiRedirectsChecks,
-	pipedLokiCustomRedirects,
-	pipedMaterialNormalRedirectsChecks,
-	pipedMaterialNormalCustomRedirects,
-	pipedMaterialTorRedirectsChecks,
-	pipedMaterialTorCustomRedirects,
-	pipedMaterialI2pRedirectsChecks,
-	pipedMaterialI2pCustomRedirects,
-	pipedMaterialLokiRedirectsChecks,
-	pipedMaterialLokiCustomRedirects,
-	cloudtubeNormalRedirectsChecks,
-	cloudtubeNormalCustomRedirects,
-	cloudtubeTorRedirectsChecks,
-	cloudtubeTorCustomRedirects,
-	cloudtubeI2pRedirectsChecks,
-	cloudtubeI2pCustomRedirects,
-	cloudtubeLokiRedirectsChecks,
-	cloudtubeLokiCustomRedirects
-
-function init() {
-	return new Promise(resolve => {
-		browser.storage.local.get(
-			[
-				"disableYoutube",
-				"onlyEmbeddedVideo",
-				"youtubeFrontend",
-				"protocol",
-				"protocolFallback",
-				"youtubeEmbedFrontend",
-				"youtubeRedirects",
-				"invidiousNormalRedirectsChecks",
-				"invidiousNormalCustomRedirects",
-				"invidiousTorRedirectsChecks",
-				"invidiousTorCustomRedirects",
-				"invidiousI2pRedirectsChecks",
-				"invidiousI2pCustomRedirects",
-				"invidiousLokiRedirectsChecks",
-				"invidiousLokiCustomRedirects",
-				"pipedNormalRedirectsChecks",
-				"pipedNormalCustomRedirects",
-				"pipedTorRedirectsChecks",
-				"pipedTorCustomRedirects",
-				"pipedI2pRedirectsChecks",
-				"pipedI2pCustomRedirects",
-				"pipedLokiRedirectsChecks",
-				"pipedLokiCustomRedirects",
-				"pipedMaterialNormalRedirectsChecks",
-				"pipedMaterialNormalCustomRedirects",
-				"pipedMaterialTorRedirectsChecks",
-				"pipedMaterialTorCustomRedirects",
-				"pipedMaterialI2pRedirectsChecks",
-				"pipedMaterialI2pCustomRedirects",
-				"pipedMaterialLokiRedirectsChecks",
-				"pipedMaterialLokiCustomRedirects",
-				"cloudtubeNormalRedirectsChecks",
-				"cloudtubeNormalCustomRedirects",
-				"cloudtubeTorRedirectsChecks",
-				"cloudtubeTorCustomRedirects",
-				"cloudtubeI2pRedirectsChecks",
-				"cloudtubeI2pCustomRedirects",
-				"cloudtubeLokiRedirectsChecks",
-				"cloudtubeLokiCustomRedirects",
-			],
-			r => {
-				disableYoutube = r.disableYoutube
-				onlyEmbeddedVideo = r.onlyEmbeddedVideo
-				youtubeFrontend = r.youtubeFrontend
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				youtubeEmbedFrontend = r.youtubeEmbedFrontend
-				youtubeRedirects = r.youtubeRedirects
-				invidiousNormalRedirectsChecks = r.invidiousNormalRedirectsChecks
-				invidiousNormalCustomRedirects = r.invidiousNormalCustomRedirects
-				invidiousTorRedirectsChecks = r.invidiousTorRedirectsChecks
-				invidiousTorCustomRedirects = r.invidiousTorCustomRedirects
-				invidiousI2pRedirectsChecks = r.invidiousI2pRedirectsChecks
-				invidiousI2pCustomRedirects = r.invidiousI2pCustomRedirects
-				invidiousLokiRedirectsChecks = r.invidiousLokiRedirectsChecks
-				invidiousLokiCustomRedirects = r.invidiousLokiCustomRedirects
-				pipedNormalRedirectsChecks = r.pipedNormalRedirectsChecks
-				pipedNormalCustomRedirects = r.pipedNormalCustomRedirects
-				pipedTorRedirectsChecks = r.pipedTorRedirectsChecks
-				pipedTorCustomRedirects = r.pipedTorCustomRedirects
-				pipedI2pRedirectsChecks = r.pipedI2pRedirectsChecks
-				pipedI2pCustomRedirects = r.pipedI2pCustomRedirects
-				pipedLokiRedirectsChecks = r.pipedLokiRedirectsChecks
-				pipedLokiCustomRedirects = r.pipedLokiCustomRedirects
-				pipedMaterialNormalRedirectsChecks = r.pipedMaterialNormalRedirectsChecks
-				pipedMaterialNormalCustomRedirects = r.pipedMaterialNormalCustomRedirects
-				pipedMaterialTorRedirectsChecks = r.pipedMaterialTorRedirectsChecks
-				pipedMaterialTorCustomRedirects = r.pipedMaterialTorCustomRedirects
-				pipedMaterialI2pRedirectsChecks = r.pipedMaterialI2pRedirectsChecks
-				pipedMaterialI2pCustomRedirects = r.pipedMaterialI2pCustomRedirects
-				pipedMaterialLokiRedirectsChecks = r.pipedMaterialLokiRedirectsChecks
-				pipedMaterialLokiCustomRedirects = r.pipedMaterialLokiCustomRedirects
-				cloudtubeNormalRedirectsChecks = r.cloudtubeNormalRedirectsChecks
-				cloudtubeNormalCustomRedirects = r.cloudtubeNormalCustomRedirects
-				cloudtubeTorRedirectsChecks = r.cloudtubeTorRedirectsChecks
-				cloudtubeTorCustomRedirects = r.cloudtubeTorCustomRedirects
-				cloudtubeI2pRedirectsChecks = r.cloudtubeI2pRedirectsChecks
-				cloudtubeI2pCustomRedirects = r.cloudtubeI2pCustomRedirects
-				cloudtubeLokiRedirectsChecks = r.cloudtubeLokiRedirectsChecks
-				cloudtubeLokiCustomRedirects = r.cloudtubeLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
-	return [
-		...youtubeRedirects.invidious.normal,
-		...youtubeRedirects.invidious.tor,
-		...youtubeRedirects.invidious.i2p,
-		...youtubeRedirects.invidious.loki,
-
-		...youtubeRedirects.piped.normal,
-		...youtubeRedirects.piped.tor,
-		...youtubeRedirects.piped.i2p,
-		...youtubeRedirects.piped.loki,
-
-		...youtubeRedirects.pipedMaterial.normal,
-		...youtubeRedirects.pipedMaterial.tor,
-		...youtubeRedirects.pipedMaterial.i2p,
-		...youtubeRedirects.pipedMaterial.loki,
-
-		...youtubeRedirects.cloudtube.normal,
-		...youtubeRedirects.cloudtube.tor,
-		...youtubeRedirects.cloudtube.i2p,
-		...youtubeRedirects.cloudtube.loki,
-
-		...invidiousNormalCustomRedirects,
-		...invidiousTorCustomRedirects,
-		...invidiousI2pCustomRedirects,
-		...invidiousLokiCustomRedirects,
-
-		...pipedNormalCustomRedirects,
-		...pipedTorCustomRedirects,
-		...pipedI2pCustomRedirects,
-		...pipedLokiCustomRedirects,
-
-		...pipedMaterialNormalCustomRedirects,
-		...pipedMaterialTorCustomRedirects,
-		...pipedMaterialI2pCustomRedirects,
-		...pipedMaterialLokiCustomRedirects,
-
-		...cloudtubeNormalCustomRedirects,
-		...cloudtubeTorCustomRedirects,
-		...cloudtubeI2pCustomRedirects,
-		...cloudtubeLokiCustomRedirects,
-	]
-}
-
-function calculateFrontend(type) {
-	switch (type) {
-		case "main_frame":
-			return youtubeFrontend
-		case "sub_frame":
-			return youtubeEmbedFrontend
-	}
-}
-
-function getInstanceList(type) {
-	let instancesList = []
-	switch (calculateFrontend(type)) {
-		case "invidious":
-			switch (protocol) {
-				case "loki":
-					instancesList = [...invidiousLokiRedirectsChecks, ...invidiousLokiCustomRedirects]
-					break
-				case "i2p":
-					instancesList = [...invidiousI2pRedirectsChecks, ...invidiousI2pCustomRedirects]
-					break
-				case "tor":
-					instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
-			}
-			if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-				instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
-			}
-			break
-		case "piped":
-			switch (protocol) {
-				case "loki":
-					instancesList = [...pipedLokiRedirectsChecks, ...pipedLokiCustomRedirects]
-					break
-				case "i2p":
-					instancesList = [...pipedI2pRedirectsChecks, ...pipedI2pCustomRedirects]
-					break
-				case "tor":
-					instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
-			}
-			if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-				instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects]
-			}
-			break
-		case "pipedMaterial":
-			switch (protocol) {
-				case "loki":
-					instancesList = [...pipedMaterialLokiRedirectsChecks, ...pipedMaterialLokiCustomRedirects]
-					break
-				case "i2p":
-					instancesList = [...pipedMaterialI2pRedirectsChecks, ...pipedMaterialI2pCustomRedirects]
-					break
-				case "tor":
-					instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
-			}
-			if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-				instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
-			}
-		case "cloudtube":
-			switch (protocol) {
-				case "loki":
-					instancesList = [...cloudtubeLokiRedirectsChecks, ...cloudtubeLokiCustomRedirects]
-					break
-				case "i2p":
-					instancesList = [...cloudtubeI2pRedirectsChecks, ...cloudtubeI2pCustomRedirects]
-					break
-				case "tor":
-					instancesList = [...cloudtubeTorRedirectsChecks, ...cloudtubeTorCustomRedirects]
-			}
-			if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-				instancesList = [...cloudtubeNormalRedirectsChecks, ...cloudtubeNormalCustomRedirects]
-			}
-	}
-	return instancesList
-}
-
-function redirect(url, type, initiator, disableOverride) {
-	if (disableYoutube && !disableOverride) return
-	if (!targets.some(rx => rx.test(url.href))) return
-	if (initiator && all().includes(initiator.origin)) return "BYPASSTAB"
-
-	if (type != ("main_frame" || "sub_frame")) return
-	if (url.pathname.match(/iframe_api/) || url.pathname.match(/www-widgetapi/)) return // Don't redirect YouTube Player API.
-	if (onlyEmbeddedVideo == "onlyEmbedded" && type == "main_frame") return
-	if (onlyEmbeddedVideo == "onlyNotEmbedded" && type == "sub_frame") return
-
-	if (type == "main_frame") {
-		switch (youtubeFrontend) {
-			case "yatte":
-				return url.href.replace(/^https?:\/{2}/, "yattee://")
-			case "freetube":
-				return `freetube://https://youtube.com${url.pathname}${url.search}`
-		}
-	}
-
-	const instanceList = getInstanceList(type)
-	try {
-		if (instanceList.length >= 1) {
-			const randomInstance = utils.getRandomInstance(instanceList)
-			return `${randomInstance}${url.pathname}${url.search}`
-		}
-	} catch {
-		return
-	}
-}
-
-function reverse(url) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-		resolve(`https://youtube.com${url.pathname}${url.search}`)
-	})
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableYoutube && !disableOverride) {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		let instancesList = []
-		switch (protocol) {
-			case "loki":
-				switch (youtubeFrontend) {
-					case "invidious":
-						instancesList = [...invidiousLokiRedirectsChecks, ...invidiousLokiCustomRedirects]
-						break
-					case "piped":
-						instancesList = [...pipedLokiRedirectsChecks, ...pipedLokiCustomRedirects]
-						break
-					case "pipedMaterial":
-						instancesList = [...pipedMaterialLokiRedirectsChecks, ...pipedMaterialLokiCustomRedirects]
-						break
-					case "cloudtube":
-						instancesList = [...cloudtubeLokiRedirectsChecks, ...cloudtubeLokiCustomRedirects]
-				}
-				break
-			case "i2p":
-				switch (youtubeFrontend) {
-					case "invidious":
-						instancesList = [...invidiousI2pRedirectsChecks, ...invidiousI2pCustomRedirects]
-						break
-					case "piped":
-						instancesList = [...pipedI2pRedirectsChecks, ...pipedI2pCustomRedirects]
-						break
-					case "pipedMaterial":
-						instancesList = [...pipedMaterialI2pRedirectsChecks, ...pipedMaterialI2pCustomRedirects]
-						break
-					case "cloudtube":
-						instancesList = [...cloudtubeI2pRedirectsChecks, ...cloudtubeI2pCustomRedirects]
-				}
-				break
-			case "tor":
-				switch (youtubeFrontend) {
-					case "invidious":
-						instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
-						break
-					case "piped":
-						instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
-						break
-					case "pipedMaterial":
-						instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
-						break
-					case "cloudtube":
-						instancesList = [...cloudtubeTorRedirectsChecks, ...cloudtubeTorCustomRedirects]
-				}
-		}
-		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-			switch (youtubeFrontend) {
-				case "invidious":
-					instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
-					break
-				case "piped":
-					instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects]
-					break
-				case "pipedMaterial":
-					instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
-					break
-				case "cloudtube":
-					instancesList = [...cloudtubeNormalRedirectsChecks, ...cloudtubeNormalCustomRedirects]
-			}
-		}
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length == 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		resolve(`${randomInstance}${url.pathname}${url.search}`)
-	})
-}
-
-function initDefaults() {
-	return new Promise(async resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					invidiousNormalRedirectsChecks = [...redirects.invidious.normal]
-					pipedNormalRedirectsChecks = [...redirects.piped.normal]
-					pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]
-					cloudtubeNormalRedirectsChecks = [...redirects.cloudtube.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = invidiousNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1)
-
-						const b = pipedNormalRedirectsChecks.indexOf(instance)
-						if (b > -1) pipedNormalRedirectsChecks.splice(b, 1)
-
-						const c = pipedMaterialNormalRedirectsChecks.indexOf(instance)
-						if (c > -1) pipedMaterialNormalRedirectsChecks.splice(c, 1)
-
-						const d = cloudtubeNormalRedirectsChecks.indexOf(instance)
-						if (c > -1) cloudtubeNormalRedirectsChecks.splice(d, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableYoutube: false,
-							enableYoutubeCustomSettings: false,
-							onlyEmbeddedVideo: "both",
-							youtubeRedirects: redirects,
-							youtubeFrontend: "invidious",
-
-							invidiousNormalRedirectsChecks,
-							invidiousNormalCustomRedirects: [],
-
-							invidiousTorRedirectsChecks: [...redirects.invidious.tor],
-							invidiousTorCustomRedirects: [],
-
-							invidiousI2pRedirectsChecks: [...redirects.invidious.i2p],
-							invidiousI2pCustomRedirects: [],
-
-							invidiousLokiRedirectsChecks: [...redirects.invidious.loki],
-							invidiousLokiCustomRedirects: [],
-
-							pipedNormalRedirectsChecks,
-							pipedNormalCustomRedirects: [],
-
-							pipedTorRedirectsChecks: [...redirects.piped.tor],
-							pipedTorCustomRedirects: [],
-
-							pipedI2pRedirectsChecks: [...redirects.piped.i2p],
-							pipedI2pCustomRedirects: [],
-
-							pipedLokiRedirectsChecks: [...redirects.piped.loki],
-							pipedLokiCustomRedirects: [],
-
-							pipedMaterialNormalRedirectsChecks: pipedMaterialNormalRedirectsChecks,
-							pipedMaterialNormalCustomRedirects: [],
-
-							pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor],
-							pipedMaterialTorCustomRedirects: [],
-
-							pipedMaterialI2pRedirectsChecks: [...redirects.pipedMaterial.i2p],
-							pipedMaterialI2pCustomRedirects: [],
-
-							pipedMaterialLokiRedirectsChecks: [...redirects.pipedMaterial.loki],
-							pipedMaterialLokiCustomRedirects: [],
-
-							cloudtubeNormalRedirectsChecks: cloudtubeNormalRedirectsChecks,
-							cloudtubeNormalCustomRedirects: [],
-
-							cloudtubeTorRedirectsChecks: [...redirects.cloudtube.tor],
-							cloudtubeTorCustomRedirects: [],
-
-							cloudtubeI2pRedirectsChecks: [...redirects.cloudtube.i2p],
-							cloudtubeI2pCustomRedirects: [],
-
-							cloudtubeLokiRedirectsChecks: [...redirects.cloudtube.loki],
-							cloudtubeLokiCustomRedirects: [],
-
-							youtubeEmbedFrontend: "invidious",
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-function copyPasteInvidiousCookies(test, from) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableYoutube || youtubeFrontend != "invidious") {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(from)
-		if (
-			![
-				...invidiousNormalRedirectsChecks,
-				...invidiousTorRedirectsChecks,
-				...invidiousNormalCustomRedirects,
-				...invidiousTorCustomRedirects,
-				...invidiousI2pCustomRedirects,
-				...invidiousLokiCustomRedirects,
-			].includes(protocolHost)
-		) {
-			resolve()
-			return
-		}
-		if (!test) {
-			let checkedInstances = []
-
-			if (protocol == "loki") checkedInstances = [...invidiousLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...invidiousI2pCustomRedirects]
-			else if (protocol == "tor") checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
-			}
-			const i = checkedInstances.indexOf(protocolHost)
-			if (i !== -1) checkedInstances.splice(i, 1)
-			await utils.copyCookie("invidious", from, checkedInstances, "PREFS")
-		}
-		resolve(true)
-	})
-}
-
-function copyPastePipedLocalStorage(test, url, tabId) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableYoutube || youtubeFrontend != "piped") {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (
-			![...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks, ...pipedTorRedirectsChecks, ...pipedTorCustomRedirects, ...pipedI2pCustomRedirects, ...pipedLokiCustomRedirects].includes(
-				protocolHost
-			)
-		) {
-			resolve()
-			return
-		}
-
-		if (!test) {
-			browser.tabs.executeScript(tabId, {
-				file: "/assets/javascripts/youtube/get_piped_preferences.js",
-				runAt: "document_start",
-			})
-
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...pipedLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...pipedI2pCustomRedirects]
-			else if (protocol == "tor") checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
-			if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks]
-			}
-			const i = checkedInstances.indexOf(protocolHost)
-			if (i !== -1) checkedInstances.splice(i, 1)
-			for (const to of checkedInstances) {
-				browser.tabs.create({ url: to }, tab =>
-					browser.tabs.executeScript(tab.id, {
-						file: "/assets/javascripts/youtube/set_piped_preferences.js",
-						runAt: "document_start",
-					})
-				)
-			}
-		}
-		resolve(true)
-	})
-}
-
-function copyPastePipedMaterialLocalStorage(test, url, tabId) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableYoutube || youtubeFrontend != "pipedMaterial") {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (
-			![
-				...pipedMaterialNormalRedirectsChecks,
-				...pipedMaterialNormalCustomRedirects,
-				//...pipedMaterialTorRedirectsChecks,
-				...pipedMaterialTorCustomRedirects,
-				...pipedMaterialI2pCustomRedirects,
-				...pipedMaterialLokiCustomRedirects,
-			].includes(protocolHost)
-		) {
-			resolve()
-			return
-		}
-
-		if (!test) {
-			browser.tabs.executeScript(tabId, {
-				file: "/assets/javascripts/youtube/get_pipedMaterial_preferences.js",
-				runAt: "document_start",
-			})
-
-			let checkedInstances = []
-			if (protocol == "loki") checkedInstances = [...pipedMaterialLokiCustomRedirects]
-			else if (protocol == "i2p") checkedInstances = [...pipedMaterialI2pCustomRedirects]
-			else if (protocol == "tor") checkedInstances = [...pipedMaterialTorCustomRedirects] //...pipedMaterialTorRedirectsChecks,
-			if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-				checkedInstances = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
-			}
-			const i = checkedInstances.indexOf(protocolHost)
-			if (i !== -1) checkedInstances.splice(i, 1)
-			for (const to of checkedInstances)
-				browser.tabs.create({ url: to }, tab =>
-					browser.tabs.executeScript(tab.id, {
-						file: "/assets/javascripts/youtube/set_pipedMaterial_preferences.js",
-						runAt: "document_start",
-					})
-				)
-		}
-		resolve(true)
-	})
-}
-
-function removeXFrameOptions(e) {
-	let isChanged = false
-
-	if (e.type == "main_frame") {
-		for (const i in e.responseHeaders) {
-			if (e.responseHeaders[i].name == "content-security-policy") {
-				let instancesList = []
-				switch (protocol) {
-					case "loki":
-						switch (youtubeFrontend) {
-							case "invidious":
-								instancesList = [...invidiousLokiRedirectsChecks, ...invidiousLokiCustomRedirects]
-								break
-							case "piped":
-								instancesList = [...pipedLokiRedirectsChecks, ...pipedLokiCustomRedirects]
-								break
-							case "pipedMaterial":
-								instancesList = [...pipedMaterialLokiRedirectsChecks, ...pipedMaterialLokiCustomRedirects]
-								break
-							case "cloudtube":
-								instancesList = [...cloudtubeLokiRedirectsChecks, ...cloudtubeLokiCustomRedirects]
-						}
-						break
-					case "i2p":
-						switch (youtubeFrontend) {
-							case "invidious":
-								instancesList = [...invidiousI2pRedirectsChecks, ...invidiousI2pCustomRedirects]
-								break
-							case "piped":
-								instancesList = [...pipedI2pRedirectsChecks, ...pipedI2pCustomRedirects]
-								break
-							case "pipedMaterial":
-								instancesList = [...pipedMaterialI2pRedirectsChecks, ...pipedMaterialI2pCustomRedirects]
-								break
-							case "cloudtube":
-								instancesList = [...cloudtubeI2pRedirectsChecks, ...cloudtubeI2pCustomRedirects]
-						}
-						break
-					case "tor":
-						switch (youtubeFrontend) {
-							case "invidious":
-								instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
-								break
-							case "piped":
-								instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
-								break
-							case "pipedMaterial":
-								instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
-								break
-							case "cloudtube":
-								instancesList = [...cloudtubeTorRedirectsChecks, ...cloudtubeTorCustomRedirects]
-						}
-				}
-				if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
-					switch (youtubeFrontend) {
-						case "invidious":
-							instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
-							break
-						case "piped":
-							instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects]
-							break
-						case "pipedMaterial":
-							instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
-							break
-						case "cloudtube":
-							instancesList = [...cloudtubeNormalRedirectsChecks, ...cloudtubeNormalCustomRedirects]
-					}
-				}
-				let securityPolicyList = e.responseHeaders[i].value.split(";")
-				for (const i in securityPolicyList) securityPolicyList[i] = securityPolicyList[i].trim()
-
-				let newSecurity = ""
-				for (const item of securityPolicyList) {
-					if (item.trim() == "") continue
-					let regex = item.match(/([a-z-]{0,}) (.*)/)
-					if (regex == null) continue
-					let [, key, vals] = regex
-					if (key == "frame-src") vals = vals + " " + instancesList.join(" ")
-					newSecurity += key + " " + vals + "; "
-				}
-
-				e.responseHeaders[i].value = newSecurity
-				isChanged = true
-			}
-		}
-	} else if (e.type == "sub_frame") {
-		const url = new URL(e.url)
-		const protocolHost = utils.protocolHost(url)
-		if (all().includes(protocolHost)) {
-			for (const i in e.responseHeaders) {
-				if (e.responseHeaders[i].name == "x-frame-options") {
-					e.responseHeaders.splice(i, 1)
-					isChanged = true
-				} else if (e.responseHeaders[i].name == "content-security-policy") {
-					e.responseHeaders.splice(i, 1)
-					isChanged = true
-				}
-			}
-		}
-	}
-	if (isChanged) return { responseHeaders: e.responseHeaders }
-}
-
-export default {
-	setRedirects,
-	copyPastePipedLocalStorage,
-	copyPastePipedMaterialLocalStorage,
-	copyPasteInvidiousCookies,
-	redirect,
-	reverse,
-	switchInstance,
-	initDefaults,
-	removeXFrameOptions,
-}
diff --git a/src/assets/javascripts/youtubeMusic.js b/src/assets/javascripts/youtubeMusic.js
deleted file mode 100644
index 797da4d5..00000000
--- a/src/assets/javascripts/youtubeMusic.js
+++ /dev/null
@@ -1,327 +0,0 @@
-"use strict"
-
-import utils from "./utils.js"
-
-window.browser = window.browser || window.chrome
-
-const targets = [/^https?:\/{2}music\.youtube\.com(\/.*|$)/]
-
-const frontends = new Array("beatbump", "hyperpipe")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
-	redirects[frontends[i]] = {}
-	for (let x = 0; x < protocols.length; x++) {
-		redirects[frontends[i]][protocols[x]] = []
-	}
-}
-
-function setRedirects(val) {
-	browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
-		redirects = val
-		beatbumpNormalRedirectsChecks = [...redirects.beatbump.normal]
-		hyperpipeNormalRedirectsChecks = [...redirects.hyperpipe.normal]
-		for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-			const a = beatbumpNormalRedirectsChecks.indexOf(instance)
-			if (a > -1) beatbumpNormalRedirectsChecks.splice(a, 1)
-
-			const b = hyperpipeNormalRedirectsChecks.indexOf(instance)
-			if (b > -1) hyperpipeNormalRedirectsChecks.splice(b, 1)
-		}
-		browser.storage.local.set({
-			youtubeMusicRedirects: redirects,
-			beatbumpNormalRedirectsChecks,
-			beatbumpTorRedirectsChecks: [...redirects.beatbump.tor],
-			beatbumpI2pRedirectsChecks: [...redirects.beatbump.i2p],
-			beatbumpLokiRedirectsChecks: [...redirects.beatbump.loki],
-			hyperpipeNormalRedirectsChecks,
-			hyperpipeTorRedirectsChecks: [...redirects.hyperpipe.tor],
-			hyperpipeI2pRedirectsChecks: [...redirects.hyperpipe.i2p],
-			hyperpipeLokiRedirectsChecks: [...redirects.hyperpipe.loki],
-		})
-	})
-}
-
-let disableYoutubeMusic,
-	youtubeMusicFrontend,
-	youtubeMusicRedirects,
-	protocol,
-	protocolFallback,
-	beatbumpNormalRedirectsChecks,
-	beatbumpNormalCustomRedirects,
-	beatbumpTorRedirectsChecks,
-	beatbumpTorCustomRedirects,
-	beatbumpI2pRedirectsChecks,
-	beatbumpI2pCustomRedirects,
-	beatbumpLokiRedirectsChecks,
-	beatbumpLokiCustomRedirects,
-	hyperpipeNormalRedirectsChecks,
-	hyperpipeNormalCustomRedirects,
-	hyperpipeTorRedirectsChecks,
-	hyperpipeTorCustomRedirects,
-	hyperpipeI2pRedirectsChecks,
-	hyperpipeI2pCustomRedirects,
-	hyperpipeLokiRedirectsChecks,
-	hyperpipeLokiCustomRedirects
-
-function init() {
-	return new Promise(async resolve => {
-		browser.storage.local.get(
-			[
-				"disableYoutubeMusic",
-				"youtubeMusicFrontend",
-				"youtubeMusicRedirects",
-				"protocol",
-				"protocolFallback",
-				"beatbumpNormalRedirectsChecks",
-				"beatbumpNormalCustomRedirects",
-				"beatbumpTorRedirectsChecks",
-				"beatbumpTorCustomRedirects",
-				"beatbumpI2pRedirectsChecks",
-				"beatbumpI2pCustomRedirects",
-				"beatbumpLokiRedirectsChecks",
-				"beatbumpLokiCustomRedirects",
-				"hyperpipeNormalRedirectsChecks",
-				"hyperpipeNormalCustomRedirects",
-				"hyperpipeTorRedirectsChecks",
-				"hyperpipeTorCustomRedirects",
-				"hyperpipeI2pRedirectsChecks",
-				"hyperpipeI2pCustomRedirects",
-				"hyperpipeLokiRedirectsChecks",
-				"hyperpipeLokiCustomRedirects",
-			],
-			r => {
-				disableYoutubeMusic = r.disableYoutubeMusic
-				youtubeMusicFrontend = r.youtubeMusicFrontend
-				youtubeMusicRedirects = r.youtubeMusicRedirects
-				protocol = r.protocol
-				protocolFallback = r.protocolFallback
-				beatbumpNormalRedirectsChecks = r.beatbumpNormalRedirectsChecks
-				beatbumpNormalCustomRedirects = r.beatbumpNormalCustomRedirects
-				beatbumpTorRedirectsChecks = r.beatbumpTorRedirectsChecks
-				beatbumpTorCustomRedirects = r.beatbumpTorCustomRedirects
-				beatbumpI2pRedirectsChecks = r.beatbumpI2pRedirectsChecks
-				beatbumpI2pCustomRedirects = r.beatbumpI2pCustomRedirects
-				beatbumpLokiRedirectsChecks = r.beatbumpLokiRedirectsChecks
-				beatbumpLokiCustomRedirects = r.beatbumpLokiCustomRedirects
-				hyperpipeNormalRedirectsChecks = r.hyperpipeNormalRedirectsChecks
-				hyperpipeNormalCustomRedirects = r.hyperpipeNormalCustomRedirects
-				hyperpipeTorRedirectsChecks = r.hyperpipeTorRedirectsChecks
-				hyperpipeTorCustomRedirects = r.hyperpipeTorCustomRedirects
-				hyperpipeI2pRedirectsChecks = r.hyperpipeI2pRedirectsChecks
-				hyperpipeI2pCustomRedirects = r.hyperpipeI2pCustomRedirects
-				hyperpipeLokiRedirectsChecks = r.hyperpipeLokiRedirectsChecks
-				hyperpipeLokiCustomRedirects = r.hyperpipeLokiCustomRedirects
-				resolve()
-			}
-		)
-	})
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
-	return [
-		...beatbumpNormalRedirectsChecks,
-		...beatbumpNormalCustomRedirects,
-		...beatbumpTorRedirectsChecks,
-		...beatbumpTorCustomRedirects,
-		...beatbumpI2pRedirectsChecks,
-		...beatbumpI2pCustomRedirects,
-		...beatbumpLokiRedirectsChecks,
-		...beatbumpLokiCustomRedirects,
-		...hyperpipeNormalRedirectsChecks,
-		...hyperpipeNormalCustomRedirects,
-		...hyperpipeTorRedirectsChecks,
-		...hyperpipeTorCustomRedirects,
-		...hyperpipeI2pRedirectsChecks,
-		...hyperpipeI2pCustomRedirects,
-		...hyperpipeLokiRedirectsChecks,
-		...hyperpipeLokiCustomRedirects,
-	]
-}
-
-function getInstanceList() {
-	let tmpList = []
-	switch (youtubeMusicFrontend) {
-		case "beatbump":
-			switch (protocol) {
-				case "loki":
-					tmpList = [...beatbumpLokiRedirectsChecks, ...beatbumpLokiCustomRedirects]
-					break
-				case "i2p":
-					tmpList = [...beatbumpI2pRedirectsChecks, ...beatbumpI2pCustomRedirects]
-					break
-				case "tor":
-					tmpList = [...beatbumpTorRedirectsChecks, ...beatbumpTorCustomRedirects]
-			}
-			if ((tmpList.length === 0 && protocolFallback) || protocol == "normal") {
-				tmpList = [...beatbumpNormalRedirectsChecks, ...beatbumpNormalCustomRedirects]
-			}
-			break
-		case "hyperpipe":
-			switch (protocol) {
-				case "loki":
-					tmpList = [...hyperpipeLokiRedirectsChecks, ...hyperpipeLokiCustomRedirects]
-					break
-				case "i2p":
-					tmpList = [...hyperpipeI2pRedirectsChecks, ...hyperpipeI2pCustomRedirects]
-					break
-				case "tor":
-					tmpList = [...hyperpipeTorRedirectsChecks, ...hyperpipeTorCustomRedirects]
-			}
-			if ((tmpList.length === 0 && protocolFallback) || protocol == "normal") {
-				tmpList = [...hyperpipeNormalRedirectsChecks, ...hyperpipeNormalCustomRedirects]
-			}
-	}
-	return tmpList
-}
-
-function getUrl(randomInstance, url) {
-	switch (youtubeMusicFrontend) {
-		case "beatbump":
-			return `${randomInstance}${url.pathname}${url.search}`
-				.replace("/watch?v=", "/listen?id=")
-				.replace("/channel/", "/artist/")
-				.replace("/playlist?list=", "/playlist/VL")
-				.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/") + "?filter=EgWKAQIIAWoKEAMQBBAKEAkQBQ%3D%3D")
-		case "hyperpipe":
-			return `${randomInstance}${url.pathname}${url.search}`.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/"))
-	}
-}
-
-/* 
-Video
-https://music.youtube.com/watch?v=_PkGiKBW-DA&list=RDAMVM_PkGiKBW-DA
-https://beatbump.ml/listen?id=_PkGiKBW-DA&list=RDAMVM_PkGiKBW-DA
-
-Playlist
-https://music.youtube.com/playlist?list=PLqxd0OMLeWy64zlwhjouj92ISc38FbOns
-https://music.youtube.com/playlist?list=PLqxd0OMLeWy7lrJSzt9LnOJjbC1IaruPM
-https://music.youtube.com/playlist?list=PLQod4DlD72ZMJmOrSNbmEmK_iZ1oXPzKd
-https://beatbump.ml/playlist/VLPLqxd0OMLeWy64zlwhjouj92ISc38FbOns
-
-Channel
-https://music.youtube.com/channel/UCfgmMDI7T5tOQqjnOBRe_wg
-https://beatbump.ml/artist/UCfgmMDI7T5tOQqjnOBRe_wg
-
-Albums
-https://music.youtube.com/playlist?list=OLAK5uy_n-9HVh3cryV2gREZM9Sc0JwEKYjjfi0dU
-https://music.youtube.com/playlist?list=OLAK5uy_lcr5O1zS8f6WIFI_yxqVp2RK9Dyy2bbw0
-https://beatbump.ml/release?id=MPREb_3DURc4yEUtD
-https://beatbump.ml/release?id=MPREb_evaZrV1WNdS
-
-https://music.youtube.com/playlist?list=OLAK5uy_n6OHVllUZUCnlIY1m-gUaH8uqkN3Y-Ca8
-https://music.youtube.com/playlist?list=OLAK5uy_nBOTxAc3_RGB82-Z54jdARGxGaCYlpngY
-https://beatbump.ml/release?id=MPREb_QygdC0wEoLe
-
-https://music.youtube.com/watch?v=R6gSMSYKhKU&list=OLAK5uy_n-9HVh3cryV2gREZM9Sc0JwEKYjjfi0dU
-
-Search
-https://music.youtube.com/search?q=test
-https://beatbump.ml/search/test?filter=EgWKAQIIAWoKEAMQBBAKEAkQBQ%3D%3D
-
-*/
-function redirect(url, type, initiator, disableOverride) {
-	if (disableYoutubeMusic && !disableOverride) return
-	if (!targets.some(rx => rx.test(url.href))) return
-
-	let instancesList = getInstanceList()
-
-	if (instancesList.length === 0) return
-	const randomInstance = utils.getRandomInstance(instancesList)
-	return getUrl(randomInstance, url)
-}
-
-function switchInstance(url, disableOverride) {
-	return new Promise(async resolve => {
-		await init()
-		if (disableYoutubeMusic && !disableOverride) {
-			resolve()
-			return
-		}
-		const protocolHost = utils.protocolHost(url)
-		if (!all().includes(protocolHost)) {
-			resolve()
-			return
-		}
-
-		let instancesList = getInstanceList()
-
-		const i = instancesList.indexOf(protocolHost)
-		if (i > -1) instancesList.splice(i, 1)
-		if (instancesList.length === 0) {
-			resolve()
-			return
-		}
-
-		const randomInstance = utils.getRandomInstance(instancesList)
-		return getUrl(randomInstance, url)
-	})
-}
-
-function initDefaults() {
-	return new Promise(resolve => {
-		fetch("/instances/data.json")
-			.then(response => response.text())
-			.then(async data => {
-				let dataJson = JSON.parse(data)
-				for (let i = 0; i < frontends.length; i++) {
-					redirects[frontends[i]] = dataJson[frontends[i]]
-				}
-				browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
-					beatbumpNormalRedirectsChecks = [...redirects.beatbump.normal]
-					hyperpipeNormalRedirectsChecks = [...redirects.hyperpipe.normal]
-					for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
-						const a = beatbumpNormalRedirectsChecks.indexOf(instance)
-						if (a > -1) beatbumpNormalRedirectsChecks.splice(a, 1)
-
-						const b = hyperpipeNormalRedirectsChecks.indexOf(instance)
-						if (b > -1) hyperpipeNormalRedirectsChecks.splice(b, 1)
-					}
-					browser.storage.local.set(
-						{
-							disableYoutubeMusic: false,
-							youtubeMusicFrontend: "hyperpipe",
-							youtubeMusicRedirects: redirects,
-
-							beatbumpNormalRedirectsChecks,
-							beatbumpNormalCustomRedirects: [],
-
-							beatbumpTorRedirectsChecks: [...redirects.beatbump.tor],
-							beatbumpTorCustomRedirects: [],
-
-							beatbumpI2pRedirectsChecks: [...redirects.beatbump.i2p],
-							beatbumpI2pCustomRedirects: [],
-
-							beatbumpLokiRedirectsChecks: [...redirects.beatbump.loki],
-							beatbumpLokiCustomRedirects: [],
-
-							hyperpipeNormalRedirectsChecks,
-							hyperpipeNormalCustomRedirects: [],
-
-							hyperpipeTorRedirectsChecks: [...redirects.hyperpipe.tor],
-							hyperpipeTorCustomRedirects: [],
-
-							hyperpipeI2pRedirectsChecks: [...redirects.hyperpipe.i2p],
-							hyperpipeI2pCustomRedirects: [],
-
-							hyperpipeLokiRedirectsChecks: [...redirects.hyperpipe.loki],
-							hyperpipeLokiCustomRedirects: [],
-						},
-						() => resolve()
-					)
-				})
-			})
-	})
-}
-
-export default {
-	setRedirects,
-	switchInstance,
-	redirect,
-	initDefaults,
-}
diff --git a/src/config/config.json b/src/config/config.json
index 6f926034..e2b511b9 100644
--- a/src/config/config.json
+++ b/src/config/config.json
@@ -535,7 +535,7 @@
 					"instanceList": "true"

 				}

 			},

-			"targets": ["^https?:\\/{2}send\\.libredirect\\.invalid\\/$", "^https?:\\/{2}send\\.firefox\\.com\\/$", "^https?:\\/{2}sendfiles\\.online\\/$"],

+			"targets": ["^https?:\\/{2}send\\.libredirect\\.invalid\\/?$", "^https?:\\/{2}send\\.firefox\\.com\\/?$", "^https?:\\/{2}sendfiles\\.online\\/?$"],

 			"name": "Send Files",

 			"options": { "enabled": true },

 			"imageType": "svgMono",

diff --git a/src/instances/get_instances.py b/src/instances/get_instances.py
index 3b773304..06b547b3 100644
--- a/src/instances/get_instances.py
+++ b/src/instances/get_instances.py
@@ -1,25 +1,26 @@
 # Note: Run this script from the root of the repo
 
+import traceback
+import logging
 import requests
 import json
 from urllib.parse import urlparse
 import re
-from colorama import Fore, Back, Style
-from urllib.parse import urlparse
+from colorama import Fore, Style
 import socket
 
 mightyList = {}
 config = {}
 
-startRegex = "https?:\/{2}(?:[^\s\/]+\.)+"
+startRegex = r"https?:\/{2}(?:[^\s\/]+\.)+"
 endRegex = "(?:\/[^\s\/]+)*\/?"
 torRegex = startRegex + "onion" + endRegex
 i2pRegex = startRegex + "i2p" + endRegex
 lokiRegex = startRegex + "loki" + endRegex
-authRegex = "https?:\/{2}\S+:\S+@(?:[^\s\/]+\.)+[a-zA-Z0-9]+" + endRegex
+authRegex = r"https?:\/{2}\S+:\S+@(?:[^\s\/]+\.)+[a-zA-Z0-9]+" + endRegex
 
 with open('./src/config/config.json', 'rt') as tmp:
-    config['networks'] = json.load(tmp)['config']['networks']
+    config['networks'] = json.load(tmp)['networks']
 
 
 def filterLastSlash(urlList):
@@ -61,7 +62,7 @@ def is_cloudflare(url):
         instance_ip = socket.gethostbyname(urlparse(url).hostname)
         if instance_ip is None:
             return False
-    except:
+    except Exception:
         return False
     instance_bin = ip2bin(instance_ip)
 
@@ -88,10 +89,11 @@ def is_authenticate(url):
         if 'www-authenticate' in r.headers:
             print(url + ' requires ' + Fore.RED + 'authentication' + Style.RESET_ALL)
             return True
-    except:
+    except Exception:
         return False
     return False
 
+
 def is_offline(url):
     try:
         r = requests.get(url, timeout=5)
@@ -102,21 +104,22 @@ def is_offline(url):
             return True
         else:
             return False
-    except:
+    except Exception:
         return False
 
+
 def fetchCache(frontend, name):
-    # json_object = json.dumps(mightyList, ensure_ascii=False, indent=2)
     with open('./src/instances/data.json') as file:
         mightyList[frontend] = json.load(file)[frontend]
     print(Fore.YELLOW + 'Failed' + Style.RESET_ALL + ' to fetch ' + name)
 
+
 def fetchFromFile(frontend, name):
-    #json_object = json.dumps(mightyList, ensure_ascii=False, indent=2)
     with open('./src/instances/' + frontend + '.json') as file:
         mightyList[frontend] = json.load(file)
     print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
 
+
 def fetchJsonList(frontend, name, url, urlItem):
     try:
         r = requests.get(url)
@@ -127,13 +130,13 @@ def fetchJsonList(frontend, name, url, urlItem):
         if type(urlItem) == dict:
             for item in rJson:
                 for network in config['networks']:
-                    if urlItem[network] != None:
+                    if urlItem[network] is not None:
                         if urlItem[network] in item:
                             if item[urlItem[network]].strip() != '':
                                 _list[network].append(item[urlItem[network]])
         else:
             if frontend == 'librarian':
-                rJson = rJson['instances'] # I got lazy :p   Might fix this at some point...
+                rJson = rJson['instances']  # I got lazy :p   Might fix this at some point...
             for item in rJson:
                 tmpItem = item
                 if urlItem is not None:
@@ -151,18 +154,20 @@ def fetchJsonList(frontend, name, url, urlItem):
 
         mightyList[frontend] = _list
         print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
-    except:
+    except Exception:
         fetchCache(frontend, name)
+        logging.error(traceback.format_exc())
+
 
-def fetchRegexList(frontend, name, url, regex): 
+def fetchRegexList(frontend, name, url, regex):
     try:
         r = requests.get(url)
         _list = {}
         for network in config['networks']:
             _list[network] = []
-    
+
         tmp = re.findall(regex, r.text)
-    
+
         for item in tmp:
             if item.strip() == "":
                 continue
@@ -176,8 +181,10 @@ def fetchRegexList(frontend, name, url, regex):
                 _list['clearnet'].append(item)
         mightyList[frontend] = _list
         print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
-    except:
+    except Exception:
         fetchCache(frontend, name)
+        logging.error(traceback.format_exc())
+
 
 def fetchTextList(frontend, name, url, prepend):
     try:
@@ -200,8 +207,9 @@ def fetchTextList(frontend, name, url, prepend):
                 _list['clearnet'].append(item)
         mightyList[frontend] = _list
         print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
-    except:
+    except Exception:
         fetchCache(frontend, name)
+        logging.error(traceback.format_exc())
 
 
 def invidious():
@@ -223,8 +231,9 @@ def invidious():
                 _list['tor'].append(instance[1]['uri'])
         mightyList[frontend] = _list
         print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
-    except:
+    except Exception:
         fetchCache(frontend, name)
+        logging.error(traceback.format_exc())
 
 
 def piped():
@@ -240,7 +249,7 @@ def piped():
             'https://raw.githubusercontent.com/wiki/TeamPiped/Piped/Instances.md')
     
         tmp = re.findall(
-            '(?:[^\s\/]+\.)+[a-zA-Z]+ (?:\(Official\) )?\| (https:\/{2}(?:[^\s\/]+\.)+[a-zA-Z]+) \| ', r.text)
+            r'(?:[^\s\/]+\.)+[a-zA-Z]+ (?:\(Official\) )?\| (https:\/{2}(?:[^\s\/]+\.)+[a-zA-Z]+) \| ', r.text)
         for item in tmp:
             try:
                 url = requests.get(item, timeout=5).url
@@ -248,12 +257,14 @@ def piped():
                     continue
                 else:
                     _list['clearnet'].append(url)
-            except:
+            except Exception:
+                logging.error(traceback.format_exc())
                 continue
         mightyList[frontend] = _list
         print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
-    except:
+    except Exception:
         fetchCache(frontend, name)
+        logging.error(traceback.format_exc())
 
 
 def pipedMaterial():
@@ -265,20 +276,7 @@ def cloudtube():
 
 
 def proxitok():
-    r = requests.get(
-        'https://raw.githubusercontent.com/wiki/pablouser1/ProxiTok/Public-instances.md')
-
-    tmp = re.findall(
-        r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}.*\|.*\|", r.text)
-    proxiTokList = {}
-    proxiTokList['clearnet'] = []
-    proxiTokList['tor'] = []
-    proxiTokList['i2p'] = []
-    proxiTokList['loki'] = []
-    for item in tmp:
-        proxiTokList['clearnet'].append(re.sub(r'/$', '', item))
-    mightyList['proxiTok'] = proxiTokList
-    print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'ProxiTok')
+    fetchRegexList('proxiTok', 'ProxiTok', 'https://raw.githubusercontent.com/wiki/pablouser1/ProxiTok/Public-instances.md', r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)(?: \(Official\))? +\|(?:(?: [A-Z]*.*\|.*\|)|(?:$))")
 
 
 def send():
@@ -298,11 +296,11 @@ def libreddit():
 
 
 def teddit():
-    fetchJsonList('teddit', 'Teddit', 'https://codeberg.org/teddit/teddit/raw/branch/main/instances.json', { 'clearnet': 'url', 'tor': 'onion', 'i2p': 'i2p', 'loki': None })
+    fetchJsonList('teddit', 'Teddit', 'https://codeberg.org/teddit/teddit/raw/branch/main/instances.json', {'clearnet': 'url', 'tor': 'onion', 'i2p': 'i2p', 'loki': None})
 
 
 def wikiless():
-    fetchJsonList('wikiless', 'Wikiless', 'https://wikiless.org/instances.json', { 'clearnet': 'url', 'tor': 'onion', 'i2p': 'i2p', 'loki': None})
+    fetchJsonList('wikiless', 'Wikiless', 'https://wikiless.org/instances.json', {'clearnet': 'url', 'tor': 'onion', 'i2p': 'i2p', 'loki': None})
 
 
 def scribe():
@@ -401,6 +399,7 @@ def rimgo():
 def librarian():
     fetchJsonList('librarian', 'Librarian', 'https://codeberg.org/librarian/librarian/raw/branch/main/instances.json', 'url')
 
+
 def neuters():
     fetchFromFile('neuters', 'Neuters')
 
@@ -434,7 +433,7 @@ def isValid(url):  # This code is contributed by avanitrachhadiya2155
     try:
         result = urlparse(url)
         return all([result.scheme, result.netloc])
-    except:
+    except Exception:
         return False
 
 
diff --git a/src/pages/options/widgets/general.js b/src/pages/options/widgets/general.js
index 89d0b6b0..23ed73ee 100644
--- a/src/pages/options/widgets/general.js
+++ b/src/pages/options/widgets/general.js
@@ -37,7 +37,8 @@ function setOption(option, multiChoice, event) {
 	browser.storage.local.get("options", r => {
 		let options = r.options
 		if (multiChoice) {
-			options[option] = event.target.options[[option].selectedIndex].value
+			console.log(event.target.options)
+			options[option] = event.target.options[event.target.options.selectedIndex].value
 		} else {
 			options[option] = event.target.checked
 		}
diff --git a/src/pages/options/widgets/services.js b/src/pages/options/widgets/services.js
index d709a05b..873950f3 100644
--- a/src/pages/options/widgets/services.js
+++ b/src/pages/options/widgets/services.js
@@ -87,7 +87,7 @@ for (const service in config.services) {
 		divs[service][option].addEventListener("change", () => {
 			if (typeof config.services[service].options[option] == "boolean") options[service][option] = divs[service][option].checked
 			else options[service][option] = divs[service][option].value
-			browser.local.storage.set({ options })
+			browser.storage.local.set({ options })
 			changeFrontendsSettings(service)
 		})
 	}