about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorManeraKai <manerakai@protonmail.com>2022-12-07 10:51:43 +0300
committerManeraKai <manerakai@protonmail.com>2022-12-07 10:51:43 +0300
commitf454ced9490309f37199c2a47dcd8cbc7e976798 (patch)
tree894c1b18a7a30ed1406257830f768a1917ef126b
parentFixed Bypass not working https://github.com/libredirect/libredirect/issues/475 (diff)
downloadlibredirect-f454ced9490309f37199c2a47dcd8cbc7e976798.zip
Removed LatencyTest, AutoRedirect, Unify, DisableInstance
-rw-r--r--Privacy-Policy.md1
-rw-r--r--src/assets/javascripts/general.js2
-rw-r--r--src/assets/javascripts/services.js53
-rw-r--r--src/assets/javascripts/utils.js205
-rw-r--r--src/config/config.json237
-rwxr-xr-xsrc/instances/get_instances.py19
-rw-r--r--src/manifest.json8
-rw-r--r--src/pages/background/background.js55
-rw-r--r--src/pages/errors/instance_offline.html39
-rw-r--r--src/pages/errors/instance_offline.js20
-rw-r--r--src/pages/options/widgets/general.ejs31
-rw-r--r--src/pages/options/widgets/general.js36
-rw-r--r--src/pages/options/widgets/services.ejs10
-rw-r--r--src/pages/options/widgets/services.js1
-rw-r--r--src/pages/popup/popup.ejs102
-rw-r--r--src/pages/popup/popup.js43
16 files changed, 62 insertions, 800 deletions
diff --git a/Privacy-Policy.md b/Privacy-Policy.md
index d2878c79..86180925 100644
--- a/Privacy-Policy.md
+++ b/Privacy-Policy.md
@@ -6,7 +6,6 @@
   OpenStreetMap (OSM) reverse geocoding, done via the [OSM Nomantim API](https://nominatim.org/release-docs/develop/api/Overview/),
   used as part of OSM redirects, which can be disabled by toggling the OSM redirects.
 - It also connects to [this url](https://raw.githubusercontent.com/libredirect/libredirect/master/src/instances/data.json) to update the Instances List. Though this only gets triggered when the user presses the `Update Instances` button.
-- For bibliogram instances. To set a cookie you should send an HTTP request to the server as the server stores settings values itself and gives you a token to access them.
 
 ## Future Changes
 
diff --git a/src/assets/javascripts/general.js b/src/assets/javascripts/general.js
index 9e490c4a..7b8f9dac 100644
--- a/src/assets/javascripts/general.js
+++ b/src/assets/javascripts/general.js
@@ -32,10 +32,8 @@ async function initDefaults() {
 					},
 					theme: "detect",
 					popupServices: ["youtube", "twitter", "instagram", "tiktok", "imgur", "reddit", "quora", "translate", "maps"],
-					autoRedirect: false,
 					network: "clearnet",
 					networkFallback: true,
-					latencyThreshold: 1000,
 				},
 			},
 			() => resolve()
diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js
index a8d99075..5463bfca 100644
--- a/src/assets/javascripts/services.js
+++ b/src/assets/javascripts/services.js
@@ -550,50 +550,6 @@ function reverse(url, urlString) {
 	})
 }
 
-function unifyPreferences(url, tabId) {
-	return new Promise(async resolve => {
-		await init()
-		const protocolHost = utils.protocolHost(url)
-		for (const service in config.services) {
-			for (const frontend in config.services[service].frontends) {
-				if (all(service, frontend, options, config, redirects).includes(protocolHost)) {
-					let instancesList = [...options[frontend][options.network].enabled, ...options[frontend][options.network].custom]
-					if (options.networkFallback && options.network != "clearnet") instancesList.push(...options[frontend].clearnet.enabled, ...options[frontend].clearnet.custom)
-
-					const frontendObject = config.services[service].frontends[frontend]
-					if ("cookies" in frontendObject.preferences) {
-						for (const cookie of frontendObject.preferences.cookies) {
-							await utils.copyCookie(url, instancesList, cookie)
-						}
-					}
-					if ("localstorage" in frontendObject.preferences) {
-						browser.storage.local.set({ tmp: [frontend, frontendObject.preferences.localstorage] })
-						browser.tabs.executeScript(tabId, {
-							file: "/assets/javascripts/get-localstorage.js",
-							runAt: "document_start",
-						})
-						for (const instance of instancesList)
-							browser.tabs.create({ url: instance }, tab =>
-								browser.tabs.executeScript(tab.id, {
-									file: "/assets/javascripts/set-localstorage.js",
-									runAt: "document_start",
-								})
-							)
-					}
-					/*
-					if ("indexeddb" in frontendObject.preferences) {
-					}
-					if ("token" in frontendObject.preferences) {
-					}
-					*/
-					resolve(true)
-					return
-				}
-			}
-		}
-	})
-}
-
 function setRedirects(passedRedirects) {
 	return new Promise(resolve => {
 		fetch("/config/config.json")
@@ -662,7 +618,6 @@ function initDefaults() {
 							let targets = {}
 							let config = JSON.parse(configData)
 							const localstorage = {}
-							const latency = {}
 							for (const service in config.services) {
 								options[service] = {}
 								if (config.services[service].targets == "datajson") {
@@ -687,7 +642,7 @@ function initDefaults() {
 									}
 								}
 							}
-							browser.storage.local.set({ redirects, options, targets, latency, localstorage })
+							browser.storage.local.set({ redirects, options, targets, localstorage })
 							resolve()
 						})
 					})
@@ -702,7 +657,6 @@ function upgradeOptions() {
 			.then(configData => {
 				browser.storage.local.get(null, r => {
 					let options = r.options
-					let latency = {}
 					const config = JSON.parse(configData)
 					options.exceptions = r.exceptions
 					if (r.theme != "DEFAULT") options.theme = r.theme
@@ -717,7 +671,6 @@ function upgradeOptions() {
 						options.popupServices.splice(tmp, 1)
 						options.popupServices.push("sendFiles")
 					}
-					options.autoRedirect = r.autoRedirect
 					switch (r.onlyEmbeddedVideo) {
 						case "onlyNotEmbedded":
 							options.youtube.redirectType = "main_frame"
@@ -747,7 +700,6 @@ function upgradeOptions() {
 						if (r[oldService + "EmbedFrontend"] && (service != "youtube" || r[oldService + "EmbedFrontend"] == "invidious" || r[oldService + "EmbedFrontend"] == "piped"))
 							options[service].embedFrontend = r[oldService + "EmbedFrontend"]
 						for (const frontend in config.services[service].frontends) {
-							if (r[frontend + "Latency"]) latency[frontend] = r[frontend + "Latency"]
 							for (const network in config.networks) {
 								let protocol
 								if (network == "clearnet") protocol = "normal"
@@ -763,7 +715,7 @@ function upgradeOptions() {
 							}
 						}
 					}
-					browser.storage.local.set({ options, latency }, () => resolve())
+					browser.storage.local.set({ options }, () => resolve())
 				})
 			})
 	})
@@ -870,7 +822,6 @@ export default {
 	computeService,
 	switchInstance,
 	reverse,
-	unifyPreferences,
 	setRedirects,
 	initDefaults,
 	upgradeOptions,
diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js
index b176967b..4dd537fc 100644
--- a/src/assets/javascripts/utils.js
+++ b/src/assets/javascripts/utils.js
@@ -13,7 +13,6 @@ function camelCase(str) {
 
 let cloudflareBlackList = []
 let authenticateBlackList = []
-let offlineBlackList = []
 async function initBlackList() {
 	return new Promise(resolve => {
 		fetch("/instances/blacklist.json")
@@ -21,7 +20,6 @@ async function initBlackList() {
 			.then(data => {
 				cloudflareBlackList = JSON.parse(data).cloudflare
 				authenticateBlackList = JSON.parse(data).authenticate
-				offlineBlackList = JSON.parse(data).offline
 				resolve()
 			})
 	})
@@ -60,7 +58,6 @@ function protocolHost(url) {
 }
 
 async function processDefaultCustomInstances(service, frontend, network, document) {
-	let instancesLatency
 	let frontendNetworkElement = document.getElementById(frontend).getElementsByClassName(network)[0]
 
 	let frontendCustomInstances = []
@@ -74,11 +71,10 @@ async function processDefaultCustomInstances(service, frontend, network, documen
 
 	async function getFromStorage() {
 		return new Promise(async resolve =>
-			browser.storage.local.get(["options", "redirects", "latency"], r => {
+			browser.storage.local.get(["options", "redirects",], r => {
 				frontendDefaultRedirects = r.options[frontend][network].enabled
 				frontendCustomInstances = r.options[frontend][network].custom
 				options = r.options
-				instancesLatency = r.latency[frontend] ?? []
 				redirects = r.redirects
 				resolve()
 			})
@@ -106,27 +102,17 @@ async function processDefaultCustomInstances(service, frontend, network, documen
         <x data-localise="__MSG_toggleAll__">Toggle All</x>
         <input type="checkbox" class="toggle-all"/>
       </div>`,
-		...redirects[frontend][network].map(x => {
-			const cloudflare = cloudflareBlackList.includes(x) ? ' <span style="color:red;">cloudflare</span>' : ""
-			const authenticate = authenticateBlackList.includes(x) ? ' <span style="color:orange;">authenticate</span>' : ""
-			const offline = offlineBlackList.includes(x) ? ' <span style="color:grey;">offline</span>' : ""
+		...redirects[frontend][network]
+			.map(x => {
+				const cloudflare = cloudflareBlackList.includes(x) ? ' <span style="color:red;">cloudflare</span>' : ""
+				const authenticate = authenticateBlackList.includes(x) ? ' <span style="color:orange;">authenticate</span>' : ""
 
-			let ms = instancesLatency[x]
-			let latencyColor = ms == -1 ? "red" : ms <= 1000 ? "green" : ms <= 2000 ? "orange" : "red"
-			let latencyLimit
-			if (ms == 5000) latencyLimit = "5000ms+"
-			else if (ms > 5000) latencyLimit = `ERROR: ${ms - 5000}`
-			else if (ms == -1) latencyLimit = "Server not found"
-			else latencyLimit = ms + "ms"
-
-			const latency = x in instancesLatency ? '<span style="color:' + latencyColor + ';">' + latencyLimit + "</span>" : ""
-
-			let warnings = [cloudflare, authenticate, offline, latency].join(" ")
-			return `<div>
+				let warnings = [cloudflare, authenticate].join(" ")
+				return `<div>
                     <x><a href="${x}" target="_blank">${x}</a>${warnings}</x>
                     <input type="checkbox" class="${x}"/>
                   </div>`
-		}),
+			}),
 	].join("\n<hr>\n")
 
 	localise.localisePage()
@@ -211,133 +197,6 @@ async function processDefaultCustomInstances(service, frontend, network, documen
 	})
 }
 
-function ping(href) {
-	return new Promise(async resolve => {
-		let average = 0
-		let time
-		for (let i = 0; i < 3; i++) {
-			time = await pingOnce(href)
-			if (i == 0) continue
-			if (time >= 5000) {
-				resolve(time)
-				return
-			}
-			average += time
-		}
-		average = parseInt(average / 3)
-		resolve(average)
-	})
-}
-
-function pingOnce(href) {
-	return new Promise(async resolve => {
-		let started
-		let http = new XMLHttpRequest()
-		http.timeout = 5000
-		http.ontimeout = () => resolve(5000)
-		http.onerror = () => resolve()
-		http.onreadystatechange = () => {
-			if (http.readyState == 2) {
-				if (http.status == 200) {
-					let ended = new Date().getTime()
-					http.abort()
-					resolve(ended - started)
-				} else {
-					resolve(5000 + http.status)
-				}
-			}
-		}
-		http.open("GET", `${href}?_=${new Date().getTime()}`, true)
-		started = new Date().getTime()
-		http.send(null)
-	})
-}
-
-async function testLatency(element, instances, frontend) {
-	return new Promise(async resolve => {
-		let myList = {}
-		let latencyThreshold, options
-		browser.storage.local.get(["options"], r => {
-			latencyThreshold = r.options.latencyThreshold
-			options = r.options
-		})
-		for (const href of instances) {
-			await ping(href).then(time => {
-				let color
-				if (time) {
-					myList[href] = time
-					if (time <= 1000) color = "green"
-					else if (time <= 2000) color = "orange"
-					else color = "red"
-
-					if (time > latencyThreshold && options[frontend].clearnet.enabled.includes(href)) {
-						options[frontend].clearnet.enabled.splice(options[frontend].clearnet.enabled.indexOf(href), 1)
-					}
-
-					let text
-					if (time == 5000) text = "5000ms+"
-					else if (time > 5000) text = `ERROR: ${time - 5000}`
-					else text = `${time}ms`
-					element.innerHTML = `${href}:&nbsp;<span style="color:${color};">${text}</span>`
-				} else {
-					myList[href] = -1
-					color = "red"
-					element.innerHTML = `${href}:&nbsp;<span style="color:${color};">Server not found</span>`
-					if (options[frontend].clearnet.enabled.includes(href)) options[frontend].clearnet.enabled.splice(options[frontend].clearnet.enabled.indexOf(href), 1)
-				}
-			})
-		}
-		browser.storage.local.set({ options })
-		resolve(myList)
-	})
-}
-
-function copyCookie(targetUrl, urls, name) {
-	return new Promise(resolve => {
-		const query = {
-			url: protocolHost(targetUrl),
-			name: name,
-		}
-		browser.cookies.getAll(query, async cookies => {
-			for (const cookie of cookies)
-				if (cookie.name == name) {
-					for (const url of urls) {
-						const setQuery = {
-							url: url,
-							name: name,
-							value: cookie.value,
-							secure: true,
-							expirationDate: cookie.expirationDate,
-						}
-						browser.cookies.set(setQuery)
-					}
-					break
-				}
-			resolve()
-		})
-	})
-}
-
-function getPreferencesFromToken(frontend, targetUrl, urls, name, endpoint) {
-	return new Promise(resolve => {
-		const http = new XMLHttpRequest()
-		const url = `${targetUrl}${endpoint}`
-		http.open("GET", url, false)
-		//http.setRequestHeader("Cookie", `${name}=${cookie.value}`)
-		http.send(null)
-		const preferences = JSON.parse(http.responseText)
-		let formdata = new FormData()
-		for (var key in preferences) formdata.append(key, preferences[key])
-		for (const url of urls) {
-			const http = new XMLHttpRequest()
-			http.open("POST", `${url}/settings/stay`, false)
-			http.send(null)
-		}
-		resolve()
-		return
-	})
-}
-
 function copyRaw(test, copyRawElement) {
 	return new Promise(resolve => {
 		browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
@@ -370,25 +229,6 @@ function copyRaw(test, copyRawElement) {
 	})
 }
 
-function unify() {
-	return new Promise(resolve => {
-		browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-			let currTab = tabs[0]
-			if (currTab) {
-				let url
-				try {
-					url = new URL(currTab.url)
-				} catch {
-					resolve()
-					return
-				}
-
-				resolve(await servicesHelper.unifyPreferences(url, currTab.id))
-			}
-		})
-	})
-}
-
 function switchInstance(test) {
 	return new Promise(resolve => {
 		browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
@@ -412,41 +252,12 @@ function switchInstance(test) {
 	})
 }
 
-function latency(service, frontend, document, location) {
-	let latencyElement = document.getElementById(`latency-${frontend}`)
-	let latencyLabel = document.getElementById(`latency-${frontend}-label`)
-	latencyElement.addEventListener("click", async () => {
-		let reloadWindow = () => location.reload()
-		latencyElement.addEventListener("click", reloadWindow)
-		browser.storage.local.get("redirects", r => {
-			let redirects = r.redirects
-			const oldHtml = latencyLabel.innerHTML
-			latencyLabel.innerHTML = "..."
-			testLatency(latencyLabel, redirects[frontend].clearnet, frontend).then(r => {
-				const frontendLatency = r
-				browser.storage.local.get("latency", r => {
-					let latency = r.latency
-					latency[frontend] = frontendLatency
-					browser.storage.local.set({ latency })
-					latencyLabel.innerHTML = oldHtml
-					processDefaultCustomInstances(service, frontend, "clearnet", document)
-					latencyElement.removeEventListener("click", reloadWindow)
-				})
-			})
-		})
-	})
-}
-
 export default {
 	getRandomInstance,
 	updateInstances,
 	protocolHost,
 	processDefaultCustomInstances,
-	latency,
-	copyCookie,
-	getPreferencesFromToken,
 	switchInstance,
 	copyRaw,
-	unify,
 	camelCase,
 }
diff --git a/src/config/config.json b/src/config/config.json
index 011347f5..31940b2b 100644
--- a/src/config/config.json
+++ b/src/config/config.json
@@ -21,14 +21,6 @@
 		"youtube": {
 			"frontends": {
 				"invidious": {
-					"preferences": {
-						"cookies": [
-							"PREFS"
-						],
-						"localstorage": [
-							"dark_mode"
-						]
-					},
 					"name": "Invidious",
 					"embeddable": true,
 					"instanceList": true
@@ -38,29 +30,6 @@
 						1,
 						2
 					],
-					"preferences": {
-						"localstorage": [
-							"bufferGoal",
-							"comments",
-							"disableLBRY",
-							"enabledCodecs",
-							"hl",
-							"homepage",
-							"instance",
-							"listen",
-							"minimizeDescription",
-							"playerAutoPlay",
-							"proxyLBRY",
-							"quality",
-							"region",
-							"selectedSkip",
-							"sponsorblock",
-							"theme",
-							"volume",
-							"watchHistory",
-							"localSubscriptions"
-						]
-					},
 					"name": "Piped",
 					"embeddable": true,
 					"instanceList": true
@@ -70,21 +39,11 @@
 						1,
 						2
 					],
-					"preferences": {
-						"localstorage": [
-							"PREFERENCES"
-						]
-					},
 					"name": "Piped-Material",
 					"embeddable": false,
 					"instanceList": true
 				},
 				"cloudtube": {
-					"preferences": {
-						"token": "token",
-						"fetchEndpoint": "/api/settings",
-						"setEndpoint": "/settings"
-					},
 					"name": "CloudTube",
 					"embeddable": false,
 					"instanceList": true
@@ -130,30 +89,10 @@
 		"youtubeMusic": {
 			"frontends": {
 				"beatbump": {
-					"preferences": {
-						"localstorage": [
-							"settings"
-						],
-						"indexeddb": "beatbump"
-					},
 					"name": "Beatbump",
 					"instanceList": true
 				},
 				"hyperpipe": {
-					"preferences": {
-						"localstorage": [
-							"api",
-							"authapi",
-							"codec",
-							"locale",
-							"next",
-							"pipedapi",
-							"quality",
-							"theme",
-							"vol"
-						],
-						"indexeddb": "hyperpipedb"
-					},
 					"name": "Hyperpipe",
 					"instanceList": true
 				}
@@ -173,27 +112,6 @@
 		"twitter": {
 			"frontends": {
 				"nitter": {
-					"preferences": {
-						"cookies": [
-							"autoplayGifs",
-							"bidiSupport",
-							"hideBanner",
-							"hidePins",
-							"hideReplies",
-							"hideTweetStats",
-							"hlsPlayback",
-							"infiniteScroll",
-							"mp4Playback",
-							"muteVideos",
-							"proxyVideos",
-							"replaceInstagram",
-							"replaceReddit",
-							"replaceTwitter",
-							"replaceYouTube",
-							"squareAvatars",
-							"theme"
-						]
-					},
 					"name": "Nitter",
 					"embeddable": true,
 					"instanceList": true
@@ -217,11 +135,6 @@
 		"instagram": {
 			"frontends": {
 				"bibliogram": {
-					"preferences": {
-						"token": "token",
-						"fetchEndpoint": "/settings.json",
-						"setEndpoint": "/applysettings"
-					},
 					"name": "Bibliogram",
 					"instanceList": true
 				}
@@ -240,12 +153,6 @@
 		"tiktok": {
 			"frontends": {
 				"proxiTok": {
-					"preferences": {
-						"cookies": [
-							"api-test_endpoints",
-							"theme"
-						]
-					},
 					"name": "ProxiTok",
 					"instanceList": true
 				}
@@ -264,46 +171,10 @@
 		"reddit": {
 			"frontends": {
 				"libreddit": {
-					"preferences": {
-						"cookies": [
-							"theme",
-							"front_page",
-							"layout",
-							"wide",
-							"post_sort",
-							"comment_sort",
-							"show_nsfw",
-							"autoplay_videos",
-							"use_hls",
-							"hide_hls_notification",
-							"subscriptions",
-							"filters"
-						]
-					},
 					"name": "Libreddit",
 					"instanceList": true
 				},
 				"teddit": {
-					"preferences": {
-						"cookies": [
-							"collapse_child_comments",
-							"default_comment_sort",
-							"domain_instagram",
-							"domain_twitter",
-							"domain_youtube",
-							"flairs",
-							"highlight_controversial",
-							"nsfw_enabled",
-							"post_media_max_height",
-							"prefer_frontpage",
-							"show_large_gallery_images",
-							"show_upvoted_percentage",
-							"show_upvotes",
-							"subbed_subreddits",
-							"theme",
-							"videos_muted"
-						]
-					},
 					"name": "Teddit",
 					"instanceList": true
 				}
@@ -343,12 +214,6 @@
 		"wikipedia": {
 			"frontends": {
 				"wikiless": {
-					"preferences": {
-						"cookies": [
-							"theme",
-							"default_lang"
-						]
-					},
 					"name": "Wikiless",
 					"instanceList": true
 				}
@@ -402,11 +267,6 @@
 		"quora": {
 			"frontends": {
 				"quetre": {
-					"preferences": {
-						"localstorage": [
-							"theme"
-						]
-					},
 					"name": "Quetre",
 					"instanceList": true
 				}
@@ -425,11 +285,6 @@
 		"imdb": {
 			"frontends": {
 				"libremdb": {
-					"preferences": {
-						"localstorage": [
-							"theme"
-						]
-					},
 					"name": "libremdb",
 					"instanceList": true
 				}
@@ -500,20 +355,6 @@
 		"lbry": {
 			"frontends": {
 				"librarian": {
-					"preferences": {
-						"cookies": [
-							"nsfw",
-							"theme"
-						],
-						"localstorage": [
-							"autoplay",
-							"autoplayNextVid",
-							"collapseComments",
-							"plyr",
-							"sb_categories",
-							"showRelated"
-						]
-					},
 					"name": "Librarian",
 					"embeddable": true,
 					"instanceList": true
@@ -542,55 +383,10 @@
 		"search": {
 			"frontends": {
 				"searx": {
-					"preferences": {
-						"cookies": [
-							"advanced_search",
-							"autocomplete",
-							"categories",
-							"disabled_engines",
-							"disabled_plugins",
-							"doi_resolver",
-							"enabled_engines",
-							"enabled_plugins",
-							"image_proxy",
-							"language",
-							"locale",
-							"method",
-							"oscar-style",
-							"results_on_new_tab",
-							"safesearch",
-							"theme",
-							"tokens"
-						]
-					},
 					"name": "SearX",
 					"instanceList": true
 				},
 				"searxng": {
-					"preferences": {
-						"cookies": [
-							"autocomplete",
-							"categories",
-							"center_alignment",
-							"disabled_engines",
-							"disabled_plugins",
-							"doi_resolver",
-							"enabled_plugins",
-							"enabled_engines",
-							"image_proxy",
-							"infinite_scroll",
-							"language",
-							"locale",
-							"maintab",
-							"method",
-							"query_in_title",
-							"results_on_new_tab",
-							"safesearch",
-							"simple_style",
-							"theme",
-							"tokens"
-						]
-					},
 					"name": "SearXNG",
 					"instanceList": true
 				},
@@ -599,20 +395,6 @@
 					"instanceList": true
 				},
 				"librex": {
-					"preferences": {
-						"cookies": [
-							"bibliogram",
-							"disable_frontends",
-							" disable_special",
-							"invidious",
-							"libreddit",
-							"nitter",
-							"proxitok",
-							"save",
-							"theme",
-							"wikiless"
-						]
-					},
 					"name": "LibreX",
 					"instanceList": true
 				}
@@ -632,26 +414,10 @@
 		"translate": {
 			"frontends": {
 				"simplyTranslate": {
-					"preferences": {
-						"cookies": [
-							"from_lang",
-							"to_lang",
-							"tts_enabled",
-							"use_text_fields"
-						]
-					},
 					"name": "SimplyTranslate",
 					"instanceList": true
 				},
 				"lingva": {
-					"preferences": {
-						"localstorage": [
-							"isauto",
-							"source",
-							"target",
-							"chakra-ui-color-mode"
-						]
-					},
 					"name": "Lingva Translate",
 					"instanceList": true
 				},
@@ -743,9 +509,6 @@
 		},
 		"authenticate": {
 			"color": "orange"
-		},
-		"offline": {
-			"color": "grey"
 		}
 	}
 }
\ No newline at end of file
diff --git a/src/instances/get_instances.py b/src/instances/get_instances.py
index 913ee1c4..65b1fc44 100755
--- a/src/instances/get_instances.py
+++ b/src/instances/get_instances.py
@@ -117,21 +117,6 @@ def is_authenticate(url):
         return False
     return False
 
-
-def is_offline(url):
-    try:
-        r = requests.get(url, timeout=5, headers=headers)
-        if r.status_code >= 400:
-            print(url + ' is ' + Fore.RED + 'offline' + Style.RESET_ALL)
-            print("Status code")
-            print(r.status_code)
-            return True
-        else:
-            return False
-    except Exception:
-        return False
-
-
 def fetchCache(frontend, name):
     try:
         with open('./src/instances/data.json') as file:
@@ -524,7 +509,6 @@ mightyList = idnaEncode(mightyList)
 
 cloudflare = []
 authenticate = []
-offline = []
 for k1, v1 in mightyList.items():
     if type(mightyList[k1]) is dict:
         for k2, v2 in mightyList[k1].items():
@@ -537,15 +521,12 @@ for k1, v1 in mightyList.items():
                         cloudflare.append(instance)
                     if not instance.endswith('.onion') and not instance.endswith('.i2p') and not instance.endswith('.loki') and is_authenticate(instance):
                         authenticate.append(instance)
-                    elif not instance.endswith('.onion') and not instance.endswith('.i2p') and not instance.endswith('.loki') and is_offline(instance):
-                        offline.append(instance)
 
 peertube()
 
 blacklist = {
     'cloudflare': cloudflare,
     'authenticate': authenticate,
-    'offline': offline
 }
 
 # Writing to file
diff --git a/src/manifest.json b/src/manifest.json
index 00c50165..2730d161 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -19,7 +19,7 @@
 		"48": "assets/images/libredirect-48.png",
 		"128": "assets/images/libredirect-128.png"
 	},
-	"permissions": ["webRequest", "webRequestBlocking", "storage", "unlimitedStorage", "cookies", "clipboardWrite", "contextMenus", "<all_urls>"],
+	"permissions": ["webRequest", "webRequestBlocking", "storage", "unlimitedStorage", "clipboardWrite", "contextMenus", "<all_urls>"],
 	"browser_action": {
 		"default_title": "__MSG_extensionName__",
 		"browser_style": false,
@@ -58,12 +58,6 @@
 				"default": "Alt+Shift+C"
 			},
 			"description": "Copies the original link. Ex: Copies the original twitter link while in the nitter website"
-		},
-		"unify": {
-			"suggested_key": {
-				"default": "Alt+Shift+U"
-			},
-			"description": "Copies the preferences (cookies, localStorage) from the current opened instance and copy them to all the other selected instances"
 		}
 	},
 	"default_locale": "en",
diff --git a/src/pages/background/background.js b/src/pages/background/background.js
index 3a695048..2db6dc0d 100644
--- a/src/pages/background/background.js
+++ b/src/pages/background/background.js
@@ -89,47 +89,9 @@ browser.tabs.onRemoved.addListener(tabId => {
 	}
 })
 
-async function redirectOfflineInstance(url, tabId) {
-	let newUrl = await servicesHelper.switchInstance(url, true)
-
-	if (newUrl) {
-		if (counter >= 5) {
-			browser.tabs.update(tabId, {
-				url: `/pages/errors/instance_offline.html?url=${encodeURIComponent(newUrl)}`,
-			})
-			counter = 0
-		} else {
-			browser.tabs.update(tabId, { url: newUrl })
-			counter++
-		}
-	}
-}
-let counter = 0
-
-function isAutoRedirect() {
-	return new Promise(resolve => browser.storage.local.get("options", r => resolve(r.options.autoRedirect == true)))
-}
-
-browser.webRequest.onResponseStarted.addListener(
-	async details => {
-		if (!(await isAutoRedirect())) return null
-		if (details.type == "main_frame" && details.statusCode >= 500) redirectOfflineInstance(new URL(details.url), details.tabId)
-	},
-	{ urls: ["<all_urls>"] }
-)
-
-browser.webRequest.onErrorOccurred.addListener(
-	async details => {
-		if (!(await isAutoRedirect())) return
-		if (details.type == "main_frame") redirectOfflineInstance(new URL(details.url), details.tabId)
-	},
-	{ urls: ["<all_urls>"] }
-)
-
 browser.commands.onCommand.addListener(command => {
 	if (command === "switchInstance") utils.switchInstance()
 	else if (command == "copyRaw") utils.copyRaw()
-	else if (command == "unify") utils.unify()
 })
 
 browser.contextMenus.create({
@@ -150,12 +112,6 @@ browser.contextMenus.create({
 	contexts: ["browser_action"],
 })
 
-browser.contextMenus.create({
-	id: "unify",
-	title: browser.i18n.getMessage("unifySettings"),
-	contexts: ["browser_action"],
-})
-
 try {
 	browser.contextMenus.create({
 		id: "toggleTab",
@@ -207,10 +163,6 @@ browser.contextMenus.onClicked.addListener((info, tab) => {
 				utils.copyRaw()
 				resolve()
 				return
-			case "unify":
-				utils.unify()
-				resolve()
-				return
 			case "toggleTab":
 				if (tabIdRedirects[tab.id] != undefined) {
 					tabIdRedirects[tab.id] = !tabIdRedirects[tab.id]
@@ -253,9 +205,4 @@ browser.webRequest.onHeadersReceived.addListener(
 	},
 	{ urls: ["<all_urls>"] },
 	["blocking", "responseHeaders"]
-)
-
-browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
-	if (message.function === "unify") utils.unify(false).then(r => sendResponse({ response: r }))
-	return true
-})
+)
\ No newline at end of file
diff --git a/src/pages/errors/instance_offline.html b/src/pages/errors/instance_offline.html
deleted file mode 100644
index a74caec2..00000000
--- a/src/pages/errors/instance_offline.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<meta charset="UTF-8" />
-		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
-		<meta name="viewport" content="width=device-width, initial-scale=1" />
-		<title data-localise="__MSG_instanceIsOff__">Instance is offline</title>
-		<link href="../stylesheets/styles.css" rel="stylesheet" />
-		<style>
-			body {
-				margin: 0;
-				padding: 0;
-				height: 100vh;
-				width: 100vw;
-				flex-wrap: wrap;
-				justify-content: center;
-				align-items: center;
-				font-size: 30px;
-				display: flex;
-			}
-
-			div {
-				text-align: center;
-			}
-		</style>
-	</head>
-
-	<body>
-		<div>
-			<p id="message">
-				<span data-localise="__MSG_instanceOffline__">This instance is offline, you'll be redirected after</span>
-				<span id="number">2</span> <x data-localise="__MSG_sec__">seconds</x>
-			</p>
-			<button id="cancel" data-localise="__MSG_cancel__">Cancel</button>
-		</div>
-
-		<script src="instance_offline.js" type="module"></script>
-	</body>
-</html>
diff --git a/src/pages/errors/instance_offline.js b/src/pages/errors/instance_offline.js
deleted file mode 100644
index fadb7681..00000000
--- a/src/pages/errors/instance_offline.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import localise from "../../assets/javascripts/localise.js"
-
-const params = new Proxy(new URLSearchParams(window.location.search), {
-	get: (searchParams, prop) => searchParams.get(prop),
-})
-
-let number = document.getElementById("number")
-setTimeout(() => (number.innerHTML = "1"), 1000)
-setTimeout(() => {
-	number.innerHTML = "0"
-	if (!isCanceled) window.location = params.url
-}, 2000)
-
-let isCanceled = false
-document.getElementById("cancel").addEventListener("click", () => {
-	isCanceled = true
-	document.getElementById("message").innerHTML = browser.i18n.getMessage("redirectionCanceled")
-})
-
-localise.localisePage()
diff --git a/src/pages/options/widgets/general.ejs b/src/pages/options/widgets/general.ejs
index fef052df..6bb15bca 100644
--- a/src/pages/options/widgets/general.ejs
+++ b/src/pages/options/widgets/general.ejs
@@ -14,37 +14,6 @@
   </div>
 
   <div class="some-block option-block">
-    <h4 data-localise="__MSG_network__">Network</h4>
-    <select id="network">
-      <% for (const network in config.networks) { -%>
-      <option value="<%= network %>"><%= config.networks[network].name %></option>
-      <% }; %>
-    </select>
-  </div>
-
-  <div id="network-fallback">
-    <div class="some-block option-block">
-      <h4 data-localise="__MSG_networkFallback__">Fallback to clearnet if no instances are available for the current network</h4>
-      <input id="network-fallback-checkbox" type="checkbox" />
-    </div>
-  </div>
-
-  <div class="some-block option-block">
-    <h4 data-localise="__MSG_autoRedirect__"></h4>
-    <input id="auto-redirect" type="checkbox" />
-  </div>
-
-  <form>
-    <div class="some-block option-block">
-      <h4 data-localise="__MSG_latencyThreshold">Latency Threshold</h4>
-      <output id="latency-output" for="latencyInput" name="latencyOutput"></output>
-      <input id="latency-input" type="range" min="50" max="5000" value="1000" name="latencyInput" step="50" />
-    </div>
-  </form>
-
-  <hr>
-
-  <div class="some-block option-block">
     <h4 data-localise="__MSG_exclude_from_redirecting_">Excluded from redirecting</h4>
   </div>
 
diff --git a/src/pages/options/widgets/general.js b/src/pages/options/widgets/general.js
index d55f8f0d..a8eb11fb 100644
--- a/src/pages/options/widgets/general.js
+++ b/src/pages/options/widgets/general.js
@@ -121,37 +121,12 @@ resetSettings.addEventListener("click", async () => {
 	})
 })
 
-let autoRedirectElement = document.getElementById("auto-redirect")
-autoRedirectElement.addEventListener("change", event => {
-	setOption("autoRedirect", "checkbox", event)
-})
-
 let themeElement = document.getElementById("theme")
 themeElement.addEventListener("change", event => {
 	setOption("theme", "select", event)
 	location.reload()
 })
 
-let networkElement = document.getElementById("network")
-networkElement.addEventListener("change", event => {
-	setOption("network", "select", event)
-	location.reload()
-})
-
-let networkFallbackCheckbox = document.getElementById("network-fallback-checkbox")
-networkFallbackCheckbox.addEventListener("change", event => {
-	setOption("networkFallback", "checkbox", event)
-})
-
-let latencyOutput = document.getElementById("latency-output")
-let latencyInput = document.getElementById("latency-input")
-latencyInput.addEventListener("change", event => {
-	setOption("latencyThreshold", "range", event)
-})
-latencyInput.addEventListener("input", event => {
-	latencyOutput.value = event.target.value
-})
-
 let nameCustomInstanceInput = document.getElementById("exceptions-custom-instance")
 let instanceTypeElement = document.getElementById("exceptions-custom-instance-type")
 let instanceType = "url"
@@ -173,20 +148,9 @@ for (const service in config.services) {
 }
 
 browser.storage.local.get("options", r => {
-	autoRedirectElement.checked = r.options.autoRedirect
 	themeElement.value = r.options.theme
-	networkElement.value = r.options.network
-	networkFallbackCheckbox.checked = r.options.networkFallback
-	latencyOutput.value = r.options.latencyThreshold
 	let options = r.options
 
-	//let networkFallbackElement = document.getElementById("network-fallback")
-	if (networkElement.value == "clearnet") {
-		networkFallbackCheckbox.disabled = true
-	} else {
-		networkFallbackCheckbox.disabled = false
-	}
-
 	instanceTypeElement.addEventListener("change", event => {
 		instanceType = event.target.options[instanceTypeElement.selectedIndex].value
 		if (instanceType == "url") {
diff --git a/src/pages/options/widgets/services.ejs b/src/pages/options/widgets/services.ejs
index 109f6689..ea93b1ce 100644
--- a/src/pages/options/widgets/services.ejs
+++ b/src/pages/options/widgets/services.ejs
@@ -44,16 +44,6 @@
   <% for (const frontend in config.services[service].frontends) { -%> <% if (config.services[service].frontends[frontend].instanceList) { _%>
   <div id="<%= frontend %>">
     <% for (const network in config.networks) { -%>
-    <div class="buttons buttons-inline">
-      <label class="button button-inline" id="latency-<%= frontend %>-label" for="latency-<%= frontend %>">
-        <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
-          <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
-        </svg>
-        &nbsp;
-        <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
-      </label>
-      <input class="button button-inline" id="latency-<%= frontend %>" style="display: none" />
-    </div>
     <div class="<%= network %>">
       <div class="some-block option-block">
         <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
diff --git a/src/pages/options/widgets/services.js b/src/pages/options/widgets/services.js
index 12904130..351d45e5 100644
--- a/src/pages/options/widgets/services.js
+++ b/src/pages/options/widgets/services.js
@@ -108,7 +108,6 @@ for (const service in config.services) {
 			for (const network in config.networks) {
 				utils.processDefaultCustomInstances(service, frontend, network, document)
 			}
-			utils.latency(service, frontend, document, location)
 		}
 	}
 }
diff --git a/src/pages/popup/popup.ejs b/src/pages/popup/popup.ejs
index e6cc6fca..72c96d60 100644
--- a/src/pages/popup/popup.ejs
+++ b/src/pages/popup/popup.ejs
@@ -1,55 +1,53 @@
 <!DOCTYPE html>
 <html lang="en">
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <link href="../stylesheets/styles.css" rel="stylesheet">
-    <link href="./style.css" rel="stylesheet">
-  </head>
-  <body dir="auto">
-    <div class="current_site">
-      <div class="some-block" id="instance-div"><a class="title prevent">
-          <%- include('src/assets/images/instance-icon.svg', {services: services}) -%>
-          <h4 id="instance"></h4>
-        </a>
-        <span id="end"><input type="checkbox" id="instance-enabled"/></span>
-      </div>
-      <%- include('src/pages/widgets/switches', {services: services}) -%>
-      <div id="current_site_divider">
-        <hr>
-      </div>
+
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="../stylesheets/styles.css" rel="stylesheet">
+  <link href="./style.css" rel="stylesheet">
+</head>
+
+<body dir="auto">
+  <div class="current_site">
+    <%- include('src/pages/widgets/switches', {services: services}) -%>
+    <div id="current_site_divider">
+      <hr>
     </div>
-    <div class="all_sites">
-      <%- include('src/pages/widgets/switches', {services: services}) -%>
-    </div>
-    <hr>
-    <div class="some-block" id="change_instance_div"><a class="title button prevent" id="change_instance">
-        <h4 data-localise="__MSG_switchInstance__">Change Instance</h4>
-        <svg xmlns="http://www.w3.org/2000/svg" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
-          <path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"></path>
-        </svg></a></div>
-    <div class="some-block" id="copy_raw_div" title="Copy the original redirected link">        <a class="title button prevent" id="copy_raw">
-        <h4 data-localise="__MSG_copyRaw__">Copy Raw</h4>
-        <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
-          <path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"></path>
-        </svg></a></div>
-    <div class="some-block" id="unify_div" title="Unify preferences across all selected instances"><a class="title button prevent" id="unify">
-        <h4 data-localise="__MSG_unifySettings__">Unify Settings</h4>
-        <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
-          <path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path>
-        </svg></a></div>
-    <div class="some-block"><a class="title button prevent" id="more-options">
-        <h4 data-localise="__MSG_settings__">Settings</h4>
-        <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
-          <path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"></path>
-        </svg></a></div>
-    <div class="some-block"><a class="title button" id="about" href="/pages/options/index.html#about">
-        <h4 data-localise="__MSG_about__">About</h4>
-        <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" fill="currentColor">
-          <path d="M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3a.35 2.325 5.675Q8.65 20 12 20Zm0-8Z"></path>
-        </svg></a></div>
-    <div class="space"></div>
-    <script type="module" src="../options/init.js"></script>
-    <script type="module" src="./popup.js"></script>
-  </body>
-</html>
+  </div>
+  <div class="all_sites">
+    <%- include('src/pages/widgets/switches', {services: services}) -%>
+  </div>
+  <hr>
+  <div class="some-block" id="change_instance_div">
+    <a class="title button prevent" id="change_instance">
+      <h4 data-localise="__MSG_switchInstance__">Change Instance</h4>
+      <svg xmlns="http://www.w3.org/2000/svg" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
+        <path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"></path>
+      </svg>
+    </a>
+  </div>
+  <div class="some-block" id="copy_raw_div" title="Copy the original redirected link"> <a class="title button prevent" id="copy_raw">
+      <h4 data-localise="__MSG_copyRaw__">Copy Raw</h4>
+      <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+        <path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"></path>
+      </svg>
+    </a></div>
+  <div class="some-block"><a class="title button prevent" id="more-options">
+      <h4 data-localise="__MSG_settings__">Settings</h4>
+      <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
+        <path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"></path>
+      </svg>
+    </a></div>
+  <div class="some-block"><a class="title button" id="about" href="/pages/options/index.html#about">
+      <h4 data-localise="__MSG_about__">About</h4>
+      <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" fill="currentColor">
+        <path d="M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3a.35 2.325 5.675Q8.65 20 12 20Zm0-8Z"></path>
+      </svg>
+    </a></div>
+  <div class="space"></div>
+  <script type="module" src="../options/init.js"></script>
+  <script type="module" src="./popup.js"></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/src/pages/popup/popup.js b/src/pages/popup/popup.js
index 88c1433b..1ac804d0 100644
--- a/src/pages/popup/popup.js
+++ b/src/pages/popup/popup.js
@@ -39,7 +39,6 @@ const currSite = document.getElementsByClassName("current_site")[0]
 
 function setDivs() {
 	return new Promise(resolve => {
-		divs.instance = document.getElementById("instance")
 		for (const service in config.services) {
 			divs[service] = {}
 			divs[service].toggle = {}
@@ -58,7 +57,6 @@ const currentSiteIsFrontend = document.getElementById("current_site_divider")
 
 browser.storage.local.get(["options", "redirects"], r => {
 	browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
-		document.getElementById("instance-div").classList.add("hide")
 		for (const service in config.services) {
 			if (!r.options.popupServices.includes(service)) allSites.getElementsByClassName(service)[0].classList.add("hide")
 			else allSites.getElementsByClassName(service)[0].classList.remove("hide")
@@ -75,7 +73,6 @@ browser.storage.local.get(["options", "redirects"], r => {
 			url = new URL(tabs[0].url)
 		} catch {
 			currentSiteIsFrontend.classList.add("hide")
-			document.getElementById("unify_div").style.display = "none"
 			return
 		}
 
@@ -89,51 +86,11 @@ browser.storage.local.get(["options", "redirects"], r => {
 				service = service[0]
 				let isCustom = false
 				for (const network in config.networks) if (r.options[frontend][network].custom.indexOf(instance) > -1) isCustom = true
-				if (!isCustom) {
-					divs.instance.innerHTML = instance.replace(/https?:\/{2}/, "")
-					let tmp
-					let instanceNetwork
-					for (const network in config.networks) {
-						tmp = r.redirects[frontend][network].indexOf(instance)
-						if (tmp > -1) {
-							const instanceDiv = document.getElementById("instance-enabled")
-							tmp = r.options[frontend][network].enabled.indexOf(instance)
-							if (tmp > -1) instanceDiv.checked = true
-							else instanceDiv.checked = false
-							instanceNetwork = network
-							instanceDiv.addEventListener("change", () => {
-								browser.storage.local.get("options", r => {
-									// Although options would be available in this context, it is fetched again to make sure it is up to date
-									let options = r.options
-									if (instanceDiv.checked) options[frontend][instanceNetwork].enabled.push(instance)
-									else options[frontend][instanceNetwork].enabled.splice(options[frontend][instanceNetwork].enabled.indexOf(instance), 1)
-									browser.storage.local.set({ options })
-								})
-							})
-							break
-						}
-					}
-					document.getElementById("instance-div").classList.remove("hide")
-				}
 			}
 			divs[service].current.classList.remove("hide")
 			divs[service].all.classList.add("hide")
-			if (frontend && config.services[service].frontends[frontend].preferences && !config.services[service].frontends[frontend].preferences.token) {
-				const unify = document.getElementById("unify")
-				const textElement = document.getElementById("unify").getElementsByTagName("h4")[0]
-				unify.addEventListener("click", () => {
-					const oldHtml = textElement.innerHTML
-					textElement.innerHTML = "..."
-					browser.runtime.sendMessage({ function: "unify" }, response => {
-						if (response && response.response) textElement.innerHTML = oldHtml
-					})
-				})
-			} else {
-				document.getElementById("unify_div").style.display = "none"
-			}
 		} else {
 			currentSiteIsFrontend.classList.add("hide")
-			document.getElementById("unify_div").style.display = "none"
 		}
 	})
 })