about summary refs log tree commit diff stats
path: root/src/assets/javascripts/helpers
diff options
context:
space:
mode:
Diffstat (limited to 'src/assets/javascripts/helpers')
-rw-r--r--src/assets/javascripts/helpers/general.js71
-rw-r--r--src/assets/javascripts/helpers/imgur.js191
-rw-r--r--src/assets/javascripts/helpers/instagram.js166
-rw-r--r--src/assets/javascripts/helpers/lbry.js156
-rw-r--r--src/assets/javascripts/helpers/maps.js212
-rw-r--r--src/assets/javascripts/helpers/medium.js174
-rw-r--r--src/assets/javascripts/helpers/peertube.js155
-rw-r--r--src/assets/javascripts/helpers/reddit.js378
-rw-r--r--src/assets/javascripts/helpers/search.js470
-rw-r--r--src/assets/javascripts/helpers/sendTargets.js149
-rw-r--r--src/assets/javascripts/helpers/tiktok.js175
-rw-r--r--src/assets/javascripts/helpers/translate/get_lingva_preferences.js10
-rw-r--r--src/assets/javascripts/helpers/translate/set_lingva_preferences.js19
-rw-r--r--src/assets/javascripts/helpers/translate/translate.js295
-rw-r--r--src/assets/javascripts/helpers/twitter.js241
-rw-r--r--src/assets/javascripts/helpers/utils.js456
-rw-r--r--src/assets/javascripts/helpers/wikipedia.js220
-rw-r--r--src/assets/javascripts/helpers/youtube/get_pipedMaterial_preferences.js7
-rw-r--r--src/assets/javascripts/helpers/youtube/get_piped_preferences.js24
-rw-r--r--src/assets/javascripts/helpers/youtube/set_pipedMaterial_preferences.js10
-rw-r--r--src/assets/javascripts/helpers/youtube/set_piped_preferences.js44
-rw-r--r--src/assets/javascripts/helpers/youtube/youtube.js453
-rw-r--r--src/assets/javascripts/helpers/youtubeMusic.js97
23 files changed, 0 insertions, 4173 deletions
diff --git a/src/assets/javascripts/helpers/general.js b/src/assets/javascripts/helpers/general.js
deleted file mode 100644
index 199d884c..00000000
--- a/src/assets/javascripts/helpers/general.js
+++ /dev/null
@@ -1,71 +0,0 @@
-"use strict";
-window.browser = window.browser || window.chrome;
-
-function isException(url) {
-    for (const item of exceptions.url)
-        if (item == `${url.protocol}//${url.host}`) return true;
-    for (const item of exceptions.regex)
-        if (new RegExp(item).test(url.href)) return true;
-    return false;
-}
-
-let exceptions;
-
-function init() {
-    browser.storage.local.get(
-        'exceptions',
-        r => {
-            exceptions = r.exceptions;
-        }
-    )
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-async function initDefaults() {
-    await browser.storage.local.set({
-        exceptions: {
-            "url": [],
-            "regex": [],
-        },
-        theme: "DEFAULT",
-        popupFrontends: [
-            "youtube",
-            "twitter",
-            "instagram",
-            "tikTok",
-            "imgur",
-            "reddit",
-            "search",
-            "medium",
-            "translate",
-            "maps",
-        ],
-        autoRedirect: false,
-    })
-}
-
-const allPopupFrontends = [
-    "youtube",
-    "youtubeMusic",
-    "twitter",
-    "instagram",
-    "tikTok",
-    "imgur",
-    "reddit",
-    "search",
-    "translate",
-    "maps",
-    "wikipedia",
-    "medium",
-    "peertube",
-    "lbry",
-    "sendTargets"
-];
-
-export default {
-    isException,
-    initDefaults,
-    allPopupFrontends,
-}
diff --git a/src/assets/javascripts/helpers/imgur.js b/src/assets/javascripts/helpers/imgur.js
deleted file mode 100644
index 9f93f362..00000000
--- a/src/assets/javascripts/helpers/imgur.js
+++ /dev/null
@@ -1,191 +0,0 @@
-window.browser = window.browser || window.chrome;
-
-import utils from './utils.js'
-
-const targets = /^https?:\/{2}([im]\.)?imgur\.com(\/|$)/
-
-let redirects = {
-    "rimgo": {
-        "normal": [],
-        "tor": [],
-        "i2p": []
-    }
-}
-function setRedirects() {
-    return new Promise(resolve => {
-        fetch('/instances/data.json').then(response => response.text()).then(async data => {
-            let dataJson = JSON.parse(data);
-            redirects.rimgo = dataJson.rimgo;
-
-            rimgoNormalRedirectsChecks = [...redirects.rimgo.normal];
-            rimgoTorRedirectsChecks = [...redirects.rimgo.tor];
-            rimgoI2pRedirectsChecks = [...redirects.rimgo.i2p];
-
-            for (const instance of r.cloudflareList) {
-                const a = rimgoNormalRedirectsChecks.indexOf(instance);
-                if (a > -1) rimgoNormalRedirectsChecks.splice(a, 1);
-
-                const b = rimgoTorRedirectsChecks.indexOf(instance);
-                if (b > -1) rimgoTorRedirectsChecks.splice(b, 1);
-
-                const c = rimgoI2pRedirectsChecks.indexOf(instance);
-                if (c > -1) rimgoI2pRedirectsChecks.splice(c, 1);
-            }
-
-            await browser.storage.local.set({
-                imgurRedirects: redirects,
-                rimgoNormalRedirectsChecks,
-                rimgoTorRedirectsChecks,
-                rimgoI2pRedirectsChecks,
-            });
-
-            resolve();
-        })
-    })
-}
-
-let
-    disableImgur,
-    imgurRedirects,
-    imgurProtocol,
-    rimgoNormalRedirectsChecks,
-    rimgoNormalCustomRedirects,
-    rimgoTorRedirectsChecks,
-    rimgoTorCustomRedirects,
-    rimgoI2pRedirectsChecks,
-    rimgoI2pCustomRedirects;
-
-function init() {
-    return new Promise(async resolve => {
-        browser.storage.local.get(
-            [
-                "disableImgur",
-                "imgurRedirects",
-                "imgurProtocol",
-                "rimgoNormalRedirectsChecks",
-                "rimgoNormalCustomRedirects",
-                "rimgoTorRedirectsChecks",
-                "rimgoTorCustomRedirects",
-                "rimgoI2pRedirectsChecks",
-                "rimgoI2pCustomRedirects",
-            ],
-            r => {
-                disableImgur = r.disableImgur;
-                imgurRedirects = r.imgurRedirects;
-                imgurProtocol = r.imgurProtocol;
-                rimgoNormalRedirectsChecks = r.rimgoNormalRedirectsChecks;
-                rimgoNormalCustomRedirects = r.rimgoNormalCustomRedirects;
-                rimgoTorRedirectsChecks = r.rimgoTorRedirectsChecks;
-                rimgoTorCustomRedirects = r.rimgoTorCustomRedirects;
-                rimgoI2pRedirectsChecks = r.rimgoI2pRedirectsChecks;
-                rimgoI2pCustomRedirects = r.rimgoI2pCustomRedirects;
-                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,
-    ];
-}
-
-function redirect(url, type, initiator) {
-    if (disableImgur) return;
-    if (url.pathname == "/") 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 (imgurProtocol == 'normal') instancesList = [...rimgoNormalRedirectsChecks, ...rimgoNormalCustomRedirects];
-    if (imgurProtocol == 'tor') instancesList = [...rimgoTorRedirectsChecks, ...rimgoTorCustomRedirects];
-    if (imgurProtocol == 'i2p') instancesList = [...rimgoI2pRedirectsChecks, ...rimgoI2pCustomRedirects];
-    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) {
-    return new Promise(async resolve => {
-        await init();
-        let protocolHost = utils.protocolHost(url);
-        if (!all().includes(protocolHost)) { resolve(); return; }
-        let instancesList;
-        if (imgurProtocol == 'normal') instancesList = [...rimgoNormalCustomRedirects, ...rimgoNormalRedirectsChecks];
-        else if (imgurProtocol == 'tor') instancesList = [...rimgoTorCustomRedirects, ...rimgoTorRedirectsChecks];
-        else if (imgurProtocol == 'i2p') instancesList = [...rimgoI2pCustomRedirects, ...rimgoI2pRedirectsChecks];
-
-        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);
-            redirects.rimgo = dataJson.rimgo;
-            browser.storage.local.get('cloudflareList', async r => {
-                rimgoNormalRedirectsChecks = [...redirects.rimgo.normal];
-                for (const instance of r.cloudflareList) {
-                    const i = rimgoNormalRedirectsChecks.indexOf(instance);
-                    if (i > -1) rimgoNormalRedirectsChecks.splice(i, 1);
-                }
-                await browser.storage.local.set({
-                    disableImgur: false,
-                    imgurProtocol: 'normal',
-                    imgurRedirects: redirects,
-
-                    rimgoNormalRedirectsChecks: rimgoNormalRedirectsChecks,
-                    rimgoNormalCustomRedirects: [],
-
-                    rimgoTorRedirectsChecks: [...redirects.rimgo.tor],
-                    rimgoTorCustomRedirects: [],
-
-                    rimgoI2pRedirectsChecks: [...redirects.rimgo.i2p],
-                    rimgoI2pCustomRedirects: [],
-                });
-                resolve();
-            });
-        });
-    });
-}
-
-export default {
-    setRedirects,
-    redirect,
-    reverse,
-    initDefaults,
-    switchInstance,
-};
diff --git a/src/assets/javascripts/helpers/instagram.js b/src/assets/javascripts/helpers/instagram.js
deleted file mode 100644
index f5c54b3a..00000000
--- a/src/assets/javascripts/helpers/instagram.js
+++ /dev/null
@@ -1,166 +0,0 @@
-window.browser = window.browser || window.chrome;
-import utils from './utils.js'
-
-const targets = [
-  "instagram.com",
-  "www.instagram.com",
-];
-let redirects = {
-  "bibliogram": {
-    "normal": [],
-    "tor": []
-  }
-};
-function setRedirects(val) {
-  browser.storage.local.get('cloudflareList', async r => {
-    redirects.bibliogram = val;
-    bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal];
-    for (const instance of r.cloudflareList) {
-      const a = bibliogramNormalRedirectsChecks.indexOf(instance);
-      if (a > -1) bibliogramNormalRedirectsChecks.splice(a, 1);
-    }
-    browser.storage.local.set({
-      instagramRedirects: redirects,
-      bibliogramNormalRedirectsChecks
-    })
-  })
-}
-
-let
-  disableInstagram,
-  instagramProtocol,
-  instagramRedirects,
-  bibliogramNormalRedirectsChecks,
-  bibliogramTorRedirectsChecks,
-  bibliogramNormalCustomRedirects,
-  bibliogramTorCustomRedirects;
-
-function init() {
-  return new Promise(async resolve => {
-    browser.storage.local.get(
-      [
-        "disableInstagram",
-        "instagramProtocol",
-        "instagramRedirects",
-        "bibliogramNormalRedirectsChecks",
-        "bibliogramTorRedirectsChecks",
-        "bibliogramNormalCustomRedirects",
-        "bibliogramTorCustomRedirects",
-      ],
-      r => {
-        disableInstagram = r.disableInstagram;
-        instagramProtocol = r.instagramProtocol;
-        instagramRedirects = r.instagramRedirects;
-        bibliogramNormalRedirectsChecks = r.bibliogramNormalRedirectsChecks;
-        bibliogramTorRedirectsChecks = r.bibliogramTorRedirectsChecks;
-        bibliogramNormalCustomRedirects = r.bibliogramNormalCustomRedirects;
-        bibliogramTorCustomRedirects = r.bibliogramTorCustomRedirects;
-        resolve();
-      }
-    )
-  })
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-function all() {
-  return [
-    ...instagramRedirects.bibliogram.normal,
-    ...instagramRedirects.bibliogram.tor,
-    ...bibliogramNormalCustomRedirects,
-    ...bibliogramTorCustomRedirects,
-  ]
-}
-
-function redirect(url, type, initiator) {
-  if (disableInstagram) return;
-  if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB';
-  if (!targets.includes(url.host)) return;
-  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 (instagramProtocol == 'normal') instancesList = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects];
-  else if (instagramProtocol == 'tor') instancesList = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects];
-  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) {
-  return new Promise(async resolve => {
-    await init();
-    let protocolHost = utils.protocolHost(url);
-    if (!all().includes(protocolHost)) { resolve(); return; }
-
-    let instancesList;
-    if (instagramProtocol == 'normal') instancesList = [...bibliogramNormalCustomRedirects, ...bibliogramNormalRedirectsChecks];
-    else if (instagramProtocol == 'tor') instancesList = [...bibliogramTorCustomRedirects, ...bibliogramTorRedirectsChecks];
-
-    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);
-      redirects.bibliogram = dataJson.bibliogram;
-      browser.storage.local.get('cloudflareList', r => {
-        bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal];
-        for (const instance of r.cloudflareList) {
-          const i = bibliogramNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) bibliogramNormalRedirectsChecks.splice(i, 1);
-        }
-        browser.storage.local.set({
-          disableInstagram: false,
-          instagramRedirects: redirects,
-
-          bibliogramNormalRedirectsChecks: bibliogramNormalRedirectsChecks,
-          bibliogramTorRedirectsChecks: [],
-
-          bibliogramNormalCustomRedirects: [...redirects.bibliogram.tor],
-          bibliogramTorCustomRedirects: [],
-          instagramProtocol: "normal",
-        })
-        resolve();
-      }
-      )
-    })
-  })
-}
-
-export default {
-  setRedirects,
-  reverse,
-  redirect,
-  initDefaults,
-  switchInstance,
-};
diff --git a/src/assets/javascripts/helpers/lbry.js b/src/assets/javascripts/helpers/lbry.js
deleted file mode 100644
index b44cc738..00000000
--- a/src/assets/javascripts/helpers/lbry.js
+++ /dev/null
@@ -1,156 +0,0 @@
-window.browser = window.browser || window.chrome;
-
-import utils from './utils.js'
-
-let targets = ["odysee.com"];
-
-let redirects = {
-    "librarian": {
-        "normal": [
-            "https://lbry.bcow.xyz",
-            "https://odysee.076.ne.jp",
-            "https://lbry.ix.tc",
-            "https://librarian.pussthecat.org",
-            "https://lbry.mutahar.rocks",
-            "https://librarian.esmailelbob.xyz",
-        ],
-        "tor": [
-            "http://ecc5mi5ncdw6mxhjz6re6g2uevtpbzxjvxgrxia2gyvrlnil3srbnhyd.onion",
-            "http://vrmbc4brkgkaysmi3fenbzkayobxjh24slmhtocambn3ewe62iuqt3yd.onion",
-        ]
-    }
-}
-
-function setRedirects(val) {
-    redirects.librarian = val;
-    browser.storage.local.set({ lbryTargetsRedirects: redirects })
-    for (const item of librarianNormalRedirectsChecks)
-        if (!redirects.librarian.normal.includes(item)) {
-            var index = librarianNormalRedirectsChecks.indexOf(item);
-            if (index !== -1) librarianNormalRedirectsChecks.splice(index, 1);
-        }
-    browser.storage.local.set(librarianNormalRedirectsChecks);
-
-    for (const item of librarianTorRedirectsChecks)
-        if (!redirects.librarian.normal.includes(item)) {
-            var index = librarianTorRedirectsChecks.indexOf(item);
-            if (index !== -1) librarianTorRedirectsChecks.splice(index, 1);
-        }
-    browser.storage.local.set(librarianTorRedirectsChecks)
-}
-
-let
-    disableLbryTargets,
-    lbryTargetsProtocol,
-    lbryTargetsRedirects,
-    librarianNormalRedirectsChecks,
-    librarianNormalCustomRedirects,
-    librarianTorRedirectsChecks,
-    librarianTorCustomRedirects;
-
-function init() {
-    return new Promise(resolve => {
-        browser.storage.local.get(
-            [
-                "disableLbryTargets",
-                "lbryTargetsProtocol",
-                "lbryTargetsRedirects",
-                "librarianNormalRedirectsChecks",
-                "librarianNormalCustomRedirects",
-                "librarianTorRedirectsChecks",
-                "librarianTorCustomRedirects",
-            ],
-            r => {
-                disableLbryTargets = r.disableLbryTargets;
-                lbryTargetsProtocol = r.lbryTargetsProtocol;
-                lbryTargetsRedirects = r.lbryTargetsRedirects;
-                librarianNormalRedirectsChecks = r.librarianNormalRedirectsChecks;
-                librarianNormalCustomRedirects = r.librarianNormalCustomRedirects;
-                librarianTorRedirectsChecks = r.librarianTorRedirectsChecks;
-                librarianTorCustomRedirects = r.librarianTorCustomRedirects;
-                resolve();
-            }
-        )
-    })
-}
-init();
-browser.storage.onChanged.addListener(init)
-
-function all() {
-    return [
-        ...redirects.librarian.normal,
-        ...redirects.librarian.tor,
-        ...librarianNormalCustomRedirects,
-        ...librarianTorCustomRedirects,
-    ];
-}
-
-function switchInstance(url) {
-    return new Promise(async resolve => {
-        await init();
-        const protocolHost = utils.protocolHost(url);
-        if (!all().includes(protocolHost)) { resolve(); return; }
-
-        let instancesList;
-        if (lbryTargetsProtocol == 'normal') instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects];
-        else if (lbryTargetsProtocol == 'tor') instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects];
-
-        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) {
-    if (disableLbryTargets) return;
-    if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) return;
-    if (!targets.includes(url.host)) return;
-    if (type != "main_frame") return;
-
-    let instancesList;
-    if (lbryTargetsProtocol == 'normal') instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects];
-    if (lbryTargetsProtocol == 'tor') instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects];
-    if (instancesList.length === 0) return;
-
-    const randomInstance = utils.getRandomInstance(instancesList);
-    return `${randomInstance}${url.pathname}${url.search}`;
-}
-
-function initDefaults() {
-    return new Promise(resolve => {
-        browser.storage.local.get('cloudflareList', async r => {
-            librarianNormalRedirectsChecks = [...redirects.librarian.normal];
-            for (const instance of r.cloudflareList) {
-                let i;
-
-                i = librarianNormalRedirectsChecks.indexOf(instance);
-                if (i > -1) librarianNormalRedirectsChecks.splice(i, 1);
-            }
-            await browser.storage.local.set({
-                disableLbryTargets: true,
-                lbryTargetsRedirects: {
-                    'librarian': redirects.librarian
-                },
-
-                librarianNormalRedirectsChecks: librarianNormalRedirectsChecks,
-                librarianNormalCustomRedirects: [],
-
-                librarianTorRedirectsChecks: [...redirects.librarian.tor],
-                librarianTorCustomRedirects: [],
-
-                lbryTargetsProtocol: "normal",
-            })
-            resolve();
-        })
-    })
-}
-
-export default {
-    setRedirects,
-    switchInstance,
-    redirect,
-    initDefaults,
-};
diff --git a/src/assets/javascripts/helpers/maps.js b/src/assets/javascripts/helpers/maps.js
deleted file mode 100644
index 3ab5e2b6..00000000
--- a/src/assets/javascripts/helpers/maps.js
+++ /dev/null
@@ -1,212 +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\.).*)/;
-
-let redirects = {
-  'osm': {
-    "normal": [
-      "https://openstreetmap.org"
-    ]
-  },
-  'facil': {
-    "normal": [
-      "https://facilmap.org"
-    ]
-  }
-};
-
-
-let
-  disableMaps,
-  mapsFrontend,
-  facilNormalRedirectsChecks,
-  facilNormalCustomRedirects;
-
-function init() {
-  browser.storage.local.get(
-    [
-      "disableMaps",
-      "mapsFrontend",
-      "facilNormalRedirectsChecks",
-      "facilNormalCustomRedirects",
-    ],
-    r => {
-      disableMaps = r.disableMaps;
-      mapsFrontend = r.mapsFrontend;
-      facilNormalRedirectsChecks = r.facilNormalRedirectsChecks;
-      facilNormalCustomRedirects = r.facilNormalCustomRedirects;
-    }
-  )
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, initiator) {
-  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);
-  }
-
-  if (disableMaps) return;
-  if (initiator && initiator.host === "earth.google.com") return;
-  if (!url.href.match(targets)) return;
-
-  let randomInstance;
-  if (mapsFrontend == 'osm') randomInstance = utils.getRandomInstance(redirects.osm.normal);
-  if (mapsFrontend == 'facil') randomInstance = utils.getRandomInstance([...facilNormalRedirectsChecks, ...facilNormalCustomRedirects]);
-
-  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') { resolve(`${randomInstance}/export/embed.html?${prefsEncoded}`); return; }
-
-    if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${query}`); return; }
-
-  } 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') { resolve(`${randomInstance}/directions?${prefsEncoded}${mapCentre}`); return; }
-    if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${orgVal}%20to%20${destVal}%20by%20${travelModesFacil[travMod]}`); return; }
-
-  } 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') { resolve(`${randomInstance}/search?query=${mlat}%2C${mlon}`); return; }
-    if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${mlat}%2C${mlon}`); return; }
-
-  } 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') { resolve(`${randomInstance}/search?query=${mlat}%2C${mlon}`); return; }
-    if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${mlat}%2C${mlon}`); return; }
-  } 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') { resolve(`${randomInstance}/search?query=${mlat}%2C${mlon}`); return; }
-    if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${mlat}%2C${mlon}`); return; }
-  } 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') { resolve(`${randomInstance}/search?query="${query}${mapCentre}&${prefsEncoded}`); return; }
-      if (mapsFrontend == 'facil') { resolve(`${randomInstance}/${mapCentre}/Mpnk/${query}`); return; }
-    }
-  }
-
-  let prefsEncoded = new URLSearchParams(prefs).toString();
-  console.log("mapCentre", mapCentre);
-  console.log("prefs", prefs);
-  console.log("prefsEncoded", prefsEncoded);
-  if (mapsFrontend == 'osm') { resolve(`${randomInstance}/${mapCentre}&${prefsEncoded}`); return; }
-  if (mapsFrontend == 'facil') { resolve(`${randomInstance}/${mapCentre}/Mpnk`); return; }
-}
-
-async function initDefaults() {
-  await browser.storage.local.set({
-    disableMaps: false,
-    mapsFrontend: 'osm',
-    mapsRedirects: redirects,
-    facilNormalRedirectsChecks: [...redirects.facil.normal],
-    facilNormalCustomRedirects: [],
-  })
-}
-
-export default {
-  redirect,
-  initDefaults,
-};
diff --git a/src/assets/javascripts/helpers/medium.js b/src/assets/javascripts/helpers/medium.js
deleted file mode 100644
index 7be6b0d1..00000000
--- a/src/assets/javascripts/helpers/medium.js
+++ /dev/null
@@ -1,174 +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 /,
-];
-
-let redirects = {
-  "scribe": {
-    "normal": [],
-    "tor": []
-  }
-};
-function setRedirects(val) {
-  browser.storage.local.get('cloudflareList', r => {
-    redirects.scribe = val;
-    scribeNormalRedirectsChecks = [...redirects.scribe.normal];
-    for (const instance of r.cloudflareList) {
-      const a = scribeNormalRedirectsChecks.indexOf(instance);
-      if (a > -1) scribeNormalRedirectsChecks.splice(a, 1);
-    }
-    browser.storage.local.set({
-      mediumRedirects: redirects,
-      scribeNormalRedirectsChecks
-    })
-  })
-}
-
-let
-  disableMedium,
-  mediumRedirects,
-  scribeNormalRedirectsChecks,
-  scribeNormalCustomRedirects,
-  scribeTorRedirectsChecks,
-  scribeTorCustomRedirects,
-  mediumProtocol;
-
-function init() {
-  return new Promise(resolve => {
-    browser.storage.local.get(
-      [
-        "disableMedium",
-        "mediumRedirects",
-        "scribeNormalRedirectsChecks",
-        "scribeNormalCustomRedirects",
-        "scribeTorRedirectsChecks",
-        "scribeTorCustomRedirects",
-        "mediumProtocol"
-      ],
-      r => {
-        disableMedium = r.disableMedium;
-        mediumRedirects = r.mediumRedirects;
-        scribeNormalRedirectsChecks = r.scribeNormalRedirectsChecks;
-        scribeNormalCustomRedirects = r.scribeNormalCustomRedirects;
-        scribeTorRedirectsChecks = r.scribeTorRedirectsChecks;
-        scribeTorCustomRedirects = r.scribeTorCustomRedirects;
-        mediumProtocol = r.mediumProtocol;
-        resolve();
-      }
-    )
-  })
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, type, initiator) {
-  if (disableMedium) return;
-  if (type != "main_frame" && "sub_frame" && "xmlhttprequest" && "other") return;
-  if (initiator && (
-    [
-      ...mediumRedirects.scribe.normal,
-      ...mediumRedirects.scribe.tor,
-      ...scribeNormalCustomRedirects,
-      ...scribeTorCustomRedirects,
-    ].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 (mediumProtocol == 'normal') instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects];
-  else if (mediumProtocol == 'tor') instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects];
-  if (instancesList.length === 0) return;
-
-  const randomInstance = utils.getRandomInstance(instancesList)
-  return `${randomInstance}${url.pathname}${url.search}`;
-}
-
-function switchInstance(url) {
-  return new Promise(async resolve => {
-    await init();
-    let protocolHost = utils.protocolHost(url);
-    const all = [
-      ...mediumRedirects.scribe.tor,
-      ...mediumRedirects.scribe.normal,
-
-      ...scribeNormalCustomRedirects,
-      ...scribeTorCustomRedirects,
-    ];
-    if (!all.includes(protocolHost)) { resolve(); return; }
-
-    let instancesList;
-    if (mediumProtocol == 'normal') instancesList = [...scribeNormalCustomRedirects, ...scribeNormalRedirectsChecks];
-    else if (mediumProtocol == 'tor') instancesList = [...scribeTorCustomRedirects, ...scribeTorRedirectsChecks];
-
-    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);
-      redirects.scribe = dataJson.scribe;
-      browser.storage.local.get('cloudflareList',
-        async r => {
-          scribeNormalRedirectsChecks = [...redirects.scribe.normal];
-          for (const instance of r.cloudflareList) {
-            let i = scribeNormalRedirectsChecks.indexOf(instance);
-            if (i > -1) scribeNormalRedirectsChecks.splice(i, 1);
-          }
-          await browser.storage.local.set({
-            disableMedium: false,
-            mediumRedirects: redirects,
-
-            scribeNormalRedirectsChecks: scribeNormalRedirectsChecks,
-            scribeNormalCustomRedirects: [],
-
-            scribeTorRedirectsChecks: [...redirects.scribe.tor],
-            scribeTorCustomRedirects: [],
-
-            mediumProtocol: "normal",
-          })
-          resolve();
-        })
-    })
-  })
-}
-
-export default {
-  setRedirects,
-  redirect,
-  switchInstance,
-  initDefaults,
-};
diff --git a/src/assets/javascripts/helpers/peertube.js b/src/assets/javascripts/helpers/peertube.js
deleted file mode 100644
index ed15bce9..00000000
--- a/src/assets/javascripts/helpers/peertube.js
+++ /dev/null
@@ -1,155 +0,0 @@
-window.browser = window.browser || window.chrome;
-
-import utils from './utils.js'
-
-let redirects = {
-    "simpleertube": {
-        "normal": [
-            "https://tube.simple-web.org",
-            "https://tube.ftild3.org",
-            "https://stube.alefvanoon.xyz",
-            "https://st.phreedom.club",
-            "https://simpleertube.esmailelbob.xyz",
-        ],
-        "tor": []
-    }
-}
-function setRedirects(val) {
-    redirects.simpleertube = val;
-    browser.storage.local.set({ peertubeTargetsRedirects: redirects })
-    for (const item of simpleertubeNormalRedirectsChecks)
-        if (!redirects.simpleertube.normal.includes(item)) {
-            var index = simpleertubeNormalRedirectsChecks.indexOf(item);
-            if (index !== -1) simpleertubeNormalRedirectsChecks.splice(index, 1);
-        }
-    browser.storage.local.set({ simpleertubeNormalRedirectsChecks })
-
-    for (const item of simpleertubeTorRedirectsChecks)
-        if (!redirects.simpleertube.normal.includes(item)) {
-            var index = simpleertubeTorRedirectsChecks.indexOf(item);
-            if (index !== -1) simpleertubeTorRedirectsChecks.splice(index, 1);
-        }
-    browser.storage.local.set({ simpleertubeTorRedirectsChecks })
-}
-
-let
-    disablePeertubeTargets,
-    peertubeRedirects,
-    simpleertubeNormalRedirectsChecks,
-    simpleertubeNormalCustomRedirects,
-    simpleertubeTorRedirectsChecks,
-    simpleertubeTorCustomRedirects,
-    peerTubeTargets,
-    peertubeTargetsProtocol;
-
-function init() {
-    return new Promise(resolve => {
-        browser.storage.local.get(
-            [
-                "disablePeertubeTargets",
-                "peertubeRedirects",
-                "simpleertubeNormalRedirectsChecks",
-                "simpleertubeNormalCustomRedirects",
-                "simpleertubeTorRedirectsChecks",
-                "simpleertubeTorCustomRedirects",
-                "peerTubeTargets",
-                "peertubeTargetsProtocol"
-            ],
-            r => {
-                disablePeertubeTargets = r.disablePeertubeTargets;
-                peertubeRedirects = r.peertubeRedirects;
-                simpleertubeNormalRedirectsChecks = r.simpleertubeNormalRedirectsChecks;
-                simpleertubeNormalCustomRedirects = r.simpleertubeNormalCustomRedirects;
-                simpleertubeTorRedirectsChecks = r.simpleertubeTorRedirectsChecks;
-                simpleertubeTorCustomRedirects = r.simpleertubeTorCustomRedirects;
-                peerTubeTargets = r.peerTubeTargets;
-                peertubeTargetsProtocol = r.peertubeTargetsProtocol;
-                resolve();
-            }
-        )
-    })
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-function all() {
-    return [
-        ...redirects.simpleertube.normal,
-        ...redirects.simpleertube.tor,
-        ...simpleertubeNormalCustomRedirects,
-        ...simpleertubeTorCustomRedirects,
-    ];
-}
-
-function redirect(url, type, initiator) {
-    if (disablePeertubeTargets) 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 (peertubeTargetsProtocol == 'normal') instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects];
-    if (peertubeTargetsProtocol == 'tor') instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects];
-    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) {
-    return new Promise(async resolve => {
-        await init();
-        const protocolHost = utils.protocolHost(url);
-        if (!all().includes(protocolHost)) { resolve(); return; }
-
-        let instancesList;
-        if (peertubeTargetsProtocol == 'normal') instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects];
-        else if (peertubeTargetsProtocol == 'tor') instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects];
-
-        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);
-            browser.storage.local.get('cloudflareList', async r => {
-                simpleertubeNormalRedirectsChecks = [...redirects.simpleertube.normal];
-                for (const instance of r.cloudflareList) {
-                    let i = simpleertubeNormalRedirectsChecks.indexOf(instance);
-                    if (i > -1) simpleertubeNormalRedirectsChecks.splice(i, 1);
-                }
-                await browser.storage.local.set({
-                    peerTubeTargets: ['https://search.joinpeertube.org', ...dataJson.peertube],
-                    disablePeertubeTargets: true,
-                    peertubeRedirects: redirects,
-
-                    simpleertubeNormalRedirectsChecks: simpleertubeNormalRedirectsChecks,
-                    simpleertubeNormalCustomRedirects: [],
-
-                    simpleertubeTorRedirectsChecks: [...redirects.simpleertube.tor],
-                    simpleertubeTorCustomRedirects: [],
-
-                    peertubeTargetsProtocol: "normal",
-                })
-                resolve();
-            })
-        })
-    })
-}
-
-export default {
-    setRedirects,
-    switchInstance,
-    redirect,
-    initDefaults,
-};
diff --git a/src/assets/javascripts/helpers/reddit.js b/src/assets/javascripts/helpers/reddit.js
deleted file mode 100644
index 0735ba64..00000000
--- a/src/assets/javascripts/helpers/reddit.js
+++ /dev/null
@@ -1,378 +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 = {
-  "libreddit": {
-    "normal": [],
-    "tor": []
-  },
-  "teddit": {
-    "normal": [],
-    "tor": []
-  },
-};
-function setRedirects(val) {
-  browser.storage.local.get('cloudflareList', r => {
-    redirects = val;
-    libredditNormalRedirectsChecks = [...redirects.libreddit.normal];
-    tedditNormalRedirectsChecks = [...redirects.teddit.normal]
-    for (const instance of r.cloudflareList) {
-      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,
-      tedditNormalRedirectsChecks
-    })
-  })
-}
-
-let
-  disableReddit,
-  redditFrontend,
-  redditRedirects,
-  redditProtocol,
-  libredditNormalRedirectsChecks,
-  libredditNormalCustomRedirects,
-  libredditTorRedirectsChecks,
-  libredditTorCustomRedirects,
-  tedditNormalRedirectsChecks,
-  tedditNormalCustomRedirects,
-  tedditTorRedirectsChecks,
-  tedditTorCustomRedirects;
-
-function init() {
-  return new Promise(resolve => {
-    browser.storage.local.get(
-      [
-        "disableReddit",
-        "redditFrontend",
-        "redditRedirects",
-        "redditProtocol",
-        "libredditNormalRedirectsChecks",
-        "libredditNormalCustomRedirects",
-        "libredditTorRedirectsChecks",
-        "libredditTorCustomRedirects",
-        "tedditNormalRedirectsChecks",
-        "tedditNormalCustomRedirects",
-        "tedditTorRedirectsChecks",
-        "tedditTorCustomRedirects",
-      ],
-      r => {
-        disableReddit = r.disableReddit;
-        redditFrontend = r.redditFrontend;
-        redditRedirects = r.redditRedirects;
-        redditProtocol = r.redditProtocol;
-        libredditNormalRedirectsChecks = r.libredditNormalRedirectsChecks;
-        libredditNormalCustomRedirects = r.libredditNormalCustomRedirects;
-        libredditTorRedirectsChecks = r.libredditTorRedirectsChecks;
-        libredditTorCustomRedirects = r.libredditTorCustomRedirects;
-        tedditNormalRedirectsChecks = r.tedditNormalRedirectsChecks;
-        tedditNormalCustomRedirects = r.tedditNormalCustomRedirects;
-        tedditTorRedirectsChecks = r.tedditTorRedirectsChecks;
-        tedditTorCustomRedirects = r.tedditTorCustomRedirects;
-        resolve();
-      }
-    )
-  })
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-function initLibredditCookies(test, from) {
-  return new Promise(async resolve => {
-    await init();
-    let protocolHost = utils.protocolHost(from);
-    if (![
-      ...libredditNormalRedirectsChecks,
-      ...libredditTorRedirectsChecks,
-      ...libredditNormalCustomRedirects,
-      ...libredditTorCustomRedirects,
-    ].includes(protocolHost)) { resolve(); return; }
-
-    if (!test) {
-      let checkedInstances;
-      if (redditProtocol == 'normal') checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects];
-      else if (redditProtocol == 'tor') checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects];
-      for (const to of checkedInstances) {
-        utils.copyCookie('libreddit', from, to, "theme");
-        utils.copyCookie('libreddit', from, to, "front_page");
-        utils.copyCookie('libreddit', from, to, "layout");
-        utils.copyCookie('libreddit', from, to, "wide");
-        utils.copyCookie('libreddit', from, to, "post_sort");
-        utils.copyCookie('libreddit', from, to, "comment_sort");
-        utils.copyCookie('libreddit', from, to, "show_nsfw");
-        utils.copyCookie('libreddit', from, to, "autoplay_videos");
-        utils.copyCookie('libreddit', from, to, "use_hls");
-        utils.copyCookie('libreddit', from, to, "hide_hls_notification");
-      }
-    }
-    resolve(true);
-  })
-}
-
-function setLibredditCookies() {
-  return new Promise(async resolve => {
-    await init();
-    if (disableReddit || redditFrontend != 'libreddit' || redditProtocol === undefined) { resolve(); return; }
-    let checkedInstances;
-    if (redditProtocol == 'normal') checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
-    else if (redditProtocol == 'tor') checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
-    for (const to of checkedInstances) {
-      utils.getCookiesFromStorage('libreddit', to, "theme");
-      utils.getCookiesFromStorage('libreddit', to, "front_page");
-      utils.getCookiesFromStorage('libreddit', to, "layout");
-      utils.getCookiesFromStorage('libreddit', to, "wide");
-      utils.getCookiesFromStorage('libreddit', to, "post_sort");
-      utils.getCookiesFromStorage('libreddit', to, "comment_sort");
-      utils.getCookiesFromStorage('libreddit', to, "show_nsfw");
-      utils.getCookiesFromStorage('libreddit', to, "autoplay_videos");
-      utils.getCookiesFromStorage('libreddit', to, "use_hls");
-      utils.getCookiesFromStorage('libreddit', to, "hide_hls_notification");
-    }
-    resolve();
-  })
-}
-
-function initTedditCookies(test, from) {
-  return new Promise(async resolve => {
-    await init();
-    let protocolHost = utils.protocolHost(from);
-    if (![
-      ...tedditNormalRedirectsChecks,
-      ...tedditTorRedirectsChecks,
-      ...tedditNormalCustomRedirects,
-      ...tedditTorCustomRedirects,
-    ].includes(protocolHost)) resolve();
-
-    if (!test) {
-      let checkedInstances;
-      if (redditProtocol == 'normal') checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
-      else if (redditProtocol == 'tor') checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
-      for (const to of checkedInstances) {
-        utils.copyCookie('teddit', from, to, 'collapse_child_comments')
-        utils.copyCookie('teddit', from, to, 'domain_instagram')
-        utils.copyCookie('teddit', from, to, 'domain_twitter')
-        utils.copyCookie('teddit', from, to, 'domain_youtube')
-        utils.copyCookie('teddit', from, to, 'flairs')
-        utils.copyCookie('teddit', from, to, 'highlight_controversial')
-        utils.copyCookie('teddit', from, to, 'nsfw_enabled')
-        utils.copyCookie('teddit', from, to, 'post_media_max_height')
-        utils.copyCookie('teddit', from, to, 'show_upvoted_percentage')
-        utils.copyCookie('teddit', from, to, 'show_upvotes')
-        utils.copyCookie('teddit', from, to, 'theme')
-        utils.copyCookie('teddit', from, to, 'videos_muted')
-      }
-    }
-    resolve(true);
-  })
-}
-
-function setTedditCookies() {
-  return new Promise(async resolve => {
-    await init();
-    if (disableReddit || redditFrontend != 'teddit' || redditProtocol === undefined) { resolve(); return; }
-    let checkedInstances;
-    if (redditProtocol == 'normal') checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
-    else if (redditProtocol == 'tor') checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
-    for (const to of checkedInstances) {
-      utils.getCookiesFromStorage('teddit', to, 'collapse_child_comments')
-      utils.getCookiesFromStorage('teddit', to, 'domain_instagram')
-      utils.getCookiesFromStorage('teddit', to, 'domain_twitter')
-      utils.getCookiesFromStorage('teddit', to, 'domain_youtube')
-      utils.getCookiesFromStorage('teddit', to, 'flairs')
-      utils.getCookiesFromStorage('teddit', to, 'highlight_controversial')
-      utils.getCookiesFromStorage('teddit', to, 'nsfw_enabled')
-      utils.getCookiesFromStorage('teddit', to, 'post_media_max_height')
-      utils.getCookiesFromStorage('teddit', to, 'show_upvoted_percentage')
-      utils.getCookiesFromStorage('teddit', to, 'show_upvotes')
-      utils.getCookiesFromStorage('teddit', to, 'theme')
-      utils.getCookiesFromStorage('teddit', to, 'videos_muted')
-    }
-    resolve();
-  })
-}
-
-function all() {
-  return [
-    ...redditRedirects.libreddit.normal,
-    ...redditRedirects.libreddit.tor,
-    ...redditRedirects.teddit.normal,
-    ...redditRedirects.teddit.tor,
-    ...libredditNormalCustomRedirects,
-    ...libredditTorCustomRedirects,
-    ...tedditNormalCustomRedirects,
-    ...tedditTorCustomRedirects,
-  ];
-}
-
-// 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) {
-  if (disableReddit) return;
-  if (!targets.some(rx => rx.test(url.href))) return;
-  if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB';
-  const bypassPaths = /\/(gallery\/poll\/rpan\/settings\/topics)/;
-  if (type !== "main_frame" || url.pathname.match(bypassPaths)) return;
-
-  let libredditInstancesList;
-  let tedditInstancesList;
-  if (redditProtocol == 'normal') {
-    libredditInstancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects];
-    tedditInstancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects];
-  } else if (redditProtocol == 'tor') {
-    libredditInstancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects];
-    tedditInstancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects];
-  }
-
-  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.reddit}`;
-    }
-    if (redditFrontend == 'libreddit') {
-      if (libredditInstancesList.length === 0) return;
-      let libredditRandomInstance = utils.getRandomInstance(libredditInstancesList);
-      return `${libredditRandomInstance}/img${url.pathname}${url.reddit}`
-    }
-  }
-  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.reddit}`;
-    }
-    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.reddit}`
-    }
-  }
-  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.reddit}`;
-    }
-  }
-
-  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) {
-  return new Promise(async resolve => {
-    await init();
-    const protocolHost = utils.protocolHost(url);
-    if (!all().includes(protocolHost)) { resolve(); return; }
-    let instancesList;
-    if (redditFrontend == 'libreddit') {
-      if (redditProtocol == 'normal') instancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects];
-      else if (redditProtocol == 'tor') instancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects];
-      if ([
-        ...redditRedirects.teddit.normal,
-        ...redditRedirects.teddit.tor
-      ].includes(protocolHost)) url.pathname = url.pathname.replace("/pics/w:null_", "/img/");
-    }
-    else if (redditFrontend == 'teddit') {
-      if (redditProtocol == 'normal') instancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects];
-      else if (redditProtocol == 'tor') instancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects];
-      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.reddit}`);
-  })
-}
-
-function initDefaults() {
-  return new Promise(resolve => {
-    fetch('/instances/data.json').then(response => response.text()).then(async data => {
-      let dataJson = JSON.parse(data);
-      redirects.teddit = dataJson.teddit;
-      redirects.libreddit = dataJson.libreddit;
-      browser.storage.local.get('cloudflareList', async r => {
-        libredditNormalRedirectsChecks = [...redirects.libreddit.normal];
-        tedditNormalRedirectsChecks = [...redirects.teddit.normal]
-        for (const instance of r.cloudflareList) {
-          let i;
-
-          i = libredditNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) libredditNormalRedirectsChecks.splice(i, 1);
-
-          i = tedditNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) tedditNormalRedirectsChecks.splice(i, 1);
-        }
-        await browser.storage.local.set({
-          disableReddit: false,
-          redditProtocol: 'normal',
-          redditFrontend: 'libreddit',
-          redditRedirects: redirects,
-
-          libredditNormalRedirectsChecks: libredditNormalRedirectsChecks,
-          libredditNormalCustomRedirects: [],
-
-          libredditTorRedirectsChecks: [...redirects.libreddit.tor],
-          libredditTorCustomRedirects: [],
-
-          tedditNormalRedirectsChecks: tedditNormalRedirectsChecks,
-          tedditNormalCustomRedirects: [],
-
-          tedditTorRedirectsChecks: [...redirects.teddit.tor],
-          tedditTorCustomRedirects: [],
-        });
-        resolve();
-      });
-    });
-  });
-}
-
-export default {
-  setRedirects,
-  initLibredditCookies,
-  setLibredditCookies,
-  initTedditCookies,
-  setTedditCookies,
-
-  redirect,
-  initDefaults,
-  switchInstance,
-};
diff --git a/src/assets/javascripts/helpers/search.js b/src/assets/javascripts/helpers/search.js
deleted file mode 100644
index b32a8141..00000000
--- a/src/assets/javascripts/helpers/search.js
+++ /dev/null
@@ -1,470 +0,0 @@
-window.browser = window.browser || window.chrome;
-
-import utils from './utils.js'
-
-const targets = [
-  /^https?:\/{2}(www\.|search\.|)google(\.[a-z]{2,3}){1,2}(\/search(\?.*|$)|\/$)/,
-  /^https?:\/{2}(www\.|www2\.|)bing\.com/,
-  /^https?:\/{2}yandex(\.[a-z]{2,3}){1,2}/,
-  /^https?:\/{2}search\.libredirect\.invalid/,
-];
-
-let redirects = {
-  "searx": {
-    "normal": [],
-    "tor": [],
-    "i2p": []
-  },
-  "searxng": {
-    "normal": [],
-    "tor": [],
-    "i2p": []
-  },
-  "whoogle": {
-    "normal": [],
-    "tor": [],
-    "i2p": []
-  }
-};
-
-function setRedirects(val) {
-  browser.storage.local.get('cloudflareList', r => {
-    redirects = val;
-    searxNormalRedirectsChecks = [...redirects.searx.normal];
-    searxngNormalRedirectsChecks = [...redirects.searxng.normal];
-    whoogleNormalRedirectsChecks = [...redirects.whoogle.normal];
-    for (const instance of r.cloudflareList) {
-      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);
-    }
-    browser.storage.local.set({
-      searchRedirects: redirects,
-      searxNormalRedirectsChecks,
-      searxngNormalRedirectsChecks,
-      whoogleNormalRedirectsChecks,
-    });
-  })
-}
-
-let
-  disableSearch,
-  searchFrontend,
-  searchRedirects,
-  searchProtocol,
-  whoogleNormalRedirectsChecks,
-  whoogleNormalCustomRedirects,
-  whoogleTorRedirectsChecks,
-  whoogleTorCustomRedirects,
-  whoogleI2pRedirectsChecks,
-  whoogleI2pCustomRedirects,
-  searxNormalRedirectsChecks,
-  searxNormalCustomRedirects,
-  searxTorRedirectsChecks,
-  searxTorCustomRedirects,
-  searxI2pRedirectsChecks,
-  searxI2pCustomRedirects,
-  searxngNormalRedirectsChecks,
-  searxngNormalCustomRedirects,
-  searxngTorRedirectsChecks,
-  searxngTorCustomRedirects,
-  searxngI2pRedirectsChecks,
-  searxngI2pCustomRedirects;
-
-function init() {
-  return new Promise(async resolve => {
-    browser.storage.local.get(
-      [
-        "disableSearch",
-        "searchFrontend",
-        "searchRedirects",
-        "searchProtocol",
-        "whoogleNormalRedirectsChecks",
-        "whoogleNormalCustomRedirects",
-        "whoogleTorRedirectsChecks",
-        "whoogleTorCustomRedirects",
-        "whoogleI2pRedirectsChecks",
-        "whoogleI2pCustomRedirects",
-        "searxNormalRedirectsChecks",
-        "searxNormalCustomRedirects",
-        "searxTorRedirectsChecks",
-        "searxTorCustomRedirects",
-        "searxI2pRedirectsChecks",
-        "searxI2pCustomRedirects",
-        "searxngNormalRedirectsChecks",
-        "searxngNormalCustomRedirects",
-        "searxngTorRedirectsChecks",
-        "searxngTorCustomRedirects",
-        "searxngI2pRedirectsChecks",
-        "searxngI2pCustomRedirects",
-      ],
-      r => {
-        disableSearch = r.disableSearch;
-        searchFrontend = r.searchFrontend;
-        searchRedirects = r.searchRedirects;
-        searchProtocol = r.searchProtocol;
-        whoogleNormalRedirectsChecks = r.whoogleNormalRedirectsChecks;
-        whoogleNormalCustomRedirects = r.whoogleNormalCustomRedirects;
-        whoogleTorRedirectsChecks = r.whoogleTorRedirectsChecks;
-        whoogleTorCustomRedirects = r.whoogleTorCustomRedirects;
-        whoogleI2pRedirectsChecks = r.whoogleI2pRedirectsChecks;
-        whoogleI2pCustomRedirects = r.whoogleI2pCustomRedirects;
-        searxNormalRedirectsChecks = r.searxNormalRedirectsChecks;
-        searxNormalCustomRedirects = r.searxNormalCustomRedirects;
-        searxTorRedirectsChecks = r.searxTorRedirectsChecks;
-        searxTorCustomRedirects = r.searxTorCustomRedirects;
-        searxI2pRedirectsChecks = r.searxI2pRedirectsChecks;
-        searxI2pCustomRedirects = r.searxI2pCustomRedirects;
-        searxngNormalRedirectsChecks = r.searxngNormalRedirectsChecks;
-        searxngNormalCustomRedirects = r.searxngNormalCustomRedirects;
-        searxngTorRedirectsChecks = r.searxngTorRedirectsChecks;
-        searxngTorCustomRedirects = r.searxngTorCustomRedirects;
-        searxngI2pRedirectsChecks = r.searxngI2pRedirectsChecks;
-        searxngI2pCustomRedirects = r.searxngI2pCustomRedirects;
-        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,
-    ].includes(protocolHost)) { resolve(); return; }
-
-    if (!test) {
-      let checkedInstances;
-      if (searchProtocol == 'normal') checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects];
-      else if (searchProtocol == 'tor') checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects];
-      else if (searchProtocol == 'i2p') checkedInstances = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects];
-      for (const to of checkedInstances) {
-        utils.copyCookie('searx', from, to, 'advanced_search');
-        utils.copyCookie('searx', from, to, 'autocomplete');
-        utils.copyCookie('searx', from, to, 'categories');
-        utils.copyCookie('searx', from, to, 'disabled_engines');
-        utils.copyCookie('searx', from, to, 'disabled_plugins');
-        utils.copyCookie('searx', from, to, 'doi_resolver');
-        utils.copyCookie('searx', from, to, 'enabled_engines');
-        utils.copyCookie('searx', from, to, 'enabled_plugins');
-        utils.copyCookie('searx', from, to, 'image_proxy');
-        utils.copyCookie('searx', from, to, 'language');
-        utils.copyCookie('searx', from, to, 'locale');
-        utils.copyCookie('searx', from, to, 'method');
-        utils.copyCookie('searx', from, to, 'oscar-style');
-        utils.copyCookie('searx', from, to, 'results_on_new_tab');
-        utils.copyCookie('searx', from, to, 'safesearch');
-        utils.copyCookie('searx', from, to, 'theme');
-        utils.copyCookie('searx', from, to, 'tokens');
-      }
-    }
-    resolve(true);
-  })
-}
-
-function setSearxCookies() {
-  return new Promise(async resolve => {
-    await init();
-    if (disableSearch || searchFrontend != 'searx') { resolve(); return; }
-    let checkedInstances;
-    if (searchProtocol == 'normal') checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]
-    else if (searchProtocol == 'tor') checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]
-    for (const to of checkedInstances) {
-      utils.getCookiesFromStorage('searx', to, 'advanced_search');
-      utils.getCookiesFromStorage('searx', to, 'autocomplete');
-      utils.getCookiesFromStorage('searx', to, 'categories');
-      utils.getCookiesFromStorage('searx', to, 'disabled_engines');
-      utils.getCookiesFromStorage('searx', to, 'disabled_plugins');
-      utils.getCookiesFromStorage('searx', to, 'doi_resolver');
-      utils.getCookiesFromStorage('searx', to, 'enabled_engines');
-      utils.getCookiesFromStorage('searx', to, 'enabled_plugins');
-      utils.getCookiesFromStorage('searx', to, 'image_proxy');
-      utils.getCookiesFromStorage('searx', to, 'language');
-      utils.getCookiesFromStorage('searx', to, 'locale');
-      utils.getCookiesFromStorage('searx', to, 'method');
-      utils.getCookiesFromStorage('searx', to, 'oscar-style');
-      utils.getCookiesFromStorage('searx', to, 'results_on_new_tab');
-      utils.getCookiesFromStorage('searx', to, 'safesearch');
-      utils.getCookiesFromStorage('searx', to, 'theme');
-      utils.getCookiesFromStorage('searx', to, 'tokens');
-    }
-    resolve();
-  })
-}
-
-function initSearxngCookies(test, from) {
-  return new Promise(async resolve => {
-    await init();
-    let protocolHost = utils.protocolHost(from);
-    if (![
-      ...searxngNormalRedirectsChecks,
-      ...searxngNormalCustomRedirects,
-      ...searxngTorRedirectsChecks,
-      ...searxngTorCustomRedirects,
-      ...searxngI2pRedirectsChecks,
-      ...searxngI2pCustomRedirects,
-    ].includes(protocolHost)) { resolve(); return; }
-
-    if (!test) {
-      let checkedInstances;
-      if (searchProtocol == 'normal') checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects];
-      else if (searchProtocol == 'tor') checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects];
-      else if (searchProtocol == 'i2p') checkedInstances = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects];
-      for (const to of checkedInstances) {
-        utils.copyCookie('searxng', from, to, 'autocomplete');
-        utils.copyCookie('searxng', from, to, 'categories');
-        utils.copyCookie('searxng', from, to, 'disabled_engines');
-        utils.copyCookie('searxng', from, to, 'disabled_plugins');
-        utils.copyCookie('searxng', from, to, 'doi_resolver');
-        utils.copyCookie('searxng', from, to, 'enabled_plugins');
-        utils.copyCookie('searxng', from, to, 'enabled_engines');
-        utils.copyCookie('searxng', from, to, 'image_proxy');
-        utils.copyCookie('searxng', from, to, 'infinite_scroll');
-        utils.copyCookie('searxng', from, to, 'language');
-        utils.copyCookie('searxng', from, to, 'locale');
-        utils.copyCookie('searxng', from, to, 'maintab');
-        utils.copyCookie('searxng', from, to, 'method');
-        utils.copyCookie('searxng', from, to, 'query_in_title');
-        utils.copyCookie('searxng', from, to, 'results_on_new_tab');
-        utils.copyCookie('searxng', from, to, 'safesearch');
-        utils.copyCookie('searxng', from, to, 'simple_style');
-        utils.copyCookie('searxng', from, to, 'theme');
-        utils.copyCookie('searxng', from, to, 'tokens');
-      }
-    }
-    resolve(true);
-  })
-}
-
-function setSearxngCookies() {
-  return new Promise(async resolve => {
-    await init();
-    if (disableSearch || searchFrontend != 'searxng', searchProtocol === undefined) { resolve(); return; }
-    let checkedInstances;
-    if (searchProtocol == 'normal') checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]
-    else if (searchProtocol == 'tor') checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]
-    for (const to of checkedInstances) {
-      utils.getCookiesFromStorage('searxng', to, 'autocomplete');
-      utils.getCookiesFromStorage('searxng', to, 'categories');
-      utils.getCookiesFromStorage('searxng', to, 'disabled_engines');
-      utils.getCookiesFromStorage('searxng', to, 'disabled_plugins');
-      utils.getCookiesFromStorage('searxng', to, 'doi_resolver');
-      utils.getCookiesFromStorage('searxng', to, 'enabled_plugins');
-      utils.getCookiesFromStorage('searxng', to, 'enabled_engines');
-      utils.getCookiesFromStorage('searxng', to, 'image_proxy');
-      utils.getCookiesFromStorage('searxng', to, 'infinite_scroll');
-      utils.getCookiesFromStorage('searxng', to, 'language');
-      utils.getCookiesFromStorage('searxng', to, 'locale');
-      utils.getCookiesFromStorage('searxng', to, 'maintab');
-      utils.getCookiesFromStorage('searxng', to, 'method');
-      utils.getCookiesFromStorage('searxng', to, 'query_in_title');
-      utils.getCookiesFromStorage('searxng', to, 'results_on_new_tab');
-      utils.getCookiesFromStorage('searxng', to, 'safesearch');
-      utils.getCookiesFromStorage('searxng', to, 'simple_style');
-      utils.getCookiesFromStorage('searxng', to, 'theme');
-      utils.getCookiesFromStorage('searxng', to, 'tokens');
-    }
-    resolve();
-  })
-}
-
-
-function redirect(url) {
-  if (disableSearch) 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 (searchProtocol == 'normal') instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects];
-    else if (searchProtocol == 'tor') instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects];
-    else if (searchProtocol == 'i2p') instancesList = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects];
-    if (instancesList.length === 0) return;
-    randomInstance = utils.getRandomInstance(instancesList)
-    path = "/";
-  }
-  else if (searchFrontend == 'searxng') {
-    let instancesList;
-    if (searchProtocol == 'normal') instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects];
-    else if (searchProtocol == 'tor') instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects];
-    else if (searchProtocol == 'i2p') instancesList = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects];
-    if (instancesList.length === 0) return;
-    randomInstance = utils.getRandomInstance(instancesList)
-    path = "/";
-  }
-  else if (searchFrontend == 'whoogle') {
-    let instancesList;
-    if (searchProtocol == 'normal') instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects];
-    if (searchProtocol == 'tor') instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects];
-    if (searchProtocol == 'i2p') instancesList = [...whoogleI2pRedirectsChecks, ...whoogleI2pCustomRedirects];
-    if (instancesList.length === 0) return;
-    randomInstance = utils.getRandomInstance(instancesList)
-    path = "/search";
-  }
-
-  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=${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) {
-  return new Promise(async resolve => {
-    await init();
-    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,
-
-      ...searxNormalCustomRedirects,
-      ...searxTorCustomRedirects,
-      ...searxI2pCustomRedirects,
-
-      ...searxngNormalCustomRedirects,
-      ...searxngTorCustomRedirects,
-      ...searxngI2pCustomRedirects,
-
-      ...whoogleNormalCustomRedirects,
-      ...whoogleTorCustomRedirects,
-      ...whoogleI2pCustomRedirects,
-    ].includes(protocolHost)) { resolve(); return; }
-
-    let instancesList;
-    if (searchProtocol == 'normal') {
-      if (searchFrontend == 'searx') instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects];
-      else if (searchFrontend == 'searxng') instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects];
-      else if (searchFrontend == 'whoogle') instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects];
-    }
-    else if (searchProtocol == 'tor') {
-      if (searchFrontend == 'searx') instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects];
-      else if (searchFrontend == 'searxng') instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects];
-      else if (searchFrontend == 'whoogle') instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects];
-    }
-    else if (searchProtocol == 'i2p') {
-      if (searchFrontend == 'searx') instancesList = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects];
-      else if (searchFrontend == 'searxng') instancesList = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects];
-      else if (searchFrontend == 'whoogle') instancesList = [...whoogleI2pRedirectsChecks, ...whoogleI2pCustomRedirects];
-    }
-
-    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);
-      redirects.searx = dataJson.searx;
-      redirects.searxng = dataJson.searxng;
-      redirects.whoogle = dataJson.whoogle;
-
-      browser.storage.local.get('cloudflareList', async r => {
-        whoogleNormalRedirectsChecks = [...redirects.whoogle.normal];
-        searxNormalRedirectsChecks = [...redirects.searx.normal];
-        searxngNormalRedirectsChecks = [...redirects.searxng.normal];
-        for (const instance of r.cloudflareList) {
-          let i;
-
-          i = whoogleNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) whoogleNormalRedirectsChecks.splice(i, 1);
-
-          i = searxNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) searxNormalRedirectsChecks.splice(i, 1);
-
-          i = searxngNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) searxngNormalRedirectsChecks.splice(i, 1);
-        }
-        await browser.storage.local.set({
-          disableSearch: false,
-          searchFrontend: 'searxng',
-          searchRedirects: redirects,
-          searxngCustomSettings: false,
-          searchProtocol: 'normal',
-
-          whoogleNormalRedirectsChecks: whoogleNormalRedirectsChecks,
-          whoogleNormalCustomRedirects: [],
-
-          whoogleTorRedirectsChecks: [...redirects.whoogle.tor],
-          whoogleTorCustomRedirects: [],
-
-          whoogleI2pRedirectsChecks: [...redirects.whoogle.i2p],
-          whoogleI2pCustomRedirects: [],
-
-          searxNormalRedirectsChecks: searxNormalRedirectsChecks,
-          searxNormalCustomRedirects: [],
-
-          searxTorRedirectsChecks: [...redirects.searx.tor],
-          searxTorCustomRedirects: [],
-
-          searxI2pRedirectsChecks: [...redirects.searx.i2p],
-          searxI2pCustomRedirects: [],
-
-          searxngNormalRedirectsChecks: searxngNormalRedirectsChecks,
-          searxngNormalCustomRedirects: [],
-
-          searxngTorRedirectsChecks: [...redirects.searxng.tor],
-          searxngTorCustomRedirects: [],
-
-          searxngI2pRedirectsChecks: [...redirects.searxng.i2p],
-          searxngI2pCustomRedirects: [],
-        })
-        resolve();
-      })
-    })
-  })
-}
-
-export default {
-  setRedirects,
-  initSearxCookies,
-  setSearxCookies,
-  initSearxngCookies,
-  setSearxngCookies,
-  redirect,
-  initDefaults,
-  switchInstance,
-};
diff --git a/src/assets/javascripts/helpers/sendTargets.js b/src/assets/javascripts/helpers/sendTargets.js
deleted file mode 100644
index a3e87268..00000000
--- a/src/assets/javascripts/helpers/sendTargets.js
+++ /dev/null
@@ -1,149 +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\/$/
-];
-
-let redirects = {
-    "send": {
-        "normal": [],
-        "tor": []
-    }
-}
-function setRedirects(val) {
-    browser.storage.local.get('cloudflareList', r => {
-        redirects.send = val;
-        sendNormalRedirectsChecks = [...redirects.send.normal];
-        for (const instance of r.cloudflareList) {
-            const a = sendNormalRedirectsChecks.indexOf(instance);
-            if (a > -1) sendNormalRedirectsChecks.splice(a, 1);
-        }
-        browser.storage.local.set({
-            sendTargetsRedirects: redirects,
-            sendNormalRedirectsChecks,
-        })
-    })
-}
-
-let
-    disableSendTarget,
-    sendTargetsRedirects,
-    sendNormalRedirectsChecks,
-    sendNormalCustomRedirects,
-    sendTorRedirectsChecks,
-    sendTorCustomRedirects,
-    sendTargetsProtocol;
-
-function init() {
-    return new Promise(resolve => {
-        browser.storage.local.get(
-            [
-                "disableSendTarget",
-                "sendTargetsRedirects",
-                "sendTargetsProtocol",
-                "sendNormalRedirectsChecks",
-                "sendNormalCustomRedirects",
-                "sendTorRedirectsChecks",
-                "sendTorCustomRedirects",
-            ],
-            r => {
-                disableSendTarget = r.disableSendTarget;
-                sendTargetsRedirects = r.sendTargetsRedirects;
-                sendNormalRedirectsChecks = r.sendNormalRedirectsChecks;
-                sendNormalCustomRedirects = r.sendNormalCustomRedirects;
-                sendTorRedirectsChecks = r.sendTorRedirectsChecks;
-                sendTorCustomRedirects = r.sendTorCustomRedirects;
-                sendTargetsProtocol = r.sendTargetsProtocol;
-                resolve();
-            }
-        )
-    })
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-function all() {
-    return [
-        ...sendTargetsRedirects.send.normal,
-        ...sendTargetsRedirects.send.tor,
-        ...sendNormalCustomRedirects,
-        ...sendTorRedirectsChecks,
-        ...sendTorCustomRedirects,
-    ];
-}
-
-function switchInstance(url) {
-    return new Promise(async resolve => {
-        await init();
-        const protocolHost = utils.protocolHost(url);
-        if (!all().includes(protocolHost)) { resolve(); return; }
-        if (url.pathname != '/') { resolve(); return; }
-
-        let instancesList;
-        if (sendTargetsProtocol == 'normal') instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects];
-        else if (sendTargetsProtocol == 'tor') instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects];
-
-        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) {
-    if (disableSendTarget) 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 (sendTargetsProtocol == 'normal') instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects];
-    if (sendTargetsProtocol == 'tor') instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects];
-    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);
-            redirects.send = dataJson.send;
-            browser.storage.local.get('cloudflareList', async r => {
-                sendNormalRedirectsChecks = [...redirects.send.normal];
-                for (const instance of r.cloudflareList) {
-                    let i = sendNormalRedirectsChecks.indexOf(instance);
-                    if (i > -1) sendNormalRedirectsChecks.splice(i, 1);
-                }
-                await browser.storage.local.set({
-                    disableSendTarget: false,
-                    sendTargetsRedirects: redirects,
-
-                    sendNormalRedirectsChecks: sendNormalRedirectsChecks,
-                    sendNormalCustomRedirects: [],
-
-                    sendTorRedirectsChecks: [...redirects.send.tor],
-                    sendTorCustomRedirects: [],
-
-                    sendTargetsProtocol: "normal",
-                })
-                resolve();
-            })
-        })
-    })
-}
-
-export default {
-    setRedirects,
-    redirect,
-    switchInstance,
-    initDefaults,
-};
diff --git a/src/assets/javascripts/helpers/tiktok.js b/src/assets/javascripts/helpers/tiktok.js
deleted file mode 100644
index 750744e6..00000000
--- a/src/assets/javascripts/helpers/tiktok.js
+++ /dev/null
@@ -1,175 +0,0 @@
-window.browser = window.browser || window.chrome;
-
-import utils from './utils.js'
-
-const targets = [
-    /^https?:\/{2}(www\.|)tiktok\.com.*/
-];
-
-let redirects = {
-    "proxiTok": {
-        "normal": [],
-        "tor": []
-    }
-}
-function setRedirects(val) {
-    browser.storage.local.get('cloudflareList', r => {
-        redirects.proxiTok = val;
-        proxiTokNormalRedirectsChecks = [...redirects.proxiTok.normal];
-        for (const instance of r.cloudflareList) {
-            const a = proxiTokNormalRedirectsChecks.indexOf(instance);
-            if (a > -1) proxiTokNormalRedirectsChecks.splice(a, 1);
-        }
-        browser.storage.local.set({
-            tiktokRedirects: redirects,
-            proxiTokNormalRedirectsChecks
-        })
-    })
-}
-
-function initProxiTokCookies(test, from) {
-    return new Promise(async resolve => {
-        await init();
-        let protocolHost = utils.protocolHost(from);
-        if (![
-            ...proxiTokNormalRedirectsChecks,
-            ...proxiTokNormalCustomRedirects,
-            ...proxiTokTorRedirectsChecks,
-            ...proxiTokTorCustomRedirects,
-        ].includes(protocolHost)) resolve();
-
-        if (!test) {
-            let checkedInstances;
-            if (tiktokProtocol == 'normal') checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
-            else if (tiktokProtocol == 'tor') checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
-            for (const to of checkedInstances) {
-                utils.copyCookie('proxitok', from, to, 'theme');
-                utils.copyCookie('proxitok', from, to, 'api-legacy');
-            }
-        }
-        resolve(true);
-    })
-}
-
-function setProxiTokCookies() {
-    return new Promise(resolve => {
-        if (disableTiktok || tiktokProtocol === undefined) { resolve(); return; }
-        let checkedInstances;
-        if (tiktokProtocol == 'normal') checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
-        else if (tiktokProtocol == 'tor') checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
-        for (const to of checkedInstances) {
-            utils.getCookiesFromStorage('proxitok', to, 'theme');
-            utils.getCookiesFromStorage('proxitok', to, 'api-legacy');
-        }
-        resolve();
-    })
-}
-
-let
-    disableTiktok,
-    tiktokProtocol,
-    tiktokRedirects,
-    proxiTokNormalRedirectsChecks,
-    proxiTokNormalCustomRedirects,
-    proxiTokTorRedirectsChecks,
-    proxiTokTorCustomRedirects;
-
-function init() {
-    return new Promise(async resolve => {
-        browser.storage.local.get(
-            [
-                "disableTiktok",
-                "tiktokProtocol",
-                "tiktokRedirects",
-                "proxiTokNormalRedirectsChecks",
-                "proxiTokNormalCustomRedirects",
-                "proxiTokTorRedirectsChecks",
-                "proxiTokTorCustomRedirects",
-            ],
-            r => {
-                disableTiktok = r.disableTiktok;
-                tiktokProtocol = r.tiktokProtocol;
-                tiktokRedirects = r.tiktokRedirects;
-                proxiTokNormalRedirectsChecks = r.proxiTokNormalRedirectsChecks;
-                proxiTokNormalCustomRedirects = r.proxiTokNormalCustomRedirects;
-                proxiTokTorRedirectsChecks = r.proxiTokTorRedirectsChecks;
-                proxiTokTorCustomRedirects = r.proxiTokTorCustomRedirects;
-                resolve();
-            }
-        )
-    })
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-// https://www.tiktok.com/@keysikaspol/video/7061265241887345946
-// https://www.tiktok.com/@keysikaspol
-function redirect(url, type, initiator) {
-    if (disableTiktok) 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 (tiktokProtocol == 'normal') instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects];
-    if (tiktokProtocol == 'tor') instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects];
-    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
-        ];
-        if (!all.includes(protocolHost)) { resolve(); return; }
-
-        resolve(`https://tiktok.com${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);
-            redirects.proxiTok = dataJson.proxiTok;
-            await browser.storage.local.set({
-                disableTiktok: false,
-                tiktokProtocol: "normal",
-
-                tiktokRedirects: redirects,
-
-                proxiTokNormalRedirectsChecks: [...redirects.proxiTok.normal],
-                proxiTokNormalCustomRedirects: [],
-
-                proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor],
-                proxiTokTorCustomRedirects: [],
-            });
-            resolve();
-        });
-    })
-}
-
-export default {
-    setRedirects,
-
-    redirect,
-    reverse,
-
-    initProxiTokCookies,
-    setProxiTokCookies,
-
-    initDefaults
-};
diff --git a/src/assets/javascripts/helpers/translate/get_lingva_preferences.js b/src/assets/javascripts/helpers/translate/get_lingva_preferences.js
deleted file mode 100644
index f04ea3dc..00000000
--- a/src/assets/javascripts/helpers/translate/get_lingva_preferences.js
+++ /dev/null
@@ -1,10 +0,0 @@
-window.browser = window.browser || window.chrome;
-
-browser.storage.local.set(
-    {
-        ['lingva_lingva_chakra-ui-color-mode']: localStorage.getItem('chakra-ui-color-mode'),
-        lingva_lingva_isauto: localStorage.getItem('isauto'),
-        lingva_lingva_source: localStorage.getItem('source'),
-        lingva_lingva_target: localStorage.getItem('target'),
-    }
-)
diff --git a/src/assets/javascripts/helpers/translate/set_lingva_preferences.js b/src/assets/javascripts/helpers/translate/set_lingva_preferences.js
deleted file mode 100644
index 01a3b85e..00000000
--- a/src/assets/javascripts/helpers/translate/set_lingva_preferences.js
+++ /dev/null
@@ -1,19 +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);
-        console.log('r.lingva_isauto', r.lingva_isauto, localStorage.getItem('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/helpers/translate/translate.js b/src/assets/javascripts/helpers/translate/translate.js
deleted file mode 100644
index 74400040..00000000
--- a/src/assets/javascripts/helpers/translate/translate.js
+++ /dev/null
@@ -1,295 +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}\//,
-];
-
-let redirects = {
-  "simplyTranslate": {
-    "normal": [],
-    "tor": []
-  },
-  "lingva": {
-    "normal": [],
-    "tor": []
-  }
-};
-
-let
-  translateDisable,
-  translateFrontend,
-  translateProtocol,
-  translateRedirects,
-  simplyTranslateNormalRedirectsChecks,
-  simplyTranslateNormalCustomRedirects,
-  simplyTranslateTorRedirectsChecks,
-  simplyTranslateTorCustomRedirects,
-  lingvaNormalRedirectsChecks,
-  lingvaNormalCustomRedirects,
-  lingvaTorRedirectsChecks,
-  lingvaTorCustomRedirects;
-
-function init() {
-  return new Promise(resolve => {
-    browser.storage.local.get(
-      [
-        "translateDisable",
-        "translateFrontend",
-        "translateProtocol",
-        "translateRedirects",
-
-        "simplyTranslateNormalRedirectsChecks",
-        "simplyTranslateNormalCustomRedirects",
-        "simplyTranslateTorRedirectsChecks",
-        "simplyTranslateTorCustomRedirects",
-
-        "lingvaNormalRedirectsChecks",
-        "lingvaNormalCustomRedirects",
-        "lingvaTorRedirectsChecks",
-        "lingvaTorCustomRedirects",
-      ],
-      r => {
-        translateDisable = r.translateDisable;
-        translateFrontend = r.translateFrontend;
-        translateProtocol = r.translateProtocol;
-        translateRedirects = r.translateRedirects;
-        simplyTranslateNormalRedirectsChecks = r.simplyTranslateNormalRedirectsChecks;
-        simplyTranslateNormalCustomRedirects = r.simplyTranslateNormalCustomRedirects;
-        simplyTranslateTorRedirectsChecks = r.simplyTranslateTorRedirectsChecks;
-        simplyTranslateTorCustomRedirects = r.simplyTranslateTorCustomRedirects;
-        lingvaNormalRedirectsChecks = r.lingvaNormalRedirectsChecks;
-        lingvaNormalCustomRedirects = r.lingvaNormalCustomRedirects;
-        lingvaTorRedirectsChecks = r.lingvaTorRedirectsChecks;
-        lingvaTorCustomRedirects = r.lingvaTorCustomRedirects;
-        resolve();
-      }
-    )
-  })
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-function setRedirects(val) {
-  browser.storage.local.get('cloudflareList', r => {
-    redirects = val;
-    simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal];
-    lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
-    for (const instance of r.cloudflareList) {
-      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({
-      translateRedirects: redirects,
-      simplyTranslateNormalRedirectsChecks,
-      simplyTranslateTorRedirectsChecks: redirects.simplyTranslate.tor,
-      lingvaNormalRedirectsChecks,
-      lingvaTorRedirectsChecks: redirects.lingva.tor,
-    })
-  })
-}
-
-function initLingvaLocalStorage(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,
-    ].includes(protocolHost)) { resolve(); return; }
-
-    if (!test) {
-      browser.tabs.executeScript(
-        tabId,
-        { file: "/assets/javascripts/helpers/translate/get_lingva_preferences.js", runAt: "document_start" }
-      );
-
-      let checkedInstances;
-      if (translateProtocol == 'normal') checkedInstances = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
-      if (translateProtocol == 'tor') checkedInstances = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
-      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/helpers/translate/set_lingva_preferences.js", runAt: "document_start" })
-        );
-    }
-    resolve(true);
-  }
-  )
-}
-
-function initSimplyTranslateCookies(test, from) {
-  return new Promise(async resolve => {
-    await init();
-    const protocolHost = utils.protocolHost(from);
-    if (![
-      ...simplyTranslateNormalRedirectsChecks,
-      ...simplyTranslateNormalCustomRedirects,
-      ...simplyTranslateTorRedirectsChecks,
-      ...simplyTranslateTorCustomRedirects,
-    ].includes(protocolHost)) { resolve(); return; }
-    if (!test) {
-      let checkedInstances;
-      if (translateProtocol == 'normal') checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
-      else if (translateProtocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
-      for (const to of checkedInstances) {
-        utils.copyCookie('simplyTranslate', from, to, 'from_lang');
-        utils.copyCookie('simplyTranslate', from, to, 'to_lang');
-        utils.copyCookie('simplyTranslate', from, to, 'tts_enabled');
-        utils.copyCookie('simplyTranslate', from, to, 'use_text_fields');
-      }
-    }
-    resolve(true);
-  }
-  )
-}
-
-function setSimplyTranslateCookies() {
-  return new Promise(async resolve => {
-    await init();
-    if (translateDisable || translateFrontend != 'simplyTranslate') { resolve(); return; }
-    let checkedInstances;
-    if (translateProtocol == 'normal') checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
-    else if (translateProtocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
-    for (const to of checkedInstances) {
-      utils.getCookiesFromStorage('simplyTranslate', to, 'from_lang');
-      utils.getCookiesFromStorage('simplyTranslate', to, 'to_lang');
-      utils.getCookiesFromStorage('simplyTranslate', to, 'tts_enabled');
-      utils.getCookiesFromStorage('simplyTranslate', to, 'use_text_fields');
-    }
-    resolve();
-  }
-  )
-}
-
-function redirect(url) {
-  if (translateDisable) return;
-  if (!targets.some(rx => rx.test(url.href))) return;
-
-  if (translateFrontend == 'simplyTranslate') {
-    let instancesList;
-    if (translateProtocol == 'normal') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects];
-    if (translateProtocol == 'tor') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects];
-    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 (translateProtocol == 'normal') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
-    if (translateProtocol == 'tor') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
-    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) {
-  return new Promise(async resolve => {
-    await init();
-    if (translateDisable) { resolve(); return; }
-    const protocolHost = utils.protocolHost(url);
-    if (![
-      ...translateRedirects.simplyTranslate.normal,
-      ...translateRedirects.simplyTranslate.tor,
-
-      ...simplyTranslateNormalCustomRedirects,
-      ...simplyTranslateTorCustomRedirects,
-
-      ...translateRedirects.lingva.normal,
-      ...translateRedirects.lingva.tor,
-
-      ...lingvaNormalCustomRedirects,
-      ...lingvaTorCustomRedirects,
-    ].includes(protocolHost)) { resolve(); return; }
-
-    let instancesList;
-    if (translateProtocol == 'normal') {
-      if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects];
-      else if (translateFrontend == 'lingva') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects];
-    }
-    else if (translateProtocol == 'tor') {
-      if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects];
-      else if (translateFrontend == 'lingva') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects];
-    }
-
-    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(data => {
-      let dataJson = JSON.parse(data);
-      redirects.simplyTranslate = dataJson.simplyTranslate;
-      redirects.lingva = dataJson.lingva;
-      browser.storage.local.get('cloudflareList',
-        async r => {
-          simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal];
-          lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
-          for (const instance of r.cloudflareList) {
-            const a = simplyTranslateNormalRedirectsChecks.indexOf(instance);
-            if (a > -1) simplyTranslateNormalRedirectsChecks.splice(a, 1);
-
-            const b = lingvaNormalRedirectsChecks.indexOf(instance);
-            if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1);
-          }
-          await browser.storage.local.set({
-            translateDisable: false,
-            translateFrontend: "simplyTranslate",
-            translateProtocol: 'normal',
-            translateRedirects: redirects,
-
-            simplyTranslateNormalRedirectsChecks: simplyTranslateNormalRedirectsChecks,
-            simplyTranslateNormalCustomRedirects: [],
-            simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor],
-            simplyTranslateTorCustomRedirects: [],
-
-            lingvaNormalRedirectsChecks: lingvaNormalRedirectsChecks,
-            lingvaNormalCustomRedirects: [],
-            lingvaTorRedirectsChecks: [...redirects.lingva.tor],
-            lingvaTorCustomRedirects: [],
-          })
-          resolve();
-        })
-    })
-  })
-}
-
-export default {
-  initSimplyTranslateCookies,
-  setSimplyTranslateCookies,
-  initLingvaLocalStorage,
-  setRedirects,
-  redirect,
-  initDefaults,
-  switchInstance,
-};
diff --git a/src/assets/javascripts/helpers/twitter.js b/src/assets/javascripts/helpers/twitter.js
deleted file mode 100644
index dc48f9b1..00000000
--- a/src/assets/javascripts/helpers/twitter.js
+++ /dev/null
@@ -1,241 +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/
-];
-
-let redirects = {
-  "nitter": {
-    "normal": [],
-    "tor": []
-  },
-};
-
-function setRedirects(val) {
-  browser.storage.local.get('cloudflareList', r => {
-    redirects.nitter = val;
-    nitterNormalRedirectsChecks = [...redirects.nitter.normal];
-    for (const instance of r.cloudflareList) {
-      let i = nitterNormalRedirectsChecks.indexOf(instance);
-      if (i > -1) nitterNormalRedirectsChecks.splice(i, 1);
-    }
-    browser.storage.local.set({
-      twitterRedirects: redirects,
-      nitterNormalRedirectsChecks,
-      nitterTorRedirectsChecks: [...redirects.nitter.tor]
-    })
-  })
-}
-
-let
-  disableTwitter,
-  twitterProtocol,
-  twitterRedirects,
-  nitterNormalRedirectsChecks,
-  nitterNormalCustomRedirects,
-  nitterTorRedirectsChecks,
-  nitterTorCustomRedirects;
-
-function init() {
-  return new Promise(async resolve => {
-    browser.storage.local.get(
-      [
-        "disableTwitter",
-        "twitterProtocol",
-        "twitterRedirects",
-        "nitterNormalRedirectsChecks",
-        "nitterNormalCustomRedirects",
-        "nitterTorRedirectsChecks",
-        "nitterTorCustomRedirects",
-      ],
-      r => {
-        disableTwitter = r.disableTwitter;
-        twitterProtocol = r.twitterProtocol;
-        twitterRedirects = r.twitterRedirects;
-        nitterNormalRedirectsChecks = r.nitterNormalRedirectsChecks;
-        nitterNormalCustomRedirects = r.nitterNormalCustomRedirects;
-        nitterTorRedirectsChecks = r.nitterTorRedirectsChecks;
-        nitterTorCustomRedirects = r.nitterTorCustomRedirects;
-        resolve();
-      }
-    )
-  })
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-function all() {
-  return [
-    ...nitterNormalRedirectsChecks,
-    ...nitterTorRedirectsChecks,
-    ...nitterNormalCustomRedirects,
-    ...nitterTorCustomRedirects,
-  ];
-}
-
-function redirect(url, initiator) {
-  if (disableTwitter) 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';
-
-  let instancesList;
-  if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects];
-  else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects];
-  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")
-    return `${randomInstance}/pic/${encodeURIComponent(`${url.host}${url.pathname}`)}`;
-  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) {
-  return new Promise(async resolve => {
-    await init();
-    const protocolHost = utils.protocolHost(url);
-    if (!all().includes(protocolHost)) { resolve(); return; }
-    let instancesList;
-    if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects];
-    else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects];
-
-    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) {
-  let url = new URL(e.url);
-  let protocolHost = utils.protocolHost(url);
-  if (!all().includes(protocolHost) || e.type != 'sub_frame') 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;
-  }
-  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 (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
-      else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
-      for (const to of checkedInstances) {
-        utils.copyCookie('nitter', from, to, 'theme');
-        utils.copyCookie('nitter', from, to, 'infiniteScroll');
-        utils.copyCookie('nitter', from, to, 'stickyProfile');
-        utils.copyCookie('nitter', from, to, 'bidiSupport');
-        utils.copyCookie('nitter', from, to, 'hideTweetStats');
-        utils.copyCookie('nitter', from, to, 'hideBanner');
-        utils.copyCookie('nitter', from, to, 'hidePins');
-        utils.copyCookie('nitter', from, to, 'hideReplies');
-        utils.copyCookie('nitter', from, to, 'squareAvatars');
-        utils.copyCookie('nitter', from, to, 'mp4Playback');
-        utils.copyCookie('nitter', from, to, 'hlsPlayback');
-        utils.copyCookie('nitter', from, to, 'proxyVideos');
-        utils.copyCookie('nitter', from, to, 'muteVideos');
-        utils.copyCookie('nitter', from, to, 'autoplayGifs');
-      }
-    }
-    resolve(true);
-  })
-}
-
-function setNitterCookies() {
-  return new Promise(async resolve => {
-    await init();
-    if (disableTwitter || twitterProtocol === undefined) { resolve(); return; }
-    let checkedInstances;
-    if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
-    else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
-    for (const to of checkedInstances) {
-      utils.getCookiesFromStorage('nitter', to, 'theme');
-      utils.getCookiesFromStorage('nitter', to, 'infiniteScroll');
-      utils.getCookiesFromStorage('nitter', to, 'stickyProfile');
-      utils.getCookiesFromStorage('nitter', to, 'bidiSupport');
-      utils.getCookiesFromStorage('nitter', to, 'hideTweetStats');
-      utils.getCookiesFromStorage('nitter', to, 'hideBanner');
-      utils.getCookiesFromStorage('nitter', to, 'hidePins');
-      utils.getCookiesFromStorage('nitter', to, 'hideReplies');
-      utils.getCookiesFromStorage('nitter', to, 'squareAvatars');
-      utils.getCookiesFromStorage('nitter', to, 'mp4Playback');
-      utils.getCookiesFromStorage('nitter', to, 'hlsPlayback');
-      utils.getCookiesFromStorage('nitter', to, 'proxyVideos');
-      utils.getCookiesFromStorage('nitter', to, 'muteVideos');
-      utils.getCookiesFromStorage('nitter', to, 'autoplayGifs');
-    }
-    resolve();
-  }
-  )
-}
-
-function initDefaults() {
-  return new Promise(resolve => {
-    fetch('/instances/data.json').then(response => response.text()).then(data => {
-      let dataJson = JSON.parse(data);
-      redirects.nitter = dataJson.nitter;
-      browser.storage.local.get('cloudflareList', async r => {
-        nitterNormalRedirectsChecks = [...redirects.nitter.normal];
-        for (const instance of r.cloudflareList) {
-          let i = nitterNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) nitterNormalRedirectsChecks.splice(i, 1);
-        }
-        await browser.storage.local.set({
-          disableTwitter: false,
-          twitterRedirects: redirects,
-          twitterProtocol: "normal",
-
-          nitterNormalRedirectsChecks,
-          nitterNormalCustomRedirects: [],
-
-          nitterTorRedirectsChecks: [...redirects.nitter.tor],
-          nitterTorCustomRedirects: [],
-        })
-        resolve();
-      })
-    })
-  })
-}
-
-export default {
-  setRedirects,
-  redirect,
-  switchInstance,
-  reverse,
-  removeXFrameOptions,
-  initNitterCookies,
-  setNitterCookies,
-  initDefaults,
-};
diff --git a/src/assets/javascripts/helpers/utils.js b/src/assets/javascripts/helpers/utils.js
deleted file mode 100644
index 16fdaae7..00000000
--- a/src/assets/javascripts/helpers/utils.js
+++ /dev/null
@@ -1,456 +0,0 @@
-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 imgurHelper from "./imgur.js";
-import localise from '../localise.js'
-
-function getRandomInstance(instances) {
-  return instances[~~(instances.length * Math.random())];
-}
-
-let cloudflareList = [];
-async function initCloudflareList() {
-  return new Promise(resolve => {
-    fetch('/instances/blocklist.json').then(response => response.text()).then(data => {
-      cloudflareList = JSON.parse(data);
-      resolve();
-    })
-  });
-}
-
-function updateInstances() {
-  return new Promise(async resolve => {
-    let http = new XMLHttpRequest();
-    http.open('GET', 'https://raw.githubusercontent.com/libredirect/libredirect/master/src/instances/data.json', false);
-    http.send(null);
-    if (http.status === 200) {
-      await initCloudflareList();
-      const instances = JSON.parse(http.responseText);
-
-      youtubeHelper.setRedirects({ 'invidious': instances.invidious, 'piped': instances.piped, })
-      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 });
-      wikipediaHelper.setRedirects(instances.wikiless);
-      mediumHelper.setRedirects(instances.scribe);
-      sendTargetsHelper.setRedirects(instances.send);
-      tiktokHelper.setRedirects(instances.proxiTok);
-
-      console.info("Successfully updated Instances");
-      resolve(true); return;
-    }
-    resolve()
-  })
-}
-
-function protocolHost(url) {
-  if (url.username && url.password) return `${url.protocol}//${url.username}:${url.password}@${url.host}`;
-  return `${url.protocol}//${url.host}`;
-}
-
-async function processDefaultCustomInstances(target, name, protocol, document) {
-
-  function camelCase(str) {
-    return str.charAt(0).toUpperCase() + str.slice(1);
-  }
-  let latencyKey = `${name}Latency`;
-  let instancesLatency;
-  await browser.storage.local.get(latencyKey, r => instancesLatency = r[latencyKey] ?? []);
-  let nameProtocolElement = document.getElementById(name).getElementsByClassName(protocol)[0];
-
-  let nameCustomInstances = [];
-  let nameCheckListElement = nameProtocolElement.getElementsByClassName('checklist')[0];
-
-  await initCloudflareList();
-
-
-  let nameDefaultRedirects;
-
-  let redirectsChecks = `${name}${camelCase(protocol)}RedirectsChecks`;
-  let customRedirects = `${name}${camelCase(protocol)}CustomRedirects`;
-  let redirectsKey = `${target}Redirects`;
-
-  let redirects;
-
-  async function getFromStorage() {
-    return new Promise(async resolve => {
-      browser.storage.local.get(
-        [
-          redirectsChecks,
-          customRedirects,
-          redirectsKey
-        ],
-        r => {
-          nameDefaultRedirects = r[redirectsChecks];
-          nameCustomInstances = r[customRedirects];
-          redirects = r[redirectsKey];
-          resolve();
-        }
-      )
-    })
-  }
-  await getFromStorage();
-
-  function calcNameCheckBoxes() {
-    let isTrue = true;
-    for (const item of redirects[name][protocol])
-      if (!nameDefaultRedirects.includes(item)) {
-        isTrue = false;
-        break;
-      }
-    for (const element of nameCheckListElement.getElementsByTagName('input'))
-      element.checked = nameDefaultRedirects.includes(element.className)
-    if (nameDefaultRedirects.length == 0) isTrue = false;
-    nameProtocolElement.getElementsByClassName('toogle-all')[0].checked = isTrue;
-  }
-  nameCheckListElement.innerHTML =
-    [
-      `<div>
-        <x data-localise="__MSG_toggleAll__">Toggle All</x>
-        <input type="checkbox" class="toogle-all"/>
-      </div>`,
-      ...redirects[name][protocol].map(
-        x => {
-          let cloudflare = cloudflareList.includes(x) ? ' <span style="color:red;">cloudflare</span>' : '';
-
-          let ms = instancesLatency[x];
-          let latencyColor = (ms <= 1000 ? "green" : ms <= 2000 ? "orange" : "red");
-          let latencyLimit;
-          if (ms == 5000) latencyLimit = '5000ms+';
-          else if (ms > 5000) latencyLimit = `ERROR: ${ms - 5000}`;
-          else latencyLimit = ms + 'ms';
-
-          let latency = x in instancesLatency ? '<span style="color:' + latencyColor + ';">' + latencyLimit + '</span>' : '';
-
-          return `<div>
-                    <x><a href="${x}" target="_blank">${x}</a>${cloudflare} ${latency}</x>
-                    <input type="checkbox" class="${x}"/>
-                  </div>`;
-        }
-      ),
-    ].join('\n<hr>\n');
-
-  localise.localisePage();
-
-  calcNameCheckBoxes();
-  nameProtocolElement.getElementsByClassName('toogle-all')[0].addEventListener("change", async event => {
-    if (event.target.checked)
-      nameDefaultRedirects = [...redirects[name][protocol]];
-    else
-      nameDefaultRedirects = [];
-
-    await browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects });
-    calcNameCheckBoxes();
-  });
-
-  for (let element of nameCheckListElement.getElementsByTagName('input')) {
-    if (element.className != 'toogle-all')
-      nameProtocolElement.getElementsByClassName(element.className)[0].addEventListener("change", async event => {
-        if (event.target.checked)
-          nameDefaultRedirects.push(element.className)
-        else {
-          let index = nameDefaultRedirects.indexOf(element.className);
-          if (index > -1) nameDefaultRedirects.splice(index, 1);
-        }
-        await browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects });
-        calcNameCheckBoxes();
-      });
-  }
-
-  function calcNameCustomInstances() {
-    nameProtocolElement.getElementsByClassName('custom-checklist')[0].innerHTML =
-      nameCustomInstances.map(
-        x => `<div>
-                ${x}
-                <button class="add clear-${x}">
-                  <svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
-                    <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z" />
-                  </svg>
-                </button>
-              </div>
-              <hr>`
-      ).join('\n');
-
-    for (const item of nameCustomInstances) {
-      nameProtocolElement.getElementsByClassName(`clear-${item}`)[0].addEventListener("click", async () => {
-        let index = nameCustomInstances.indexOf(item);
-        if (index > -1) nameCustomInstances.splice(index, 1);
-        await browser.storage.local.set({ [customRedirects]: nameCustomInstances });
-        calcNameCustomInstances();
-      });
-    }
-  }
-  calcNameCustomInstances();
-  nameProtocolElement.getElementsByClassName('custom-instance-form')[0].addEventListener("submit", async event => {
-    event.preventDefault();
-    let nameCustomInstanceInput = nameProtocolElement.getElementsByClassName('custom-instance')[0];
-    let url = new URL(nameCustomInstanceInput.value);
-    let protocolHostVar = protocolHost(url);
-    if (nameCustomInstanceInput.validity.valid && !redirects[name][protocol].includes(protocolHostVar)) {
-      if (!nameCustomInstances.includes(protocolHostVar)) {
-        nameCustomInstances.push(protocolHostVar)
-        await browser.storage.local.set({ [customRedirects]: nameCustomInstances });
-        nameCustomInstanceInput.value = '';
-      }
-      calcNameCustomInstances();
-    }
-  })
-}
-
-function isRtl() {
-  return ["ar", "iw", "ku", "fa", "ur"].includes(browser.i18n.getUILanguage())
-}
-
-function getIp(href) {
-  return new Promise(resolve => {
-    let host = new URL(href).hostname;
-    let http = new XMLHttpRequest();
-    http.open("GET", `https://dns.google/resolve?name=${host}`, /*async*/true);
-    http.onreadystatechange = () => {
-      if (http.readyState == 4 && http.status == 200) {
-        let r = JSON.parse(http.responseText);
-        resolve(r.Answer[0].data)
-      }
-    };
-    http.ontimeout = () => resolve()
-    http.onerror = () => resolve()
-    try {
-      http.send(null)
-    }
-    catch (exception) {
-      resolve()
-    }
-  })
-}
-
-async function ping(href) {
-  return new Promise(async resolve => {
-    let http = new XMLHttpRequest();
-    http.open("GET", `${href}?_=${new Date().getTime()}`, /*async*/true);
-    http.timeout = 5000;
-    let started = new Date().getTime();
-    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.ontimeout = () => resolve(5000)
-    http.onerror = () => resolve()
-    try {
-      http.send(null);
-    } catch (exception) {
-      resolve()
-    }
-  });
-}
-
-async function testLatency(element, instances) {
-  return new Promise(async resolve => {
-    let myList = {};
-    for (const href of instances) await ping(href).then(m => {
-      if (m) {
-        myList[href] = m;
-        let color;
-        if (m <= 1000) color = "green"
-        else if (m <= 2000) color = "orange"
-        else color = "red";
-
-        let text;
-        if (m == 5000) text = '5000ms+'
-        else if (m > 5000) text = `ERROR: ${m - 5000}`;
-        else text = `${m}ms`;
-        element.innerHTML = `${href}:&nbsp;<span style="color:${color};">${text}</span>`;
-      }
-    })
-    resolve(myList);
-  })
-}
-
-function copyCookie(frontend, targetUrl, url, name) {
-  browser.cookies.get(
-    { url: protocolHost(targetUrl), name: name },
-    r => {
-      if (r) {
-        browser.cookies.set({ url: url, name: name, value: r.value })
-        browser.storage.local.set({ [`${frontend}_${name}`]: r.value })
-      }
-    }
-  )
-}
-
-function getCookiesFromStorage(frontend, to, name) {
-  let key = `${frontend}_${name}`;
-  browser.storage.local.get(
-    key,
-    r => {
-      if (r[key] !== undefined) browser.cookies.set({ url: to, name: name, value: r[key] })
-    }
-  )
-}
-
-function copyRaw(test, copyRawElement) {
-  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; }
-          let newUrl = await youtubeHelper.reverse(url);
-          if (!newUrl) newUrl = await twitterHelper.reverse(url);
-          if (!newUrl) newUrl = await instagramHelper.reverse(url);
-          if (!newUrl) newUrl = await tiktokHelper.reverse(url);
-          if (!newUrl) newUrl = await imgurHelper.reverse(url);
-
-          if (newUrl) {
-            resolve(true);
-            if (test) return;
-            navigator.clipboard.writeText(newUrl);
-            if (copyRawElement) {
-              const textElement = copyRawElement.getElementsByTagName('h4')[0]
-              const oldHtml = textElement.innerHTML;
-              textElement.innerHTML = 'Copied';
-              setTimeout(() => textElement.innerHTML = oldHtml, 1000);
-            }
-          } else resolve()
-        }
-      }
-    )
-  })
-}
-
-function unify(test) {
-  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; }
-
-          let result = await youtubeHelper.initInvidiousCookies(test, url);
-          if (!result) result = await youtubeHelper.initPipedLocalStorage(test, url, currTab.id);
-          if (!result) result = await youtubeHelper.initPipedMaterialLocalStorage(test, url, currTab.id);
-
-          if (!result) result = await twitterHelper.initNitterCookies(test, url);
-
-          if (!result) result = await redditHelper.initLibredditCookies(test, url);
-          if (!result) result = await redditHelper.initTedditCookies(test, url);
-
-          if (!result) result = await searchHelper.initSearxCookies(test, url);
-          if (!result) result = await searchHelper.initSearxngCookies(test, url);
-
-          if (!result) result = await tiktokHelper.initProxiTokCookies(test, url);
-
-          if (!result) result = await wikipediaHelper.initWikilessCookies(test, url);
-
-          if (!result) result = await translateHelper.initSimplyTranslateCookies(test, url);
-          if (!result) result = await translateHelper.initLingvaLocalStorage(test, url);
-
-          if (result) {
-            resolve(true);
-          } else resolve()
-        }
-      }
-    )
-  })
-}
-
-function switchInstance(test) {
-  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 };
-        let newUrl = await youtubeHelper.switchInstance(url);
-        if (!newUrl) newUrl = await twitterHelper.switchInstance(url);
-        if (!newUrl) newUrl = await instagramHelper.switchInstance(url);
-        if (!newUrl) newUrl = await redditHelper.switchInstance(url);
-        if (!newUrl) newUrl = await searchHelper.switchInstance(url);
-        if (!newUrl) newUrl = await translateHelper.switchInstance(url);
-        if (!newUrl) newUrl = await mediumHelper.switchInstance(url);
-        if (!newUrl) newUrl = await sendTargetsHelper.switchInstance(url);
-        if (!newUrl) newUrl = await peertubeHelper.switchInstance(url);
-        if (!newUrl) newUrl = await lbryHelper.switchInstance(url);
-        if (!newUrl) newUrl = await imgurHelper.switchInstance(url);
-        if (!newUrl) newUrl = await wikipediaHelper.switchInstance(url);
-
-        if (newUrl) {
-          if (!test)
-            browser.tabs.update({ url: newUrl });
-          resolve(true)
-        } else resolve()
-      }
-    })
-  })
-}
-
-function latency(name, frontend, document, location, splitNames) {
-  let latencyElement;
-  let latencyLabel;
-  if (splitNames == true) {
-    latencyElement = document.getElementById(`latency-${frontend}`);
-    latencyLabel = document.getElementById(`latency-${frontend}-label`);
-  } else {
-    latencyElement = document.getElementById("latency");
-    latencyLabel = document.getElementById("latency-label");
-  }
-  latencyElement.addEventListener("click",
-    async () => {
-      let reloadWindow = () => location.reload();
-      latencyElement.addEventListener("click", reloadWindow);
-      let key = `${name}Redirects`
-      browser.storage.local.get(
-        key,
-        r => {
-          let redirects = r[key];
-          const oldHtml = latencyLabel.innerHTML;
-          latencyLabel.innerHTML = '...';
-          testLatency(latencyLabel, redirects[frontend].normal).then(r => {
-            browser.storage.local.set({ [`${frontend}Latency`]: r });
-            latencyLabel.innerHTML = oldHtml;
-            processDefaultCustomInstances(name, frontend, 'normal', document);
-            latencyElement.removeEventListener("click", reloadWindow)
-          });
-        }
-      )
-    }
-  );
-}
-
-export default {
-  getRandomInstance,
-  updateInstances,
-  protocolHost,
-  processDefaultCustomInstances,
-  isRtl,
-  latency,
-  copyCookie,
-  getCookiesFromStorage,
-  switchInstance,
-  copyRaw,
-  unify,
-}
diff --git a/src/assets/javascripts/helpers/wikipedia.js b/src/assets/javascripts/helpers/wikipedia.js
deleted file mode 100644
index 868bb01c..00000000
--- a/src/assets/javascripts/helpers/wikipedia.js
+++ /dev/null
@@ -1,220 +0,0 @@
-window.browser = window.browser || window.chrome;
-
-import utils from './utils.js'
-
-const targets = /^https?:\/{2}(([a-z]{1,}\.){0,})wikipedia\.org/
-
-let redirects = {
-  "wikiless": {
-    "normal": [],
-    "tor": [],
-    "i2p": []
-  }
-};
-function setRedirects(val) {
-  browser.storage.local.get('cloudflareList', r => {
-    redirects.wikiless = val;
-    wikilessNormalRedirectsChecks = [...redirects.wikiless.normal];
-    for (const instance of r.cloudflareList) {
-      const a = wikilessNormalRedirectsChecks.indexOf(instance);
-      if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1);
-    }
-    browser.storage.local.set({
-      wikipediaRedirects: redirects,
-      wikilessNormalRedirectsChecks
-    })
-  })
-}
-
-let
-  disableWikipedia,
-  wikipediaRedirects,
-  wikipediaProtocol,
-  wikilessNormalRedirectsChecks,
-  wikilessTorRedirectsChecks,
-  wikilessI2pRedirectsChecks,
-  wikilessNormalCustomRedirects,
-  wikilessTorCustomRedirects,
-  wikilessI2pCustomRedirects;
-
-function init() {
-  return new Promise(async resolve => {
-    browser.storage.local.get(
-      [
-        "disableWikipedia",
-        "wikipediaRedirects",
-        "wikipediaProtocol",
-
-        "wikilessNormalRedirectsChecks",
-        "wikilessTorRedirectsChecks",
-        "wikilessI2pRedirectsChecks",
-        "wikilessNormalCustomRedirects",
-        "wikilessTorCustomRedirects",
-        "wikilessI2pCustomRedirects",
-      ],
-      r => {
-        disableWikipedia = r.disableWikipedia;
-        wikipediaRedirects = r.wikipediaRedirects;
-        wikipediaProtocol = r.wikipediaProtocol;
-        wikilessNormalRedirectsChecks = r.wikilessNormalRedirectsChecks;
-        wikilessTorRedirectsChecks = r.wikilessTorRedirectsChecks;
-        wikilessI2pRedirectsChecks = r.wikilessI2pRedirectsChecks;
-        wikilessNormalCustomRedirects = r.wikilessNormalCustomRedirects;
-        wikilessTorCustomRedirects = r.wikilessTorCustomRedirects;
-        wikilessI2pCustomRedirects = r.wikilessI2pCustomRedirects;
-        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,
-    ];
-    if (!all.includes(protocolHost)) { resolve(); return; }
-
-    if (!test) {
-      let checkedInstances;
-      if (wikipediaProtocol == 'normal') checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
-      else if (wikipediaProtocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
-      else if (wikipediaProtocol == 'i2p') checkedInstances = [...wikilessI2pRedirectsChecks, ...wikilessI2pCustomRedirects]
-
-      for (const to of checkedInstances) {
-        utils.copyCookie('wikiless', from, to, 'theme');
-        utils.copyCookie('wikiless', from, to, 'default_lang');
-      }
-    }
-    resolve(true);
-  })
-}
-
-function setWikilessCookies() {
-  return new Promise(async resolve => {
-    await init();
-    if (disableWikipedia || wikipediaProtocol === undefined) { resolve(); return; }
-    let checkedInstances;
-    if (wikipediaProtocol == 'normal') checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
-    else if (wikipediaProtocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
-    for (const to of checkedInstances) {
-      utils.getCookiesFromStorage('wikiless', to, 'theme');
-      utils.getCookiesFromStorage('wikiless', to, 'default_lang');
-    }
-    resolve();
-  })
-}
-
-function redirect(url) {
-  if (disableWikipedia) 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 (wikipediaProtocol == 'normal') instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects];
-  else if (wikipediaProtocol == 'tor') instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects];
-  else if (wikipediaProtocol == 'i2p') instancesList = [...wikilessI2pRedirectsChecks, ...wikilessI2pCustomRedirects];
-  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) {
-  return new Promise(async resolve => {
-    await init();
-    const protocolHost = utils.protocolHost(url);
-    const wikipediaList = [
-      ...wikipediaRedirects.wikiless.normal,
-      ...wikipediaRedirects.wikiless.tor,
-      ...wikipediaRedirects.wikiless.i2p,
-
-      ...wikilessNormalCustomRedirects,
-      ...wikilessTorCustomRedirects,
-      ...wikilessI2pCustomRedirects
-    ];
-    if (!wikipediaList.includes(protocolHost)) { resolve(); return; }
-
-    let instancesList;
-    if (wikipediaProtocol == 'normal') instancesList = [...wikilessNormalCustomRedirects, ...wikilessNormalRedirectsChecks];
-    else if (wikipediaProtocol == 'tor') instancesList = [...wikilessTorCustomRedirects, ...wikilessTorRedirectsChecks];
-    else if (wikipediaProtocol == 'i2p') instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks];
-
-    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);
-      redirects.wikiless = dataJson.wikiless;
-      browser.storage.local.get('cloudflareList', async r => {
-        wikilessNormalRedirectsChecks = [...redirects.wikiless.normal];
-        for (const instance of r.cloudflareList) {
-          let i = wikilessNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) wikilessNormalRedirectsChecks.splice(i, 1);
-        }
-        await browser.storage.local.set({
-          disableWikipedia: true,
-          wikipediaRedirects: redirects,
-          wikipediaProtocol: "normal",
-          wikilessNormalRedirectsChecks: wikilessNormalRedirectsChecks,
-          wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
-          wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p],
-          wikilessNormalCustomRedirects: [],
-          wikilessTorCustomRedirects: [],
-          wikilessI2pCustomRedirects: [],
-        })
-        resolve();
-      })
-    })
-  })
-}
-
-export default {
-  setRedirects,
-
-  initWikilessCookies,
-  setWikilessCookies,
-
-  redirect,
-  initDefaults,
-  switchInstance,
-};
diff --git a/src/assets/javascripts/helpers/youtube/get_pipedMaterial_preferences.js b/src/assets/javascripts/helpers/youtube/get_pipedMaterial_preferences.js
deleted file mode 100644
index 9d052f62..00000000
--- a/src/assets/javascripts/helpers/youtube/get_pipedMaterial_preferences.js
+++ /dev/null
@@ -1,7 +0,0 @@
-window.browser = window.browser || window.chrome;
-
-browser.storage.local.set(
-    {
-        'pipedMaterial_PREFERENCES': localStorage.getItem("PREFERENCES")
-    }
-)
\ No newline at end of file
diff --git a/src/assets/javascripts/helpers/youtube/get_piped_preferences.js b/src/assets/javascripts/helpers/youtube/get_piped_preferences.js
deleted file mode 100644
index 417d64df..00000000
--- a/src/assets/javascripts/helpers/youtube/get_piped_preferences.js
+++ /dev/null
@@ -1,24 +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/helpers/youtube/set_pipedMaterial_preferences.js b/src/assets/javascripts/helpers/youtube/set_pipedMaterial_preferences.js
deleted file mode 100644
index 7415255a..00000000
--- a/src/assets/javascripts/helpers/youtube/set_pipedMaterial_preferences.js
+++ /dev/null
@@ -1,10 +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();
-    }
-)
\ No newline at end of file
diff --git a/src/assets/javascripts/helpers/youtube/set_piped_preferences.js b/src/assets/javascripts/helpers/youtube/set_piped_preferences.js
deleted file mode 100644
index d5ce49ff..00000000
--- a/src/assets/javascripts/helpers/youtube/set_piped_preferences.js
+++ /dev/null
@@ -1,44 +0,0 @@
-window.browser = window.browser || window.chrome;
-
-browser.storage.local.get(
-    [
-        "piped_bufferGoal",
-        "piped_comments",
-        "piped_disableLBRY",
-        "piped_enabledCodecs",
-        "piped_homepage",
-        "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();
-    }
-)
\ No newline at end of file
diff --git a/src/assets/javascripts/helpers/youtube/youtube.js b/src/assets/javascripts/helpers/youtube/youtube.js
deleted file mode 100644
index 564e99c0..00000000
--- a/src/assets/javascripts/helpers/youtube/youtube.js
+++ /dev/null
@@ -1,453 +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\/..*/,
-];
-let redirects = {
-  "invidious": {
-    "normal": [],
-    "tor": []
-  },
-  "piped": {
-    "normal": [],
-    "tor": []
-  },
-  "pipedMaterial": {
-    "normal": [
-      "https://piped-material.xn--17b.net",
-      "https://piped-material.ftp.sh",
-    ],
-    "tor": []
-  }
-};
-function setRedirects(val) {
-  browser.storage.local.get('cloudflareList', r => {
-    redirects.invidious = val.invidious;
-    redirects.piped = val.piped;
-    invidiousNormalRedirectsChecks = [...redirects.invidious.normal];
-    pipedNormalRedirectsChecks = [...redirects.piped.normal];
-    for (const instance of r.cloudflareList) {
-      const a = invidiousNormalRedirectsChecks.indexOf(instance);
-      if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1);
-
-      const b = pipedNormalRedirectsChecks.indexOf(instance);
-      if (b > -1) pipedNormalRedirectsChecks.splice(b, 1);
-    }
-    browser.storage.local.set({
-      youtubeRedirects: redirects,
-      invidiousNormalRedirectsChecks,
-      invidiousTorRedirectsChecks: redirects.invidious.tor,
-      pipedNormalRedirectsChecks,
-      pipedTorRedirectsChecks: redirects.piped.tor,
-    })
-  })
-}
-
-let
-  disableYoutube,
-  OnlyEmbeddedVideo,
-  youtubeFrontend,
-  youtubeProtocol,
-  youtubeEmbedFrontend,
-  youtubeRedirects,
-  invidiousNormalRedirectsChecks,
-  invidiousNormalCustomRedirects,
-  invidiousTorRedirectsChecks,
-  invidiousTorCustomRedirects,
-  pipedNormalRedirectsChecks,
-  pipedNormalCustomRedirects,
-  pipedTorRedirectsChecks,
-  pipedTorCustomRedirects,
-  pipedMaterialNormalRedirectsChecks,
-  pipedMaterialNormalCustomRedirects,
-  pipedMaterialTorRedirectsChecks,
-  pipedMaterialTorCustomRedirects;
-
-function init() {
-  return new Promise(resolve => {
-    browser.storage.local.get(
-      [
-        "disableYoutube",
-        "OnlyEmbeddedVideo",
-        "youtubeFrontend",
-        "youtubeProtocol",
-        "youtubeEmbedFrontend",
-        "youtubeRedirects",
-        "invidiousNormalRedirectsChecks",
-        "invidiousNormalCustomRedirects",
-        "invidiousTorRedirectsChecks",
-        "invidiousTorCustomRedirects",
-        "pipedNormalRedirectsChecks",
-        "pipedNormalCustomRedirects",
-        "pipedTorRedirectsChecks",
-        "pipedTorCustomRedirects",
-        "pipedMaterialNormalRedirectsChecks",
-        "pipedMaterialNormalCustomRedirects",
-        "pipedMaterialTorRedirectsChecks",
-        "pipedMaterialTorCustomRedirects",
-      ],
-      r => {
-        disableYoutube = r.disableYoutube;
-        OnlyEmbeddedVideo = r.OnlyEmbeddedVideo;
-        youtubeFrontend = r.youtubeFrontend;
-        youtubeProtocol = r.youtubeProtocol;
-        youtubeEmbedFrontend = r.youtubeEmbedFrontend;
-        youtubeRedirects = r.youtubeRedirects;
-        invidiousNormalRedirectsChecks = r.invidiousNormalRedirectsChecks;
-        invidiousNormalCustomRedirects = r.invidiousNormalCustomRedirects;
-        invidiousTorRedirectsChecks = r.invidiousTorRedirectsChecks;
-        invidiousTorCustomRedirects = r.invidiousTorCustomRedirects;
-        pipedNormalRedirectsChecks = r.pipedNormalRedirectsChecks;
-        pipedNormalCustomRedirects = r.pipedNormalCustomRedirects;
-        pipedTorRedirectsChecks = r.pipedTorRedirectsChecks;
-        pipedTorCustomRedirects = r.pipedTorCustomRedirects;
-        pipedMaterialNormalRedirectsChecks = r.pipedMaterialNormalRedirectsChecks;
-        pipedMaterialNormalCustomRedirects = r.pipedMaterialNormalCustomRedirects;
-        pipedMaterialTorRedirectsChecks = r.pipedMaterialTorRedirectsChecks;
-        pipedMaterialTorCustomRedirects = r.pipedMaterialTorCustomRedirects;
-        resolve();
-      }
-    )
-  })
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-function all() {
-  return [
-    ...youtubeRedirects.invidious.normal,
-    ...youtubeRedirects.invidious.tor,
-
-    ...youtubeRedirects.piped.normal,
-    ...youtubeRedirects.piped.tor,
-
-    ...youtubeRedirects.pipedMaterial.normal,
-    ...youtubeRedirects.pipedMaterial.tor,
-
-    ...invidiousNormalCustomRedirects,
-    ...invidiousTorCustomRedirects,
-
-    ...pipedNormalCustomRedirects,
-    ...pipedTorCustomRedirects,
-
-    ...pipedMaterialNormalCustomRedirects,
-    ...pipedMaterialTorCustomRedirects,
-  ];
-}
-
-function redirect(url, details, initiator) {
-  if (disableYoutube) return;
-  if (!targets.some(rx => rx.test(url.href))) return;
-  if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB';
-
-  const isInvidious = youtubeFrontend == 'invidious';
-  const isPiped = youtubeFrontend == 'piped';
-  const isPipedMaterial = youtubeFrontend == 'pipedMaterial'
-  const isFreetube = youtubeFrontend == 'freetube';
-  const isYatte = youtubeFrontend == 'yatte';
-
-  const isFrontendYoutube = youtubeEmbedFrontend == "youtube";
-  const isFrontendInvidious = youtubeEmbedFrontend == 'invidious';
-  const isFrontendPiped = youtubeEmbedFrontend == 'piped';
-  const isFrontendPipedMaterial = youtubeEmbedFrontend == 'pipedMaterial';
-
-  const isOnlyEmbeddedVideo = OnlyEmbeddedVideo == 'onlyNotEmbedded';
-  const isOnlyNotEmbedded = OnlyEmbeddedVideo == 'onlyNotEmbedded'
-
-  const is_main_frame = details.type === "main_frame";
-  const is_sub_frame = details.type === "sub_frame";
-
-  if (url.pathname.match(/iframe_api/) || url.pathname.match(/www-widgetapi/)) return; // Don't redirect YouTube Player API.
-
-  if (youtubeFrontend == 'yatte' && is_main_frame)
-    return url.href.replace(/^https?:\/{2}/, 'yattee://');
-
-  else if (isFreetube && is_main_frame)
-    return `freetube://https:${url.pathname}${url.search}`;
-
-  else if (isFreetube && params && isFrontendYoutube)
-    return;
-
-  else if (isInvidious || ((isFreetube || isYatte) && isFrontendInvidious && is_sub_frame)) {
-
-    if (isOnlyEmbeddedVideo && !is_sub_frame) return;
-    if (isOnlyNotEmbedded && params && !((isFreetube || isYatte) && isFrontendInvidious && is_sub_frame)) return;
-
-    let instancesList;
-    if (youtubeProtocol == 'normal') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
-    else if (youtubeProtocol == 'tor') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects];
-    if (instancesList.length === 0) return;
-    let randomInstance = utils.getRandomInstance(instancesList);
-
-    return `${randomInstance}${url.pathname}${url.search}`;
-  } else if (isPiped || ((isFreetube || isYatte) && isFrontendPiped && is_sub_frame)) {
-
-    if (isOnlyEmbeddedVideo && !is_sub_frame) return;
-    if (
-      isOnlyNotEmbedded && params &&
-      !((isFreetube || isYatte) && isFrontendPiped && is_sub_frame)
-    ) return;
-
-    let instancesList;
-    if (youtubeProtocol == 'normal') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
-    else if (youtubeProtocol == 'tor') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects];
-    if (instancesList.length === 0) return;
-
-    const randomInstance = utils.getRandomInstance(instancesList);
-    return `${randomInstance}${url.pathname}${url.search}`;
-  }
-  else if (isPipedMaterial || ((isFreetube || isYatte) && isFrontendPipedMaterial && is_sub_frame)) {
-    if (isOnlyEmbeddedVideo && details.type !== "sub_frame") return;
-    if (
-      isOnlyNotEmbedded && params &&
-      !((isFreetube || isYatte) && isFrontendPipedMaterial && is_sub_frame)
-    ) return;
-
-    let instancesList;
-    if (youtubeProtocol == 'normal') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
-    else if (youtubeProtocol == 'tor') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects];
-
-    const randomInstance = utils.getRandomInstance(instancesList);
-    return `${randomInstance}${url.pathname}${url.search}`;
-  }
-  else return 'CANCEL';
-}
-
-function reverse(url) {
-  return new Promise(async resolve => {
-    await init();
-    const protocolHost = utils.protocolHost(url);
-    const instances = all();
-    if (!instances.includes(protocolHost)) { resolve(); return; }
-
-    resolve(`https://youtube.com${url.pathname}${url.search}`);
-  })
-}
-
-function switchInstance(url) {
-  return new Promise(async resolve => {
-    await init();
-    const protocolHost = utils.protocolHost(url);
-    const instances = all();
-    if (!instances.includes(protocolHost)) { resolve(); return; }
-
-    let instancesList;
-    if (youtubeProtocol == 'normal') {
-      if (youtubeFrontend == 'invidious') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
-      else if (youtubeFrontend == 'piped') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
-      else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
-    }
-    else if (youtubeProtocol == 'tor') {
-      if (youtubeFrontend == 'invidious') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects];
-      else if (youtubeFrontend == 'piped') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects];
-      else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects];
-    }
-
-    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);
-      redirects.invidious = dataJson.invidious;
-      redirects.piped = dataJson.piped;
-      browser.storage.local.get('cloudflareList', async r => {
-
-        invidiousNormalRedirectsChecks = [...redirects.invidious.normal];
-        pipedNormalRedirectsChecks = [...redirects.piped.normal];
-        pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal];
-
-        for (const instance of r.cloudflareList) {
-          let i;
-
-          i = invidiousNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) invidiousNormalRedirectsChecks.splice(i, 1);
-
-          i = pipedNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) pipedNormalRedirectsChecks.splice(i, 1);
-
-          i = pipedMaterialNormalRedirectsChecks.indexOf(instance);
-          if (i > -1) pipedMaterialNormalRedirectsChecks.splice(i, 1);
-        }
-
-        await browser.storage.local.set({
-          disableYoutube: false,
-          enableYoutubeCustomSettings: false,
-          OnlyEmbeddedVideo: 'both',
-
-          youtubeRedirects: redirects,
-
-          youtubeFrontend: 'invidious',
-
-          invidiousNormalRedirectsChecks: invidiousNormalRedirectsChecks,
-          invidiousNormalCustomRedirects: [],
-
-          invidiousTorRedirectsChecks: [...redirects.invidious.tor],
-          invidiousTorCustomRedirects: [],
-
-          pipedNormalRedirectsChecks: pipedNormalRedirectsChecks,
-          pipedNormalCustomRedirects: [],
-
-          pipedTorRedirectsChecks: [...redirects.piped.tor],
-          pipedTorCustomRedirects: [],
-
-          pipedMaterialNormalRedirectsChecks: pipedMaterialNormalRedirectsChecks,
-          pipedMaterialNormalCustomRedirects: [],
-
-          pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor],
-          pipedMaterialTorCustomRedirects: [],
-
-          youtubeEmbedFrontend: 'invidious',
-          youtubeProtocol: 'normal',
-        })
-        resolve();
-      })
-    })
-  })
-}
-
-function initInvidiousCookies(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,
-    ].includes(protocolHost)) { resolve(); return; }
-    if (!test) {
-      let checkedInstances;
-      if (youtubeProtocol == 'normal') checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
-      else if (youtubeProtocol == 'tor') checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
-      const i = checkedInstances.indexOf(protocolHost);
-      if (i !== -1) checkedInstances.splice(i, 1);
-      for (const to of checkedInstances)
-        utils.copyCookie('invidious', from, to, 'PREFS');
-    }
-    resolve(true);
-  })
-}
-
-function setInvidiousCookies() {
-  return new Promise(async resolve => {
-    await init();
-    if (disableYoutube || youtubeFrontend != 'invidious') { resolve(); return; }
-    let checkedInstances;
-    if (youtubeProtocol == 'normal') checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
-    else if (youtubeProtocol == 'tor') checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
-    for (const to of checkedInstances)
-      utils.getCookiesFromStorage('invidious', to, 'PREFS');
-    resolve();
-  })
-}
-
-function initPipedLocalStorage(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,
-    ].includes(protocolHost)) { resolve(); return; }
-
-    if (!test) {
-
-      browser.tabs.executeScript(tabId, { file: "/assets/javascripts/helpers/youtube/get_piped_preferences.js", runAt: "document_start" });
-
-      let checkedInstances;
-      if (youtubeProtocol == 'normal') checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks]
-      else if (youtubeProtocol == 'tor') checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
-      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/helpers/youtube/set_piped_preferences.js", runAt: "document_start" }))
-      }
-    }
-    resolve(true);
-  })
-}
-
-function initPipedMaterialLocalStorage(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,
-    ].includes(protocolHost)) { resolve(); return; }
-
-    if (!test) {
-      browser.tabs.executeScript(tabId, { file: "/assets/javascripts/helpers/youtube/get_pipedMaterial_preferences.js", runAt: "document_start" });
-
-      let checkedInstances;
-      if (youtubeProtocol == 'normal') checkedInstances = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
-      else if (youtubeProtocol == 'tor') checkedInstances = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
-      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/helpers/youtube/set_pipedMaterial_preferences.js", runAt: "document_start" })
-        );
-    }
-    resolve(true);
-  })
-}
-
-function removeXFrameOptions(e) {
-  const url = new URL(e.url);
-  let protocolHost = utils.protocolHost(url);
-  const instances = all();
-  if (!instances.includes(protocolHost) || e.type != 'sub_frame') 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;
-    }
-  if (isChanged) return { responseHeaders: e.responseHeaders };
-}
-
-export default {
-  setRedirects,
-  initPipedLocalStorage,
-  initPipedMaterialLocalStorage,
-  initInvidiousCookies,
-  setInvidiousCookies,
-  redirect,
-  reverse,
-  switchInstance,
-  initDefaults,
-  removeXFrameOptions,
-};
diff --git a/src/assets/javascripts/helpers/youtubeMusic.js b/src/assets/javascripts/helpers/youtubeMusic.js
deleted file mode 100644
index 68fa4f24..00000000
--- a/src/assets/javascripts/helpers/youtubeMusic.js
+++ /dev/null
@@ -1,97 +0,0 @@
-"use strict";
-
-import utils from './utils.js'
-
-window.browser = window.browser || window.chrome;
-
-const targets = [
-    /^https?:\/{2}music\.youtube\.com(\/.*|$)/,
-];
-let redirects = {
-    "beatbump": {
-        "normal": [
-            "https://beatbump.ml"
-        ],
-        "tor": []
-    },
-};
-
-let
-    disableYoutubeMusic,
-    beatbumpNormalRedirectsChecks,
-    beatbumpNormalCustomRedirects;
-
-function init() {
-    browser.storage.local.get(
-        [
-            "disableYoutubeMusic",
-            "beatbumpNormalRedirectsChecks",
-            "beatbumpNormalCustomRedirects",
-        ],
-        r => {
-            disableYoutubeMusic = r.disableYoutubeMusic;
-            beatbumpNormalRedirectsChecks = r.beatbumpNormalRedirectsChecks;
-            beatbumpNormalCustomRedirects = r.beatbumpNormalCustomRedirects;
-        }
-    )
-}
-
-init();
-browser.storage.onChanged.addListener(init)
-
-/* 
-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
-*/
-function redirect(url, type, initiator) {
-    if (disableYoutubeMusic) return;
-    if (!targets.some(rx => rx.test(url.href))) return;
-
-    let instancesList = [...beatbumpNormalRedirectsChecks, ...beatbumpNormalCustomRedirects];
-    if (instancesList.length === 0) return;
-    const randomInstance = utils.getRandomInstance(instancesList);
-    resolve(
-        `${randomInstance}${url.pathname}${url.search}`
-            .replace("/watch?v=", "/listen?id=")
-            .replace("/channel/", "/artist/")
-            .replace("/playlist?list=", "/playlist/VL")
-    );
-}
-
-async function initDefaults() {
-    await browser.storage.local.set({
-        disableYoutubeMusic: true,
-        youtubeMusicRedirects: redirects,
-
-        beatbumpNormalRedirectsChecks: [...redirects.beatbump.normal],
-        beatbumpNormalCustomRedirects: [],
-    })
-}
-
-export default {
-    redirect,
-    initDefaults,
-};