about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/assets/images/threads-icon-light.svg21
-rw-r--r--src/assets/images/threads-icon.svg18
-rw-r--r--src/assets/javascripts/services.js6
-rw-r--r--src/config.json194
4 files changed, 198 insertions, 41 deletions
diff --git a/src/assets/images/threads-icon-light.svg b/src/assets/images/threads-icon-light.svg
new file mode 100644
index 00000000..809c12d8
--- /dev/null
+++ b/src/assets/images/threads-icon-light.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 25.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 878 1000" style="enable-background:new 0 0 878 1000;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFFFFF;}
+</style>
+<g>
+	<path class="st0" d="M446.7,1000h-0.3c-149.2-1-263.9-50.2-341-146.2C36.9,768.3,1.5,649.4,0.3,500.4v-0.7
+		c1.2-149.1,36.6-267.9,105.2-353.4C182.5,50.2,297.3,1,446.4,0h0.3h0.3c114.4,0.8,210.1,30.2,284.4,87.4
+		c69.9,53.8,119.1,130.4,146.2,227.8l-85,23.7c-46-165-162.4-249.3-346-250.6c-121.2,0.9-212.9,39-272.5,113.2
+		C118.4,271,89.6,371.4,88.5,500c1.1,128.6,29.9,229,85.7,298.5c59.6,74.3,151.3,112.4,272.5,113.2c109.3-0.8,181.6-26.3,241.7-85.2
+		c68.6-67.2,67.4-149.7,45.4-199.9c-12.9-29.6-36.4-54.2-68.1-72.9c-8,56.3-25.9,101.9-53.5,136.3c-36.9,45.9-89.2,71-155.4,74.6
+		c-50.1,2.7-98.4-9.1-135.8-33.4c-44.3-28.7-70.2-72.5-73-123.5c-2.7-49.6,17-95.2,55.4-128.4c36.7-31.7,88.3-50.3,149.3-53.8
+		c44.9-2.5,87-0.5,125.8,5.9c-5.2-30.9-15.6-55.5-31.2-73.2c-21.4-24.4-54.5-36.8-98.3-37.1c-0.4,0-0.8,0-1.2,0
+		c-35.2,0-83,9.7-113.4,55L261.2,327c40.8-60.6,107-94,186.6-94c0.6,0,1.2,0,1.8,0c133.1,0.8,212.4,82.3,220.3,224.5
+		c4.5,1.9,9,3.9,13.4,5.9c62.1,29.2,107.5,73.4,131.4,127.9c33.2,75.9,36.3,199.6-64.5,298.3C673.1,965,579.6,999.1,447,1000
+		L446.7,1000L446.7,1000z M488.5,512.9c-10.1,0-20.3,0.3-30.8,0.9c-76.5,4.3-124.2,39.4-121.5,89.3c2.8,52.3,60.5,76.6,116,73.6
+		c51-2.7,117.4-22.6,128.6-154.6C552.6,516,521.7,512.9,488.5,512.9z"/>
+</g>
+</svg>
diff --git a/src/assets/images/threads-icon.svg b/src/assets/images/threads-icon.svg
new file mode 100644
index 00000000..e99823bb
--- /dev/null
+++ b/src/assets/images/threads-icon.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 25.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 878 1000" style="enable-background:new 0 0 878 1000;" xml:space="preserve">
+<g>
+	<path d="M446.7,1000h-0.3c-149.2-1-263.9-50.2-341-146.2C36.9,768.3,1.5,649.4,0.3,500.4v-0.7c1.2-149.1,36.6-267.9,105.2-353.4
+		C182.5,50.2,297.3,1,446.4,0h0.3h0.3c114.4,0.8,210.1,30.2,284.4,87.4c69.9,53.8,119.1,130.4,146.2,227.8l-85,23.7
+		c-46-165-162.4-249.3-346-250.6c-121.2,0.9-212.9,39-272.5,113.2C118.4,271,89.6,371.4,88.5,500c1.1,128.6,29.9,229,85.7,298.5
+		c59.6,74.3,151.3,112.4,272.5,113.2c109.3-0.8,181.6-26.3,241.7-85.2c68.6-67.2,67.4-149.7,45.4-199.9
+		c-12.9-29.6-36.4-54.2-68.1-72.9c-8,56.3-25.9,101.9-53.5,136.3c-36.9,45.9-89.2,71-155.4,74.6c-50.1,2.7-98.4-9.1-135.8-33.4
+		c-44.3-28.7-70.2-72.5-73-123.5c-2.7-49.6,17-95.2,55.4-128.4c36.7-31.7,88.3-50.3,149.3-53.8c44.9-2.5,87-0.5,125.8,5.9
+		c-5.2-30.9-15.6-55.5-31.2-73.2c-21.4-24.4-54.5-36.8-98.3-37.1c-0.4,0-0.8,0-1.2,0c-35.2,0-83,9.7-113.4,55L261.2,327
+		c40.8-60.6,107-94,186.6-94c0.6,0,1.2,0,1.8,0c133.1,0.8,212.4,82.3,220.3,224.5c4.5,1.9,9,3.9,13.4,5.9
+		c62.1,29.2,107.5,73.4,131.4,127.9c33.2,75.9,36.3,199.6-64.5,298.3C673.1,965,579.6,999.1,447,1000L446.7,1000L446.7,1000z
+		 M488.5,512.9c-10.1,0-20.3,0.3-30.8,0.9c-76.5,4.3-124.2,39.4-121.5,89.3c2.8,52.3,60.5,76.6,116,73.6
+		c51-2.7,117.4-22.6,128.6-154.6C552.6,516,521.7,512.9,488.5,512.9z"/>
+</g>
+</svg>
diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js
index dbd3ea2c..b319d46b 100644
--- a/src/assets/javascripts/services.js
+++ b/src/assets/javascripts/services.js
@@ -546,6 +546,11 @@ function rewrite(url, frontend, randomInstance) {
     case "ratAintTieba":
       url.searchParams.delete("ie")
       return `${randomInstance}${url.pathname}${url.search}`
+    case "shoelace": {
+      const reg = /\/(?:(?:(?:.*)?\/post)|t)\/(.*)(?:\/)?/.exec(url.pathname)
+      if (reg) return `${randomInstance}/t/${reg[1]}${url.search}`
+      return `${randomInstance}${url.pathname}${url.search}`
+    }
     case "piped":
     case "pipedMaterial":
     case "cloudtube":
@@ -798,6 +803,7 @@ const defaultInstances = {
   pasted: ["https://pasted.drakeerv.com"],
   freetar: ["https://freetar.de"],
   ratAintTieba: ["https://rat.fis.land"],
+  shoelace: ["https://shoelace.mint.lgbt"],
 }
 
 function initDefaults() {
diff --git a/src/config.json b/src/config.json
index 45220990..a42b7c73 100644
--- a/src/config.json
+++ b/src/config.json
@@ -33,21 +33,30 @@
           "url": "https://materialio.us/"
         },
         "piped": {
-          "excludeTargets": [2, 3],
+          "excludeTargets": [
+            2,
+            3
+          ],
           "name": "Piped",
           "embeddable": true,
           "instanceList": true,
           "url": "https://github.com/TeamPiped/Piped"
         },
         "pipedMaterial": {
-          "excludeTargets": [2, 3],
+          "excludeTargets": [
+            2,
+            3
+          ],
           "name": "Piped-Material",
           "embeddable": false,
           "instanceList": true,
           "url": "https://github.com/mmjee/Piped-Material"
         },
         "poketube": {
-          "excludeTargets": [2, 3],
+          "excludeTargets": [
+            2,
+            3
+          ],
           "name": "PokeTube",
           "embeddable": true,
           "instanceList": true,
@@ -58,7 +67,10 @@
           "embeddable": false,
           "instanceList": true,
           "url": "https://sr.ht/~cadence/tube",
-          "excludeTargets": [2, 3]
+          "excludeTargets": [
+            2,
+            3
+          ]
         },
         "lightTube": {
           "name": "LightTube",
@@ -71,10 +83,16 @@
           "embeddable": false,
           "instanceList": true,
           "url": "https://git.migalmoreno.com/tubo/about/",
-          "excludeTargets": [2, 3]
+          "excludeTargets": [
+            2,
+            3
+          ]
         },
         "freetube": {
-          "excludeTargets": [2, 3],
+          "excludeTargets": [
+            2,
+            3
+          ],
           "name": "FreeTube",
           "embeddable": false,
           "desktopApp": true,
@@ -82,7 +100,10 @@
           "url": "https://github.com/FreeTubeApp/FreeTube"
         },
         "yattee": {
-          "excludeTargets": [2, 3],
+          "excludeTargets": [
+            2,
+            3
+          ],
           "name": "Yattee",
           "embeddable": false,
           "desktopApp": true,
@@ -90,7 +111,10 @@
           "url": "https://github.com/yattee/yattee"
         },
         "freetubePwa": {
-          "excludeTargets": [2, 3],
+          "excludeTargets": [
+            2,
+            3
+          ],
           "name": "FreeTube PWA",
           "embeddable": false,
           "instanceList": false,
@@ -144,7 +168,9 @@
           "url": "https://github.com/FreeTubeApp/FreeTube"
         }
       },
-      "targets": ["^https?:\\/{2}music\\.youtube\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}music\\.youtube\\.com\\/"
+      ],
       "name": "YT Music",
       "options": {
         "enabled": false,
@@ -192,7 +218,9 @@
           "url": "https://github.com/badlogic/skyview"
         }
       },
-      "targets": ["^https?:\\/{2}bsky\\.app\\/"],
+      "targets": [
+        "^https?:\\/{2}bsky\\.app\\/"
+      ],
       "name": "Bluesky",
       "options": {
         "enabled": false,
@@ -287,7 +315,9 @@
           "localhost": false
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.|clips\\.)?twitch\\.(tv|com)\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.|clips\\.)?twitch\\.(tv|com)\\/"
+      ],
       "name": "Twitch",
       "options": {
         "enabled": false,
@@ -309,7 +339,9 @@
           "localhost": true
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?tiktok\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?tiktok\\.com\\/"
+      ],
       "name": "TikTok",
       "options": {
         "enabled": false,
@@ -329,7 +361,9 @@
           "localhost": false
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?instagram\\.com"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?instagram\\.com"
+      ],
       "name": "Instagram",
       "options": {
         "enabled": false,
@@ -349,7 +383,9 @@
           "localhost": true
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.|m\\.)?imdb\\.com"],
+      "targets": [
+        "^https?:\\/{2}(www\\.|m\\.)?imdb\\.com"
+      ],
       "name": "IMDb",
       "options": {
         "enabled": false,
@@ -368,7 +404,10 @@
           "url": "https://0xacab.org/johnxina/mikuinvidious"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.|space\\.)?bilibili\\.com\\/", "^https?:\\/{2}b23\\.tv\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.|space\\.)?bilibili\\.com\\/",
+        "^https?:\\/{2}b23\\.tv\\/"
+      ],
       "name": "Bilibili",
       "options": {
         "enabled": false,
@@ -387,7 +426,9 @@
           "url": "https://codeberg.org/VnPower/pixivfe"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?pixiv\\.net\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?pixiv\\.net\\/"
+      ],
       "options": {
         "enabled": false,
         "unsupportedUrls": "bypass",
@@ -404,7 +445,9 @@
           "url": "https://breezewiki.com"
         }
       },
-      "targets": ["^https?:\\/{2}([a-zA-Z0-9-]+\\.)?(fandom|wikia)\\.com(?=\\/wiki|\\/?$)"],
+      "targets": [
+        "^https?:\\/{2}([a-zA-Z0-9-]+\\.)?(fandom|wikia)\\.com(?=\\/wiki|\\/?$)"
+      ],
       "name": "Fandom",
       "options": {
         "enabled": false,
@@ -425,7 +468,9 @@
           "embeddable": true
         }
       },
-      "targets": ["^https?:\\/{2}([im]\\.)?(stack\\.)?imgur\\.(com|io)\\/"],
+      "targets": [
+        "^https?:\\/{2}([im]\\.)?(stack\\.)?imgur\\.(com|io)\\/"
+      ],
       "name": "Imgur",
       "options": {
         "enabled": false,
@@ -448,7 +493,10 @@
           "embeddable": true
         }
       },
-      "targets": ["^https?:\\/{2}i\\.pinimg\\.com", "^https?:\\/{2}(www\\.)?pinterest\\.com"],
+      "targets": [
+        "^https?:\\/{2}i\\.pinimg\\.com",
+        "^https?:\\/{2}(www\\.)?pinterest\\.com"
+      ],
       "options": {
         "enabled": false,
         "unsupportedUrls": "bypass",
@@ -468,7 +516,9 @@
           "url": "https://git.migalmoreno.com/tubo/about/"
         }
       },
-      "targets": ["^https?:\\/{2}soundcloud\\.com"],
+      "targets": [
+        "^https?:\\/{2}soundcloud\\.com"
+      ],
       "name": "SoundCloud",
       "options": {
         "enabled": false,
@@ -488,7 +538,10 @@
           "url": "https://forgejo.sny.sh/sun/Tent"
         }
       },
-      "targets": ["^https?:\\/{2}(.*\\.)?bandcamp\\.com\\/", "^https?:\\/{2}(f4|t4)\\.bcbits\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(.*\\.)?bandcamp\\.com\\/",
+        "^https?:\\/{2}(f4|t4)\\.bcbits\\.com\\/"
+      ],
       "name": "Bandcamp",
       "options": {
         "enabled": false,
@@ -506,7 +559,9 @@
           "url": "https://github.com/Davilarek/TekstoLibre"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?tekstowo\\.pl\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?tekstowo\\.pl\\/"
+      ],
       "name": "Tekstowo.pl",
       "options": {
         "enabled": false,
@@ -531,7 +586,9 @@
           "localhost": false
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?genius\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?genius\\.com\\/"
+      ],
       "name": "Genius",
       "options": {
         "enabled": false,
@@ -594,7 +651,9 @@
           "localhost": true
         }
       },
-      "targets": ["^https?:\\/{2}([a-zA-Z0-9-]+\\.)*quora\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}([a-zA-Z0-9-]+\\.)*quora\\.com\\/"
+      ],
       "name": "Quora",
       "options": {
         "enabled": false,
@@ -681,7 +740,9 @@
           "url": "https://github.com/HookedBehemoth/neuters"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?reuters\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?reuters\\.com\\/"
+      ],
       "name": "Reuters",
       "options": {
         "enabled": false,
@@ -699,7 +760,9 @@
           "url": "https://git.vern.cc/cobra/Suds"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?snopes\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?snopes\\.com\\/"
+      ],
       "name": "Snopes",
       "options": {
         "enabled": false,
@@ -717,7 +780,9 @@
           "url": "https://git.vern.cc/cobra/UNfunny"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?ifunny\\.co\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?ifunny\\.co\\/"
+      ],
       "name": "iFunny",
       "options": {
         "enabled": false,
@@ -735,7 +800,9 @@
           "url": "https://git.vern.cc/cobra/Soprano"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?tenor\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?tenor\\.com\\/"
+      ],
       "name": "Tenor",
       "options": {
         "enabled": false,
@@ -753,7 +820,9 @@
           "url": "https://git.vern.cc/cobra/MeMe"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?knowyourmeme\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?knowyourmeme\\.com\\/"
+      ],
       "name": "KnowYourMeme",
       "options": {
         "enabled": false,
@@ -771,7 +840,9 @@
           "url": "https://codeberg.org/zortazert/rural-dictionary"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?urbandictionary\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?urbandictionary\\.com\\/"
+      ],
       "name": "Urban Dictionary",
       "options": {
         "enabled": false,
@@ -790,7 +861,9 @@
           "localhost": true
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?goodreads\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?goodreads\\.com\\/"
+      ],
       "name": "Goodreads",
       "options": {
         "enabled": false,
@@ -809,7 +882,9 @@
           "url": "https://git.disroot.org/wolfree"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?wolframalpha\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?wolframalpha\\.com\\/"
+      ],
       "name": "Wolfram Alpha",
       "options": {
         "enabled": false,
@@ -833,7 +908,9 @@
           "url": "https://git.vern.cc/cobra/Destructables"
         }
       },
-      "targets": ["^https?:\\/{2}(www\\.)?instructables\\.com\\/"],
+      "targets": [
+        "^https?:\\/{2}(www\\.)?instructables\\.com\\/"
+      ],
       "options": {
         "enabled": false,
         "unsupportedUrls": "bypass",
@@ -850,7 +927,9 @@
           "url": "https://wikiless.org"
         }
       },
-      "targets": ["^https?:\\/{2}([a-z]+\\.)*wikipedia\\.org\\/?"],
+      "targets": [
+        "^https?:\\/{2}([a-z]+\\.)*wikipedia\\.org\\/?"
+      ],
       "name": "Wikipedia",
       "options": {
         "enabled": false,
@@ -868,7 +947,9 @@
           "url": "https://github.com/ticky/wayback-classic"
         }
       },
-      "targets": ["^https?:\\/{2}web\\.archive\\.org\\/"],
+      "targets": [
+        "^https?:\\/{2}web\\.archive\\.org\\/"
+      ],
       "name": "Wayback Machine",
       "options": {
         "enabled": false,
@@ -929,7 +1010,10 @@
           "url": "https://git.lolcat.ca/lolcat/4get"
         }
       },
-      "targets": ["^https?:\\/{2}search\\.libredirect\\.invalid", "^https?:\\/{2}libredirect\\.github\\.io\\/\\?q"],
+      "targets": [
+        "^https?:\\/{2}search\\.libredirect\\.invalid",
+        "^https?:\\/{2}libredirect\\.github\\.io\\/\\?q"
+      ],
       "name": "Search",
       "options": {
         "enabled": false,
@@ -1007,7 +1091,9 @@
           "url": "https://jitsi.org"
         }
       },
-      "targets": ["^https?:\\/{2}meet\\.libredirect\\.invalid\\/"],
+      "targets": [
+        "^https?:\\/{2}meet\\.libredirect\\.invalid\\/"
+      ],
       "options": {
         "enabled": false,
         "unsupportedUrls": "bypass",
@@ -1051,7 +1137,9 @@
           "url": "https://github.com/Dragynfruit/pasted"
         }
       },
-      "targets": ["^https?:\\/{2}paste\\.libredirect\\.invalid"],
+      "targets": [
+        "^https?:\\/{2}paste\\.libredirect\\.invalid"
+      ],
       "name": "Paste Text",
       "options": {
         "enabled": false,
@@ -1069,7 +1157,9 @@
           "url": "https://github.com/kmille/freetar"
         }
       },
-      "targets": ["^https?:\\/{2}(tabs\\.|www\\.)?ultimate-guitar\\.com"],
+      "targets": [
+        "^https?:\\/{2}(tabs\\.|www\\.)?ultimate-guitar\\.com"
+      ],
       "name": "Ultimate Guitar",
       "options": {
         "enabled": false,
@@ -1087,7 +1177,9 @@
           "url": "https://0xacab.org/johnxina/rat"
         }
       },
-      "targets": ["^https?:\\/{2}tieba\\.baidu\\.com"],
+      "targets": [
+        "^https?:\\/{2}tieba\\.baidu\\.com"
+      ],
       "name": "Baidu Tieba",
       "options": {
         "enabled": false,
@@ -1096,6 +1188,26 @@
       },
       "imageType": "svg",
       "url": "https://tieba.baidu.com"
+    },
+    "threads": {
+      "frontends": {
+        "shoelace": {
+          "name": "Shoelace",
+          "instanceList": true,
+          "url": "https://git.sr.ht/~nixgoat/shoelace"
+        }
+      },
+      "targets": [
+        "^https?:\\/{2}(www\\.)?threads\\.net"
+      ],
+      "name": "Threads",
+      "options": {
+        "enabled": false,
+        "unsupportedUrls": "bypass",
+        "frontend": "shoelace"
+      },
+      "imageType": "svgMono",
+      "url": "https://threads.net"
     }
   }
-}
+}
\ No newline at end of file