diff --git a/api/gitlab/proxy.ts b/api/gitlab/proxy.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bc8eeb81ce8d8ff3451b6861c977c75efe36d8d6
--- /dev/null
+++ b/api/gitlab/proxy.ts
@@ -0,0 +1,52 @@
+import type { VercelRequest, VercelResponse } from '@vercel/node';
+
+interface AuthToken {
+  token: string,
+  uri: string,
+}
+
+export default async function (req: VercelRequest, res: VercelResponse) {
+  const { body, query, method, url, headers } = req
+
+  const gitlab_tokens_var = process.env.GITLAB_ENDPOINT_TOKENS
+  var array: String[] = []
+  var authTokenArray: Array<AuthToken> = []
+  let endpointURI = new URL(query.url.toString())
+
+  if(gitlab_tokens_var) {
+    array = gitlab_tokens_var!.split(",")
+  }
+
+  // Parse environment variable $GITLAB_ENDPOINT_TOKENS
+  // into authTokenArray
+  for(var i = 0; i < array.length; i++) {
+    let token: string = array[i].split(/:(.*)/s)[0]
+    let uri: string = array[i].split(/:(.*)/s)[1]
+    authTokenArray.push({ token: token, uri: uri })
+  }
+
+  // Check authTokenArray for token to add to query
+  var injectToken: String = ""
+
+  for(var i = 0; i < authTokenArray.length; i++) {
+    let uri: URL = new URL(authTokenArray[i]['uri'])
+    if(uri.hostname == endpointURI.hostname) {
+      injectToken = authTokenArray[i].token
+    }
+  }
+
+  var apiResult: Response = await fetch(endpointURI.toString(), {
+    method: "GET",
+    headers: { "PRIVATE-TOKEN": injectToken.toString(),
+                "Content-Type": "application/json",
+                "Accept": "application/json" },
+  })
+
+  let resultJson = await apiResult.json()
+
+  console.log(resultJson)
+
+  res.statusCode = 200
+  res.setHeader("Content-Type", 'application/json')
+  res.send(resultJson)
+};
diff --git a/content/_index.md b/content/_index.md
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/package-lock.json b/package-lock.json
index 4c4b2ab001a20b01cabbf307758f03bc3361c266..e9e876ddc8bd9bacf578936cfa77bd0762abc4a1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,17 +1,17 @@
 {
-  "name": "flear.org",
+  "name": "fedipage",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
-      "name": "flear.org",
+      "name": "fedipage",
       "dependencies": {
         "@firebase/app-types": "^0.9.0",
         "@polymath-ai/client": "*",
         "@polymath-ai/host": "*",
-        "@types/node": "^20.8.2",
         "@vercel/analytics": "^1.0.2",
         "@vercel/edge": "^1.1.0",
+        "@vercel/functions": "^1.4.0",
         "@vercel/node": "^3.0.7",
         "@vercel/og": "^0.5.17",
         "activitypub-core-types": "^0.3.2",
@@ -19,17 +19,19 @@
         "file-drop-element": "^1.0.1",
         "firebase-admin": "^11.11.0",
         "hugo-bin": "^0.115.0",
+        "jquery": "^3.7.1",
         "multiparty": "^4.2.3",
+        "next": "^14.2.5",
         "node-fetch": "^3.3.2",
         "pinch-zoom-element": "^1.1.1",
-        "ts-node": "^10.9.1",
         "uuid": "^9.0.1",
-        "vercel": "^32.4.1",
-        "whatwg-flora-tmpl": "^1.0.3"
+        "vercel": "^32.7.2",
+        "whatwg-flora-tmpl": "^1.0.3",
+        "xmlhttprequest": "^1.8.0"
       },
       "devDependencies": {
         "@types/multiparty": "^0.0.34",
-        "typescript": "^5.2.2"
+        "typescript": "^5.5.4"
       },
       "engines": {
         "node": ">= 18.0.0"
@@ -85,20 +87,28 @@
         "node": ">=16"
       }
     },
+    "node_modules/@edge-runtime/ponyfill": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.1.tgz",
+      "integrity": "sha512-ZbR/EViY3gg2rmEAQTKPa6mXl4aR1/+cFcQe4r1segCjEbTAxT6PWu40odbu/KlZKSysEb2O/BWIC2lJgSJOMQ==",
+      "engines": {
+        "node": ">=16"
+      }
+    },
     "node_modules/@edge-runtime/primitives": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-3.1.1.tgz",
-      "integrity": "sha512-ROO22py+KdAfzqWZu6CtVMC4qV6mS0W1jPI51jGXE+uenyBUN7cQTWB9ReQc8Bm4cnjqmhajvpqEx3j7Y9iSOg==",
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.0.5.tgz",
+      "integrity": "sha512-t7QiN5d/KpXgCvIfSt6Nm9Hj3WVdNgc5CpOD73jasY+9EvTI7Ngdj5cXvjcHrPcmYWJZMySPgeEeoL/1N/Llag==",
       "engines": {
         "node": ">=16"
       }
     },
     "node_modules/@edge-runtime/vm": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.1.1.tgz",
-      "integrity": "sha512-6NJRRG04/91qnWLZj+wZm27q6fJkTbkZdIJdo/Ig++GTxkAv8Wh/45nIcz9Xg7AzIAMpAkflFdiCrCoZ3hp1Iw==",
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.1.7.tgz",
+      "integrity": "sha512-hUMFbDQ/nZN+1TLMi6iMO1QFz9RSV8yGG8S42WFPFma1d7VSNE0eMdJUmwjmtav22/iQkzHMmu6oTSfAvRGS8g==",
       "dependencies": {
-        "@edge-runtime/primitives": "3.1.1"
+        "@edge-runtime/primitives": "4.0.5"
       },
       "engines": {
         "node": ">=16"
@@ -399,6 +409,146 @@
         }
       }
     },
+    "node_modules/@next/env": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz",
+      "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA=="
+    },
+    "node_modules/@next/swc-darwin-arm64": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz",
+      "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-darwin-x64": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz",
+      "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-gnu": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz",
+      "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-musl": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz",
+      "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-gnu": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz",
+      "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-musl": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz",
+      "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-arm64-msvc": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz",
+      "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-ia32-msvc": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz",
+      "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-x64-msvc": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz",
+      "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -588,6 +738,20 @@
         "url": "https://github.com/sindresorhus/is?sponsor=1"
       }
     },
+    "node_modules/@swc/counter": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+      "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="
+    },
+    "node_modules/@swc/helpers": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz",
+      "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==",
+      "dependencies": {
+        "@swc/counter": "^0.1.3",
+        "tslib": "^2.4.0"
+      }
+    },
     "node_modules/@szmarczak/http-timer": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
@@ -813,9 +977,9 @@
       "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg=="
     },
     "node_modules/@vercel/build-utils": {
-      "version": "7.2.2",
-      "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-7.2.2.tgz",
-      "integrity": "sha512-CUMgVKTJCba5tGe+KZaVvwGUCsuSeuNEmPIzMggIMDtzdqllRu8+QjjIhEI+unHoYvUgGfen6Z5lMeMo9Ne0qQ=="
+      "version": "7.3.0",
+      "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-7.3.0.tgz",
+      "integrity": "sha512-RJwqrGYSk75auHZqWmlSL+a5JsWv+4SF1AxNQJ+KpF3XWZ/8yThkN/jHBfNxMmW6VvNczSVtMaXI0/2Sess6Eg=="
     },
     "node_modules/@vercel/edge": {
       "version": "1.1.0",
@@ -823,9 +987,9 @@
       "integrity": "sha512-84H2EavY5Kul9Ef1DnTH0XEG5vChqcXjyqoRLVPjjZjLWw47sMapzXXQH09pybcshR+8AKqULGvFqPTWuRh3Rw=="
     },
     "node_modules/@vercel/error-utils": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.1.tgz",
-      "integrity": "sha512-ZUVpRFArh5eyKpJmdfEuCaMpZKQvZgUq0pQ7PdK8m5FgRYEvF4I0TMJH3JnkbYaMMUH82aYWZr+/hFJtEBcmTQ=="
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.2.tgz",
+      "integrity": "sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ=="
     },
     "node_modules/@vercel/fun": {
       "version": "1.1.0",
@@ -1028,6 +1192,22 @@
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
       "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
     },
+    "node_modules/@vercel/functions": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vercel/functions/-/functions-1.4.0.tgz",
+      "integrity": "sha512-Ln6SpIkms1UJg306X2kbEMyG9ol+mjDr2xx389cvsBxgFyFMI9Bm+LYOG4N3TSik4FI59MECyyc4oz7AIAYmqQ==",
+      "engines": {
+        "node": ">= 16"
+      },
+      "peerDependencies": {
+        "@aws-sdk/credential-provider-web-identity": "*"
+      },
+      "peerDependenciesMeta": {
+        "@aws-sdk/credential-provider-web-identity": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@vercel/gatsby-plugin-vercel-analytics": {
       "version": "1.0.11",
       "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-analytics/-/gatsby-plugin-vercel-analytics-1.0.11.tgz",
@@ -1037,13 +1217,13 @@
       }
     },
     "node_modules/@vercel/gatsby-plugin-vercel-builder": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.7.tgz",
-      "integrity": "sha512-hzaWLdBeb/QnGRE17ldaxeXMTLroaiJTlaW2G3HwvaK8sXA9e+jmcfAw8fjN3BNMnkFU523CnE7InqmjKH4TfQ==",
+      "version": "2.0.12",
+      "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.12.tgz",
+      "integrity": "sha512-S1RkywrUItewqg06T3L4cgYfiwi2BFngHIIerhOYhVuD9A+yfMgxnH5dkbu6nujmV1SEws+Q92wSiPfLPmO0eA==",
       "dependencies": {
         "@sinclair/typebox": "0.25.24",
-        "@vercel/build-utils": "7.2.2",
-        "@vercel/routing-utils": "3.0.0",
+        "@vercel/build-utils": "7.3.0",
+        "@vercel/routing-utils": "3.1.0",
         "esbuild": "0.14.47",
         "etag": "1.8.1",
         "fs-extra": "11.1.0"
@@ -1074,17 +1254,17 @@
       }
     },
     "node_modules/@vercel/gatsby-plugin-vercel-builder/node_modules/universalify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+      "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
       "engines": {
         "node": ">= 10.0.0"
       }
     },
     "node_modules/@vercel/go": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@vercel/go/-/go-3.0.3.tgz",
-      "integrity": "sha512-XhrmpsACxNo64ojhscL//Mq+XEfm3VXlx/UIUcHzJJXdvFnz7DEzh1zs0AtdpVgZbYhPQ7rW3GIejaHrIJnN5w=="
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@vercel/go/-/go-3.0.4.tgz",
+      "integrity": "sha512-hMIJm2xwU1HT56YRNF8HNOnIFNH7WnGl1l2D6lc6UJk7XdCCh1Dm0nsqLqki2SprTUh3I+53pTQaqgRsFGf06A=="
     },
     "node_modules/@vercel/hydrogen": {
       "version": "1.0.1",
@@ -1096,9 +1276,9 @@
       }
     },
     "node_modules/@vercel/next": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/@vercel/next/-/next-4.0.10.tgz",
-      "integrity": "sha512-+Z+R7Dev1OFU9Rm8R4h34W0/RdSHeZ4dvkv50lS7TneRj1Ab1zLlqupyG0tEdSP5/Nvb/OZ4ixvTiLqw9oo8oA==",
+      "version": "4.0.15",
+      "resolved": "https://registry.npmjs.org/@vercel/next/-/next-4.0.15.tgz",
+      "integrity": "sha512-BxMxIJrya7MS6IWrQIaQaYHPmq7WoZFLX909RBpNoAG5wgzrTrW756d2EsibBwGo7sQYBv2atyI5GqBIHzYbWg==",
       "dependencies": {
         "@vercel/nft": "0.24.2"
       }
@@ -1128,20 +1308,20 @@
       }
     },
     "node_modules/@vercel/node": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/@vercel/node/-/node-3.0.7.tgz",
-      "integrity": "sha512-0KrDGi6z+qPtCyC7wSHmHDU/ot352AJpAeAO1OIEYqYFsYwzvwuyu7TbGGwiUbtolij4/EBUCls3YmwADM/vKw==",
+      "version": "3.0.12",
+      "resolved": "https://registry.npmjs.org/@vercel/node/-/node-3.0.12.tgz",
+      "integrity": "sha512-OiNHiUe1LX/CfDrQ07ntPsoYhJiC38mEeErYeqA6YNVAz3QGdX3pthiaIig2KPqeeYkEx5bSkVIqQtQOTJBuLQ==",
       "dependencies": {
         "@edge-runtime/node-utils": "2.2.1",
-        "@edge-runtime/primitives": "3.1.1",
-        "@edge-runtime/vm": "3.1.1",
+        "@edge-runtime/primitives": "4.0.5",
+        "@edge-runtime/vm": "3.1.7",
         "@types/node": "14.18.33",
-        "@vercel/build-utils": "7.2.2",
-        "@vercel/error-utils": "2.0.1",
+        "@vercel/build-utils": "7.3.0",
+        "@vercel/error-utils": "2.0.2",
         "@vercel/nft": "0.24.2",
         "@vercel/static-config": "3.0.0",
         "async-listen": "3.0.0",
-        "edge-runtime": "2.5.1",
+        "edge-runtime": "2.5.7",
         "esbuild": "0.14.47",
         "etag": "1.8.1",
         "exit-hook": "2.2.1",
@@ -1150,7 +1330,7 @@
         "ts-morph": "12.0.0",
         "ts-node": "10.9.1",
         "typescript": "4.9.5",
-        "undici": "5.23.0"
+        "undici": "5.26.5"
       }
     },
     "node_modules/@vercel/node/node_modules/@types/node": {
@@ -1203,17 +1383,17 @@
       }
     },
     "node_modules/@vercel/python": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/@vercel/python/-/python-4.0.2.tgz",
-      "integrity": "sha512-mmUeR3GBuDnaJK3IIHRoPl3bNevcWO3N/YrNAx+zxLPSHzfzmCLZbFVVXbzoKBi/cALiOPcApVhlQXwU26y7xg=="
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/@vercel/python/-/python-4.1.0.tgz",
+      "integrity": "sha512-EIQXK5zL6fce0Barh74gc7xyLtRyvgmLZDIVQ8yJLtFxPlPCRY3GXkdJ7Jdcw8Pd0uuVF0vIHatv18xSLbcwtg=="
     },
     "node_modules/@vercel/redwood": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.0.4.tgz",
-      "integrity": "sha512-f0dzR8xQ34MKTzLmUygfu6vngCaRozN0z2Aao1sQ7sIC0+UExgiL0qJ9syejWwDv7IxK4yZ0w1WvztrHtAMa9Q==",
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.0.5.tgz",
+      "integrity": "sha512-9iWTxfMkC7yNnwN2xxOdptiIDAgXe1V1fh3aw92MWt5PBRcFY9RqgIPF7Q3Qa7yzQFgpbHwCnSTqWO+HCEuFtw==",
       "dependencies": {
         "@vercel/nft": "0.24.2",
-        "@vercel/routing-utils": "3.0.0",
+        "@vercel/routing-utils": "3.1.0",
         "semver": "6.3.1"
       }
     },
@@ -1226,9 +1406,9 @@
       }
     },
     "node_modules/@vercel/remix-builder": {
-      "version": "2.0.9",
-      "resolved": "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-2.0.9.tgz",
-      "integrity": "sha512-/wgZrnKGZYJ8Z1tgAQc2UUhF+51tGwSHw9PnAhnaY5KclLiBrnXSjKqUAXW8GyaM4IB1ZjPXoI5oARKKUGu8kQ==",
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-2.0.14.tgz",
+      "integrity": "sha512-c+ILERSRq404sf6kt0qWhYhuxWkkoTEm2FdLoUnVs21K6kzGtJMJbUExEHoPZvN9a0tq86ZU86jVvRZV6WL0cQ==",
       "dependencies": {
         "@vercel/nft": "0.24.2",
         "@vercel/static-config": "3.0.0",
@@ -1236,9 +1416,9 @@
       }
     },
     "node_modules/@vercel/routing-utils": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-3.0.0.tgz",
-      "integrity": "sha512-u+SoHnL+RzRQIRP+YxvigzzKXQcbgYQF9qCTIuWuoLw5h9thIYWcDJvz3KxrUzxjGZ3dWboXA29KAlT6eeaeFw==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-3.1.0.tgz",
+      "integrity": "sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==",
       "dependencies": {
         "path-to-regexp": "6.1.0"
       },
@@ -1274,17 +1454,17 @@
       "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw=="
     },
     "node_modules/@vercel/ruby": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vercel/ruby/-/ruby-2.0.2.tgz",
-      "integrity": "sha512-MqFynhtZ905L210DWAbgkiEQEK39LTtp9eL2Nm6PjzhjNzU6hV0UfK8Z24vU9CC6J4mrUTTZx396fH7XTYJWqg=="
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@vercel/ruby/-/ruby-2.0.4.tgz",
+      "integrity": "sha512-EpZyfF6wFGzFDmubFIh/EZtYpKindmXx/69xSfKEBTVU0afgljyOOICbyZePe5tvigfOEBLSLgrt/2nN+MlLtA=="
     },
     "node_modules/@vercel/static-build": {
-      "version": "2.0.8",
-      "resolved": "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.0.8.tgz",
-      "integrity": "sha512-46//Pxez7mc+UdOZgNv6y9lPSBehMdvCxajb/nvquptDMNH543Itospu9lyt448EQoS7HVE1NSPI21iiCboqvA==",
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.0.14.tgz",
+      "integrity": "sha512-l5eQtJbk5Pc+P8XARDnpcbX4LnK3bGy7uf6S1aFOD4h6F8iBdg0agWTufZnq5BI91pcPVICPazM5BYhigIEznQ==",
       "dependencies": {
         "@vercel/gatsby-plugin-vercel-analytics": "1.0.11",
-        "@vercel/gatsby-plugin-vercel-builder": "2.0.7",
+        "@vercel/gatsby-plugin-vercel-builder": "2.0.12",
         "@vercel/static-config": "3.0.0",
         "ts-morph": "12.0.0"
       }
@@ -2112,6 +2292,25 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001643",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz",
+      "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ]
+    },
     "node_modules/catharsis": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
@@ -2278,6 +2477,11 @@
         "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
+    "node_modules/client-only": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+      "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+    },
     "node_modules/cliui": {
       "version": "8.0.1",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -2649,16 +2853,16 @@
       }
     },
     "node_modules/edge-runtime": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.1.tgz",
-      "integrity": "sha512-E0kY1Dqvwvk9yh7dvR56KnCjXf/dlbrrGjO5Sjnz9Ja3WqYT3csv2B8O4erxJiOWfWy9NTukBk4Kb3yrR66gBw==",
+      "version": "2.5.7",
+      "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.7.tgz",
+      "integrity": "sha512-gA4qSVP0sNwJlkdQ2nahDPASlSl8twUd17o+JolPa1EtXpLTGzIpOETvodgJwXIxa+zaD8bnAXCdsWrx2PhlVQ==",
       "dependencies": {
         "@edge-runtime/format": "2.2.0",
-        "@edge-runtime/vm": "3.1.1",
+        "@edge-runtime/ponyfill": "2.4.1",
+        "@edge-runtime/vm": "3.1.7",
         "async-listen": "3.0.1",
         "mri": "1.2.0",
         "picocolors": "1.0.0",
-        "pretty-bytes": "5.6.0",
         "pretty-ms": "7.0.1",
         "signal-exit": "4.0.2",
         "time-span": "4.0.0"
@@ -4344,6 +4548,11 @@
         "url": "https://github.com/sponsors/panva"
       }
     },
+    "node_modules/jquery": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
+      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
+    },
     "node_modules/js-string-escape": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
@@ -4352,6 +4561,12 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "peer": true
+    },
     "node_modules/js-yaml": {
       "version": "3.14.1",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -4653,6 +4868,18 @@
       "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==",
       "optional": true
     },
+    "node_modules/loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "peer": true,
+      "dependencies": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
     "node_modules/lowercase-keys": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
@@ -5017,6 +5244,72 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/next": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz",
+      "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==",
+      "dependencies": {
+        "@next/env": "14.2.5",
+        "@swc/helpers": "0.5.5",
+        "busboy": "1.6.0",
+        "caniuse-lite": "^1.0.30001579",
+        "graceful-fs": "^4.2.11",
+        "postcss": "8.4.31",
+        "styled-jsx": "5.1.1"
+      },
+      "bin": {
+        "next": "dist/bin/next"
+      },
+      "engines": {
+        "node": ">=18.17.0"
+      },
+      "optionalDependencies": {
+        "@next/swc-darwin-arm64": "14.2.5",
+        "@next/swc-darwin-x64": "14.2.5",
+        "@next/swc-linux-arm64-gnu": "14.2.5",
+        "@next/swc-linux-arm64-musl": "14.2.5",
+        "@next/swc-linux-x64-gnu": "14.2.5",
+        "@next/swc-linux-x64-musl": "14.2.5",
+        "@next/swc-win32-arm64-msvc": "14.2.5",
+        "@next/swc-win32-ia32-msvc": "14.2.5",
+        "@next/swc-win32-x64-msvc": "14.2.5"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.1.0",
+        "@playwright/test": "^1.41.2",
+        "react": "^18.2.0",
+        "react-dom": "^18.2.0",
+        "sass": "^1.3.0"
+      },
+      "peerDependenciesMeta": {
+        "@opentelemetry/api": {
+          "optional": true
+        },
+        "@playwright/test": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/node-domexception": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
@@ -5505,6 +5798,33 @@
       "resolved": "https://registry.npmjs.org/pointer-tracker/-/pointer-tracker-2.5.3.tgz",
       "integrity": "sha512-LiJUeIbzk4dXq678YeyrZ++mdY17q4n/2sBHfU9wIuvmSzdiPgMvmvWN2g8mY4J7YwYOIrqrZUWP/MfFHVwYtg=="
     },
+    "node_modules/postcss": {
+      "version": "8.4.31",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+      "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.6",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
     "node_modules/postcss-value-parser": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
@@ -5519,17 +5839,6 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/pretty-bytes": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
-      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/pretty-ms": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz",
@@ -5774,6 +6083,31 @@
         "node": ">=0.6"
       }
     },
+    "node_modules/react": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+      "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+      "peer": true,
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+      "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+      "peer": true,
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "scheduler": "^0.23.2"
+      },
+      "peerDependencies": {
+        "react": "^18.3.1"
+      }
+    },
     "node_modules/readable-stream": {
       "version": "3.6.2",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -5987,6 +6321,15 @@
         "node": ">=16"
       }
     },
+    "node_modules/scheduler": {
+      "version": "0.23.2",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+      "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+      "peer": true,
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      }
+    },
     "node_modules/seek-bzip": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
@@ -6203,6 +6546,14 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/source-map-js": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -6424,6 +6775,28 @@
       "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==",
       "optional": true
     },
+    "node_modules/styled-jsx": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
+      "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
+      "dependencies": {
+        "client-only": "0.0.1"
+      },
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "peerDependencies": {
+        "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        },
+        "babel-plugin-macros": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/supertap": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz",
@@ -6727,9 +7100,9 @@
       }
     },
     "node_modules/typescript": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
-      "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
+      "version": "5.5.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+      "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
@@ -6788,16 +7161,24 @@
       "optional": true
     },
     "node_modules/undici": {
-      "version": "5.23.0",
-      "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz",
-      "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==",
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz",
+      "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==",
       "dependencies": {
-        "busboy": "^1.6.0"
+        "@fastify/busboy": "^2.0.0"
       },
       "engines": {
         "node": ">=14.0"
       }
     },
+    "node_modules/undici/node_modules/@fastify/busboy": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
+      "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
+      "engines": {
+        "node": ">=14"
+      }
+    },
     "node_modules/unicode-trie": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
@@ -6854,21 +7235,21 @@
       "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
     },
     "node_modules/vercel": {
-      "version": "32.4.1",
-      "resolved": "https://registry.npmjs.org/vercel/-/vercel-32.4.1.tgz",
-      "integrity": "sha512-cULmLvceDaluXz2usPtPYhb9y/jwjWolAjBBbG1DLGQmxVlnHVHTOJrYPaq2ioujQpU0yi92+RQPdzjzOY6aEg==",
+      "version": "32.7.2",
+      "resolved": "https://registry.npmjs.org/vercel/-/vercel-32.7.2.tgz",
+      "integrity": "sha512-esyeo67OZ/f7usKFCrx6NSjsvpo/BP/C8Mfron2uiCb4vXVcjkwOM7TwliHx6b0DbXjpzomdGVUHKRs34VNn2Q==",
       "dependencies": {
-        "@vercel/build-utils": "7.2.2",
+        "@vercel/build-utils": "7.3.0",
         "@vercel/fun": "1.1.0",
-        "@vercel/go": "3.0.3",
+        "@vercel/go": "3.0.4",
         "@vercel/hydrogen": "1.0.1",
-        "@vercel/next": "4.0.10",
-        "@vercel/node": "3.0.7",
-        "@vercel/python": "4.0.2",
-        "@vercel/redwood": "2.0.4",
-        "@vercel/remix-builder": "2.0.9",
-        "@vercel/ruby": "2.0.2",
-        "@vercel/static-build": "2.0.8",
+        "@vercel/next": "4.0.15",
+        "@vercel/node": "3.0.12",
+        "@vercel/python": "4.1.0",
+        "@vercel/redwood": "2.0.5",
+        "@vercel/remix-builder": "2.0.14",
+        "@vercel/ruby": "2.0.4",
+        "@vercel/static-build": "2.0.14",
         "chokidar": "3.3.1"
       },
       "bin": {
@@ -7080,6 +7461,14 @@
       "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
       "optional": true
     },
+    "node_modules/xmlhttprequest": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+      "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/y18n": {
       "version": "5.0.8",
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -7216,17 +7605,22 @@
         "@edge-runtime/cookies": "3.4.1"
       }
     },
+    "@edge-runtime/ponyfill": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.1.tgz",
+      "integrity": "sha512-ZbR/EViY3gg2rmEAQTKPa6mXl4aR1/+cFcQe4r1segCjEbTAxT6PWu40odbu/KlZKSysEb2O/BWIC2lJgSJOMQ=="
+    },
     "@edge-runtime/primitives": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-3.1.1.tgz",
-      "integrity": "sha512-ROO22py+KdAfzqWZu6CtVMC4qV6mS0W1jPI51jGXE+uenyBUN7cQTWB9ReQc8Bm4cnjqmhajvpqEx3j7Y9iSOg=="
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.0.5.tgz",
+      "integrity": "sha512-t7QiN5d/KpXgCvIfSt6Nm9Hj3WVdNgc5CpOD73jasY+9EvTI7Ngdj5cXvjcHrPcmYWJZMySPgeEeoL/1N/Llag=="
     },
     "@edge-runtime/vm": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.1.1.tgz",
-      "integrity": "sha512-6NJRRG04/91qnWLZj+wZm27q6fJkTbkZdIJdo/Ig++GTxkAv8Wh/45nIcz9Xg7AzIAMpAkflFdiCrCoZ3hp1Iw==",
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.1.7.tgz",
+      "integrity": "sha512-hUMFbDQ/nZN+1TLMi6iMO1QFz9RSV8yGG8S42WFPFma1d7VSNE0eMdJUmwjmtav22/iQkzHMmu6oTSfAvRGS8g==",
       "requires": {
-        "@edge-runtime/primitives": "3.1.1"
+        "@edge-runtime/primitives": "4.0.5"
       }
     },
     "@fastify/busboy": {
@@ -7466,6 +7860,65 @@
         }
       }
     },
+    "@next/env": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz",
+      "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA=="
+    },
+    "@next/swc-darwin-arm64": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz",
+      "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==",
+      "optional": true
+    },
+    "@next/swc-darwin-x64": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz",
+      "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==",
+      "optional": true
+    },
+    "@next/swc-linux-arm64-gnu": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz",
+      "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==",
+      "optional": true
+    },
+    "@next/swc-linux-arm64-musl": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz",
+      "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==",
+      "optional": true
+    },
+    "@next/swc-linux-x64-gnu": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz",
+      "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==",
+      "optional": true
+    },
+    "@next/swc-linux-x64-musl": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz",
+      "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==",
+      "optional": true
+    },
+    "@next/swc-win32-arm64-msvc": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz",
+      "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==",
+      "optional": true
+    },
+    "@next/swc-win32-ia32-msvc": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz",
+      "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==",
+      "optional": true
+    },
+    "@next/swc-win32-x64-msvc": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz",
+      "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==",
+      "optional": true
+    },
     "@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -7630,6 +8083,20 @@
       "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz",
       "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g=="
     },
+    "@swc/counter": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+      "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="
+    },
+    "@swc/helpers": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz",
+      "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==",
+      "requires": {
+        "@swc/counter": "^0.1.3",
+        "tslib": "^2.4.0"
+      }
+    },
     "@szmarczak/http-timer": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
@@ -7849,9 +8316,9 @@
       "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg=="
     },
     "@vercel/build-utils": {
-      "version": "7.2.2",
-      "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-7.2.2.tgz",
-      "integrity": "sha512-CUMgVKTJCba5tGe+KZaVvwGUCsuSeuNEmPIzMggIMDtzdqllRu8+QjjIhEI+unHoYvUgGfen6Z5lMeMo9Ne0qQ=="
+      "version": "7.3.0",
+      "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-7.3.0.tgz",
+      "integrity": "sha512-RJwqrGYSk75auHZqWmlSL+a5JsWv+4SF1AxNQJ+KpF3XWZ/8yThkN/jHBfNxMmW6VvNczSVtMaXI0/2Sess6Eg=="
     },
     "@vercel/edge": {
       "version": "1.1.0",
@@ -7859,9 +8326,9 @@
       "integrity": "sha512-84H2EavY5Kul9Ef1DnTH0XEG5vChqcXjyqoRLVPjjZjLWw47sMapzXXQH09pybcshR+8AKqULGvFqPTWuRh3Rw=="
     },
     "@vercel/error-utils": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.1.tgz",
-      "integrity": "sha512-ZUVpRFArh5eyKpJmdfEuCaMpZKQvZgUq0pQ7PdK8m5FgRYEvF4I0TMJH3JnkbYaMMUH82aYWZr+/hFJtEBcmTQ=="
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.2.tgz",
+      "integrity": "sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ=="
     },
     "@vercel/fun": {
       "version": "1.1.0",
@@ -8023,6 +8490,12 @@
         }
       }
     },
+    "@vercel/functions": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@vercel/functions/-/functions-1.4.0.tgz",
+      "integrity": "sha512-Ln6SpIkms1UJg306X2kbEMyG9ol+mjDr2xx389cvsBxgFyFMI9Bm+LYOG4N3TSik4FI59MECyyc4oz7AIAYmqQ==",
+      "requires": {}
+    },
     "@vercel/gatsby-plugin-vercel-analytics": {
       "version": "1.0.11",
       "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-analytics/-/gatsby-plugin-vercel-analytics-1.0.11.tgz",
@@ -8032,13 +8505,13 @@
       }
     },
     "@vercel/gatsby-plugin-vercel-builder": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.7.tgz",
-      "integrity": "sha512-hzaWLdBeb/QnGRE17ldaxeXMTLroaiJTlaW2G3HwvaK8sXA9e+jmcfAw8fjN3BNMnkFU523CnE7InqmjKH4TfQ==",
+      "version": "2.0.12",
+      "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.12.tgz",
+      "integrity": "sha512-S1RkywrUItewqg06T3L4cgYfiwi2BFngHIIerhOYhVuD9A+yfMgxnH5dkbu6nujmV1SEws+Q92wSiPfLPmO0eA==",
       "requires": {
         "@sinclair/typebox": "0.25.24",
-        "@vercel/build-utils": "7.2.2",
-        "@vercel/routing-utils": "3.0.0",
+        "@vercel/build-utils": "7.3.0",
+        "@vercel/routing-utils": "3.1.0",
         "esbuild": "0.14.47",
         "etag": "1.8.1",
         "fs-extra": "11.1.0"
@@ -8064,16 +8537,16 @@
           }
         },
         "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+          "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="
         }
       }
     },
     "@vercel/go": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@vercel/go/-/go-3.0.3.tgz",
-      "integrity": "sha512-XhrmpsACxNo64ojhscL//Mq+XEfm3VXlx/UIUcHzJJXdvFnz7DEzh1zs0AtdpVgZbYhPQ7rW3GIejaHrIJnN5w=="
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@vercel/go/-/go-3.0.4.tgz",
+      "integrity": "sha512-hMIJm2xwU1HT56YRNF8HNOnIFNH7WnGl1l2D6lc6UJk7XdCCh1Dm0nsqLqki2SprTUh3I+53pTQaqgRsFGf06A=="
     },
     "@vercel/hydrogen": {
       "version": "1.0.1",
@@ -8085,9 +8558,9 @@
       }
     },
     "@vercel/next": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/@vercel/next/-/next-4.0.10.tgz",
-      "integrity": "sha512-+Z+R7Dev1OFU9Rm8R4h34W0/RdSHeZ4dvkv50lS7TneRj1Ab1zLlqupyG0tEdSP5/Nvb/OZ4ixvTiLqw9oo8oA==",
+      "version": "4.0.15",
+      "resolved": "https://registry.npmjs.org/@vercel/next/-/next-4.0.15.tgz",
+      "integrity": "sha512-BxMxIJrya7MS6IWrQIaQaYHPmq7WoZFLX909RBpNoAG5wgzrTrW756d2EsibBwGo7sQYBv2atyI5GqBIHzYbWg==",
       "requires": {
         "@vercel/nft": "0.24.2"
       }
@@ -8111,20 +8584,20 @@
       }
     },
     "@vercel/node": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/@vercel/node/-/node-3.0.7.tgz",
-      "integrity": "sha512-0KrDGi6z+qPtCyC7wSHmHDU/ot352AJpAeAO1OIEYqYFsYwzvwuyu7TbGGwiUbtolij4/EBUCls3YmwADM/vKw==",
+      "version": "3.0.12",
+      "resolved": "https://registry.npmjs.org/@vercel/node/-/node-3.0.12.tgz",
+      "integrity": "sha512-OiNHiUe1LX/CfDrQ07ntPsoYhJiC38mEeErYeqA6YNVAz3QGdX3pthiaIig2KPqeeYkEx5bSkVIqQtQOTJBuLQ==",
       "requires": {
         "@edge-runtime/node-utils": "2.2.1",
-        "@edge-runtime/primitives": "3.1.1",
-        "@edge-runtime/vm": "3.1.1",
+        "@edge-runtime/primitives": "4.0.5",
+        "@edge-runtime/vm": "3.1.7",
         "@types/node": "14.18.33",
-        "@vercel/build-utils": "7.2.2",
-        "@vercel/error-utils": "2.0.1",
+        "@vercel/build-utils": "7.3.0",
+        "@vercel/error-utils": "2.0.2",
         "@vercel/nft": "0.24.2",
         "@vercel/static-config": "3.0.0",
         "async-listen": "3.0.0",
-        "edge-runtime": "2.5.1",
+        "edge-runtime": "2.5.7",
         "esbuild": "0.14.47",
         "etag": "1.8.1",
         "exit-hook": "2.2.1",
@@ -8133,7 +8606,7 @@
         "ts-morph": "12.0.0",
         "ts-node": "10.9.1",
         "typescript": "4.9.5",
-        "undici": "5.23.0"
+        "undici": "5.26.5"
       },
       "dependencies": {
         "@types/node": {
@@ -8167,17 +8640,17 @@
       }
     },
     "@vercel/python": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/@vercel/python/-/python-4.0.2.tgz",
-      "integrity": "sha512-mmUeR3GBuDnaJK3IIHRoPl3bNevcWO3N/YrNAx+zxLPSHzfzmCLZbFVVXbzoKBi/cALiOPcApVhlQXwU26y7xg=="
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/@vercel/python/-/python-4.1.0.tgz",
+      "integrity": "sha512-EIQXK5zL6fce0Barh74gc7xyLtRyvgmLZDIVQ8yJLtFxPlPCRY3GXkdJ7Jdcw8Pd0uuVF0vIHatv18xSLbcwtg=="
     },
     "@vercel/redwood": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.0.4.tgz",
-      "integrity": "sha512-f0dzR8xQ34MKTzLmUygfu6vngCaRozN0z2Aao1sQ7sIC0+UExgiL0qJ9syejWwDv7IxK4yZ0w1WvztrHtAMa9Q==",
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.0.5.tgz",
+      "integrity": "sha512-9iWTxfMkC7yNnwN2xxOdptiIDAgXe1V1fh3aw92MWt5PBRcFY9RqgIPF7Q3Qa7yzQFgpbHwCnSTqWO+HCEuFtw==",
       "requires": {
         "@vercel/nft": "0.24.2",
-        "@vercel/routing-utils": "3.0.0",
+        "@vercel/routing-utils": "3.1.0",
         "semver": "6.3.1"
       },
       "dependencies": {
@@ -8189,9 +8662,9 @@
       }
     },
     "@vercel/remix-builder": {
-      "version": "2.0.9",
-      "resolved": "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-2.0.9.tgz",
-      "integrity": "sha512-/wgZrnKGZYJ8Z1tgAQc2UUhF+51tGwSHw9PnAhnaY5KclLiBrnXSjKqUAXW8GyaM4IB1ZjPXoI5oARKKUGu8kQ==",
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-2.0.14.tgz",
+      "integrity": "sha512-c+ILERSRq404sf6kt0qWhYhuxWkkoTEm2FdLoUnVs21K6kzGtJMJbUExEHoPZvN9a0tq86ZU86jVvRZV6WL0cQ==",
       "requires": {
         "@vercel/nft": "0.24.2",
         "@vercel/static-config": "3.0.0",
@@ -8199,9 +8672,9 @@
       }
     },
     "@vercel/routing-utils": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-3.0.0.tgz",
-      "integrity": "sha512-u+SoHnL+RzRQIRP+YxvigzzKXQcbgYQF9qCTIuWuoLw5h9thIYWcDJvz3KxrUzxjGZ3dWboXA29KAlT6eeaeFw==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-3.1.0.tgz",
+      "integrity": "sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==",
       "requires": {
         "ajv": "^6.0.0",
         "path-to-regexp": "6.1.0"
@@ -8233,17 +8706,17 @@
       }
     },
     "@vercel/ruby": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vercel/ruby/-/ruby-2.0.2.tgz",
-      "integrity": "sha512-MqFynhtZ905L210DWAbgkiEQEK39LTtp9eL2Nm6PjzhjNzU6hV0UfK8Z24vU9CC6J4mrUTTZx396fH7XTYJWqg=="
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@vercel/ruby/-/ruby-2.0.4.tgz",
+      "integrity": "sha512-EpZyfF6wFGzFDmubFIh/EZtYpKindmXx/69xSfKEBTVU0afgljyOOICbyZePe5tvigfOEBLSLgrt/2nN+MlLtA=="
     },
     "@vercel/static-build": {
-      "version": "2.0.8",
-      "resolved": "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.0.8.tgz",
-      "integrity": "sha512-46//Pxez7mc+UdOZgNv6y9lPSBehMdvCxajb/nvquptDMNH543Itospu9lyt448EQoS7HVE1NSPI21iiCboqvA==",
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.0.14.tgz",
+      "integrity": "sha512-l5eQtJbk5Pc+P8XARDnpcbX4LnK3bGy7uf6S1aFOD4h6F8iBdg0agWTufZnq5BI91pcPVICPazM5BYhigIEznQ==",
       "requires": {
         "@vercel/gatsby-plugin-vercel-analytics": "1.0.11",
-        "@vercel/gatsby-plugin-vercel-builder": "2.0.7",
+        "@vercel/gatsby-plugin-vercel-builder": "2.0.12",
         "@vercel/static-config": "3.0.0",
         "ts-morph": "12.0.0"
       }
@@ -8821,6 +9294,11 @@
       "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
       "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="
     },
+    "caniuse-lite": {
+      "version": "1.0.30001643",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz",
+      "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg=="
+    },
     "catharsis": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
@@ -8930,6 +9408,11 @@
         }
       }
     },
+    "client-only": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+      "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+    },
     "cliui": {
       "version": "8.0.1",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -9214,16 +9697,16 @@
       }
     },
     "edge-runtime": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.1.tgz",
-      "integrity": "sha512-E0kY1Dqvwvk9yh7dvR56KnCjXf/dlbrrGjO5Sjnz9Ja3WqYT3csv2B8O4erxJiOWfWy9NTukBk4Kb3yrR66gBw==",
+      "version": "2.5.7",
+      "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.7.tgz",
+      "integrity": "sha512-gA4qSVP0sNwJlkdQ2nahDPASlSl8twUd17o+JolPa1EtXpLTGzIpOETvodgJwXIxa+zaD8bnAXCdsWrx2PhlVQ==",
       "requires": {
         "@edge-runtime/format": "2.2.0",
-        "@edge-runtime/vm": "3.1.1",
+        "@edge-runtime/ponyfill": "2.4.1",
+        "@edge-runtime/vm": "3.1.7",
         "async-listen": "3.0.1",
         "mri": "1.2.0",
         "picocolors": "1.0.0",
-        "pretty-bytes": "5.6.0",
         "pretty-ms": "7.0.1",
         "signal-exit": "4.0.2",
         "time-span": "4.0.0"
@@ -10310,11 +10793,22 @@
       "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.2.tgz",
       "integrity": "sha512-IY73F228OXRl9ar3jJagh7Vnuhj/GzBunPiZP13K0lOl7Am9SoWW3kEzq3MCllJMTtZqHTiDXQvoRd4U95aU6A=="
     },
+    "jquery": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
+      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
+    },
     "js-string-escape": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
       "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg=="
     },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "peer": true
+    },
     "js-yaml": {
       "version": "3.14.1",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -10578,6 +11072,15 @@
       "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==",
       "optional": true
     },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "peer": true,
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      }
+    },
     "lowercase-keys": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
@@ -10836,6 +11339,34 @@
         "uid-safe": "2.1.5"
       }
     },
+    "nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
+    },
+    "next": {
+      "version": "14.2.5",
+      "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz",
+      "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==",
+      "requires": {
+        "@next/env": "14.2.5",
+        "@next/swc-darwin-arm64": "14.2.5",
+        "@next/swc-darwin-x64": "14.2.5",
+        "@next/swc-linux-arm64-gnu": "14.2.5",
+        "@next/swc-linux-arm64-musl": "14.2.5",
+        "@next/swc-linux-x64-gnu": "14.2.5",
+        "@next/swc-linux-x64-musl": "14.2.5",
+        "@next/swc-win32-arm64-msvc": "14.2.5",
+        "@next/swc-win32-ia32-msvc": "14.2.5",
+        "@next/swc-win32-x64-msvc": "14.2.5",
+        "@swc/helpers": "0.5.5",
+        "busboy": "1.6.0",
+        "caniuse-lite": "^1.0.30001579",
+        "graceful-fs": "^4.2.11",
+        "postcss": "8.4.31",
+        "styled-jsx": "5.1.1"
+      }
+    },
     "node-domexception": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
@@ -11170,6 +11701,16 @@
       "resolved": "https://registry.npmjs.org/pointer-tracker/-/pointer-tracker-2.5.3.tgz",
       "integrity": "sha512-LiJUeIbzk4dXq678YeyrZ++mdY17q4n/2sBHfU9wIuvmSzdiPgMvmvWN2g8mY4J7YwYOIrqrZUWP/MfFHVwYtg=="
     },
+    "postcss": {
+      "version": "8.4.31",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+      "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+      "requires": {
+        "nanoid": "^3.3.6",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      }
+    },
     "postcss-value-parser": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
@@ -11181,11 +11722,6 @@
       "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
       "optional": true
     },
-    "pretty-bytes": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
-      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="
-    },
     "pretty-ms": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz",
@@ -11361,6 +11897,25 @@
         }
       }
     },
+    "react": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+      "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+      "peer": true,
+      "requires": {
+        "loose-envify": "^1.1.0"
+      }
+    },
+    "react-dom": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+      "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+      "peer": true,
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "scheduler": "^0.23.2"
+      }
+    },
     "readable-stream": {
       "version": "3.6.2",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -11496,6 +12051,15 @@
         "yoga-wasm-web": "^0.3.3"
       }
     },
+    "scheduler": {
+      "version": "0.23.2",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+      "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+      "peer": true,
+      "requires": {
+        "loose-envify": "^1.1.0"
+      }
+    },
     "seek-bzip": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
@@ -11633,6 +12197,11 @@
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
       "optional": true
     },
+    "source-map-js": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="
+    },
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -11819,6 +12388,14 @@
       "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==",
       "optional": true
     },
+    "styled-jsx": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
+      "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
+      "requires": {
+        "client-only": "0.0.1"
+      }
+    },
     "supertap": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz",
@@ -12032,9 +12609,9 @@
       }
     },
     "typescript": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
-      "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w=="
+      "version": "5.5.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+      "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q=="
     },
     "uc.micro": {
       "version": "1.0.6",
@@ -12077,11 +12654,18 @@
       "optional": true
     },
     "undici": {
-      "version": "5.23.0",
-      "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz",
-      "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==",
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz",
+      "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==",
       "requires": {
-        "busboy": "^1.6.0"
+        "@fastify/busboy": "^2.0.0"
+      },
+      "dependencies": {
+        "@fastify/busboy": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
+          "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="
+        }
       }
     },
     "unicode-trie": {
@@ -12127,21 +12711,21 @@
       "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
     },
     "vercel": {
-      "version": "32.4.1",
-      "resolved": "https://registry.npmjs.org/vercel/-/vercel-32.4.1.tgz",
-      "integrity": "sha512-cULmLvceDaluXz2usPtPYhb9y/jwjWolAjBBbG1DLGQmxVlnHVHTOJrYPaq2ioujQpU0yi92+RQPdzjzOY6aEg==",
+      "version": "32.7.2",
+      "resolved": "https://registry.npmjs.org/vercel/-/vercel-32.7.2.tgz",
+      "integrity": "sha512-esyeo67OZ/f7usKFCrx6NSjsvpo/BP/C8Mfron2uiCb4vXVcjkwOM7TwliHx6b0DbXjpzomdGVUHKRs34VNn2Q==",
       "requires": {
-        "@vercel/build-utils": "7.2.2",
+        "@vercel/build-utils": "7.3.0",
         "@vercel/fun": "1.1.0",
-        "@vercel/go": "3.0.3",
+        "@vercel/go": "3.0.4",
         "@vercel/hydrogen": "1.0.1",
-        "@vercel/next": "4.0.10",
-        "@vercel/node": "3.0.7",
-        "@vercel/python": "4.0.2",
-        "@vercel/redwood": "2.0.4",
-        "@vercel/remix-builder": "2.0.9",
-        "@vercel/ruby": "2.0.2",
-        "@vercel/static-build": "2.0.8",
+        "@vercel/next": "4.0.15",
+        "@vercel/node": "3.0.12",
+        "@vercel/python": "4.1.0",
+        "@vercel/redwood": "2.0.5",
+        "@vercel/remix-builder": "2.0.14",
+        "@vercel/ruby": "2.0.4",
+        "@vercel/static-build": "2.0.14",
         "chokidar": "3.3.1"
       },
       "dependencies": {
@@ -12296,6 +12880,11 @@
       "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
       "optional": true
     },
+    "xmlhttprequest": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+      "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA=="
+    },
     "y18n": {
       "version": "5.0.8",
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
diff --git a/package.json b/package.json
index f0d13c709f845d57fbce4c49cd20c68071e43ada..4ee9f96bf20f3814a4b0cc0cb07400ba11c299c4 100644
--- a/package.json
+++ b/package.json
@@ -7,6 +7,7 @@
     "@polymath-ai/host": "*",
     "@vercel/analytics": "^1.0.2",
     "@vercel/edge": "^1.1.0",
+    "@vercel/functions": "^1.4.0",
     "@vercel/node": "^3.0.7",
     "@vercel/og": "^0.5.17",
     "activitypub-core-types": "^0.3.2",
@@ -14,19 +15,22 @@
     "file-drop-element": "^1.0.1",
     "firebase-admin": "^11.11.0",
     "hugo-bin": "^0.115.0",
+    "jquery": "^3.7.1",
     "multiparty": "^4.2.3",
+    "next": "^14.2.5",
     "node-fetch": "^3.3.2",
     "pinch-zoom-element": "^1.1.1",
     "uuid": "^9.0.1",
-    "vercel": "^32.4.1",
-    "whatwg-flora-tmpl": "^1.0.3"
+    "vercel": "^32.7.2",
+    "whatwg-flora-tmpl": "^1.0.3",
+    "xmlhttprequest": "^1.8.0"
   },
   "engines": {
     "node": ">= 18.0.0"
   },
   "devDependencies": {
     "@types/multiparty": "^0.0.34",
-    "typescript": "^5.2.2"
+    "typescript": "^5.5.4"
   },
   "type": "module"
 }
diff --git a/static/css/gitlab-widgets/gitlab-widgets.css b/static/css/gitlab-widgets/gitlab-widgets.css
index 6adcfa6a2677658d99d322a009b473f867257bc7..d9386e118a7fec1bebae108db9be92535a488f20 100644
--- a/static/css/gitlab-widgets/gitlab-widgets.css
+++ b/static/css/gitlab-widgets/gitlab-widgets.css
@@ -6,12 +6,6 @@
   background-color: #gray;
 }
 
-.release-name {
-  font-size: 36px !important;
-  text-align: center;
-  background-color: #gray;
-}
-
 .project-header {
   font-size: 32px !important;
   text-align: center;
@@ -30,8 +24,11 @@
   font-weight: bold;
 }
 
-.footer-element .label {
-  font-weight: bold;
+.borderedWidget {
+  border-color: #333333;
+  border-width: 1px;
+  border-style: solid;
+  border-radius: 25px;
 }
 
 #overview-release-list span {
@@ -88,13 +85,30 @@
   padding-top: 1em;
 }
 
+/*
+@media (max-width: 1200px) {
+  .gitlab-overview-footer .footer-element {
+    font-size: 0.8em;
+  }
+
+  .gitlab-overview-footer .footer-element span {
+    display: block;
+  }
+}
+*/
+
 .gitlab-overview-footer .footer-element {
-  padding-left: 2em;
-  padding-right: 2em;
+  display: inline-block;
+  width: 100%;
+  padding-left: 1em;
+  padding-right: 1em;
 }
 
 .gitlab-overview-footer .footer-element span {
-  padding: 1em;
+  padding: 0.2em;
+  text-align: center;
+  width: 100%;
+  display: block;
 }
 
 .gitlab-overview-footer #commits {
@@ -103,10 +117,22 @@
 
 .gitlab-overview-footer #issues {
   text-align: center;
+  padding-top: 0;
+  display: flex;
+}
+
+.gitlab-overview-footer #issues span {
+  display: inline;
 }
 
 .gitlab-overview-footer #merge-requests {
   text-align: center;
+  padding-top: 0;
+  display: flex;
+}
+
+.gitlab-overview-footer #merge-requests span {
+  display: inline;
 }
 
 .gitlab-overview-footer #stars {
@@ -118,34 +144,10 @@
 }
 
 .red {
-  color: red !important;
+  color: red;
 }
 
 /* Gitlab single version css */
 .gitlab-single-version-overview {
 
 }
-
-.gitlab-milestone-progress {
-  width: 90%;
-  margin: auto;
-}
-
-.gitlab-milestone-progress .percentage-column {
-  width: 100%;
-}
-
-.gitlab-milestone-progress progress {
-  width: 100%;
-  margin: 0 0;
-}
-
-.gitlab-single-version-overview a {
-  width: 100%;
-  text-align: center;
-}
-
-.gitlab-single-version-entry {
-  width: auto;
-  margin: 0 0;
-}
diff --git a/static/javascripts/gitlab-widgets/gitlab-widgets.js b/static/javascripts/gitlab-widgets/gitlab-widgets.js
index 2c4dcac1b3a9cc5299d11787b3b707aa8b6c5b9a..8fdcbb0fa1661a15987d1aab6d6a966438f248c0 100644
--- a/static/javascripts/gitlab-widgets/gitlab-widgets.js
+++ b/static/javascripts/gitlab-widgets/gitlab-widgets.js
@@ -32,14 +32,21 @@ function initializeOverviewWidget(widget) {
     var projectName = overviewWidget.find(".project-name")
     var releaseList = overviewWidget.find(".gitlab-overview-release-list")
     var progressList = overviewWidget.find(".gitlab-progress-list")
+    var proxy = overviewWidget.find("#proxy")
+    var border = overviewWidget.find("#border")
     var projectId = gitlabWidgets.getGitlabServerProjectID(overviewWidget, 0)
     var displayCount = gitlabWidgets.getDisplayCount(overviewWidget)
 
-    gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(overviewWidget, 0), (data) => {
+    gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(overviewWidget, 0), proxy, (data) => {
         projectName.text(data['path_with_namespace'])
     });
 
-    gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(overviewWidget, 0) + gitlabWidgets.ENDPOINTS.P.MILESTONES, (data) => {
+    if(border.val() == "true") {
+        console.log("truth check passed")
+        overviewWidget.addClass("borderedWidget")
+    }
+
+    gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(overviewWidget, 0) + gitlabWidgets.ENDPOINTS.P.MILESTONES, proxy, (data) => {
 
         var displayedData = null
 
@@ -70,6 +77,7 @@ function initializeOverviewWidget(widget) {
 async function initializeSingleVersionWidget(widget) {
     var singleVersionWidget = $(widget)
     var releaseName = singleVersionWidget.find(".release-name")
+    var proxy = singleVersionWidget.find("#proxy")
     var percentageComplete = singleVersionWidget.find(".gitlab-single-version-entry .percentage-complete")
 
     var releaseData = null
@@ -77,7 +85,7 @@ async function initializeSingleVersionWidget(widget) {
 
     var addBugsField = false
 
-    await gitlabWidgets.apiCall(gitlabWidgets.buildProjectMilestoneURL(widget, 0), (data) => {
+    await gitlabWidgets.apiCall(gitlabWidgets.buildProjectMilestoneURL(widget, 0), proxy, (data) => {
         releaseName.text(data['title'])
         releaseAnchor = gitlabWidgets.generateMilestoneAnchor(widget, data)
         let releaseNameDatum = $("<td></td>").append(releaseAnchor)
@@ -88,7 +96,7 @@ async function initializeSingleVersionWidget(widget) {
         releaseData = data
     })
 
-    await gitlabWidgets.apiCall(gitlabWidgets.buildProjectMilestoneURL(widget, 0), (data) => {
+    await gitlabWidgets.apiCall(gitlabWidgets.buildProjectMilestoneURL(widget, 0), proxy, (data) => {
         if(data['state'] == "active") {
             initializeSingleVersionInProgress(widget, data)
         } else if(data['state'] == "closed") {
@@ -107,6 +115,7 @@ async function initializeSingleVersionWidget(widget) {
 
 async function initializeSingleVersionReleased(widget, data) {
     var singleVersionWidget = $(widget)
+    var proxy = singleVersionWidget.find("#proxy")
     var title = singleVersionWidget.find(".title")
     // DOM manipulations to get rid of fields that make no sense to display
     singleVersionWidget.find(".percentage-column").remove()
@@ -118,7 +127,7 @@ async function initializeSingleVersionReleased(widget, data) {
     var milestoneBugIssuesParams = new URLSearchParams({ ...issuesSearchParams, milestone: data['title'], labels: ["Type::Bug"] })
 
     // Color title based on whether bug issues exist
-    await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, 0) + gitlabWidgets.ENDPOINTS.P.ISSUES + "?" + milestoneBugIssuesParams.toString(), (data) => {
+    await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, 0) + gitlabWidgets.ENDPOINTS.P.ISSUES + "?" + milestoneBugIssuesParams.toString(), proxy, (data) => {
         if(data.length > 0) {
             title.children("a").addClass("red")
         } else {
@@ -131,6 +140,7 @@ async function initializeSingleVersionReleased(widget, data) {
 
 async function initializeSingleVersionInProgress(widget, data) {
     var singleVersionWidget = $(widget)
+    var proxy = singleVersionWidget.find("#proxy")
 
     // TODO: Calculate percentage complete
     var allIssuesParams = new URLSearchParams({ ...issuesSearchParams, milestone: data['title'] })
@@ -142,11 +152,11 @@ async function initializeSingleVersionInProgress(widget, data) {
     var closedIssuesCount = 0
 
     for(let i = 0; i < gitlabWidgets.getGitlabServerCount(singleVersionWidget); i++) {
-        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + allIssuesParams.toString(), (allIssuesData) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + allIssuesParams.toString(), proxy, (allIssuesData) => {
             allIssuesCount += allIssuesData.length
         })
 
-        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + closedIssuesParams.toString(), (closedIssuesData) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + closedIssuesParams.toString(), proxy, (closedIssuesData) => {
             closedIssuesCount += closedIssuesData.length
         })
     }
@@ -174,6 +184,8 @@ async function populateSingleVersionFooter(widget, milestoneTitle, addBugsField=
     var mergeRequestCount = 0
     var mergeRequestTotal = 0
 
+    var proxy = $(widget).find("#proxy")
+
     var bugFooterElement = $('<span class="footer-element"></span>')
 
     let issuesMilestoneSearchParams = new URLSearchParams({ ...issuesSearchParams, milestone: milestoneTitle })
@@ -183,19 +195,19 @@ async function populateSingleVersionFooter(widget, milestoneTitle, addBugsField=
     let allMRSearchParams = new URLSearchParams({ state: "all", milestone: milestoneTitle })
 
     for(let i = 0; i < gitlabWidgets.getGitlabServerCount(widget); i++) {
-        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + issuesMilestoneSearchParams.toString(), (data) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + issuesMilestoneSearchParams.toString(), proxy, (data) => {
             issueTotal += data.length 
         })
 
-        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + issuesOpenMilestoneSearchParams.toString(), (data) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + issuesOpenMilestoneSearchParams.toString(), proxy, (data) => {
             issueCount += data.length 
         })
 
-        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.MERGE_REQUESTS + "?" + openMRSearchParams.toString(), (data) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.MERGE_REQUESTS + "?" + openMRSearchParams.toString(), proxy, (data) => {
             mergeRequestCount += data.length
         })
 
-        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.MERGE_REQUESTS + "?" + allMRSearchParams.toString(), (data) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.MERGE_REQUESTS + "?" + allMRSearchParams.toString(), proxy, (data) => {
             mergeRequestTotal += data.length
         })
     }
@@ -214,14 +226,14 @@ async function populateSingleVersionFooter(widget, milestoneTitle, addBugsField=
     var milestoneBugIssuesParams = new URLSearchParams({ ...issuesSearchParams, milestone: milestoneTitle, labels: ["Type::Bug"] })
 
     // Color title based on whether bug issues exist
-    await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, 0) + gitlabWidgets.ENDPOINTS.P.ISSUES + "?" + milestoneBugIssuesParams.toString(), (data) => {
+    await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, 0) + gitlabWidgets.ENDPOINTS.P.ISSUES + "?" + milestoneBugIssuesParams.toString(), proxy, (data) => {
         getBugCountSinceRelease(widget, milestoneTitle).then((bugCount) => {
             bugFooterElement.find("#bugs").text(bugCount)
         })
     })
 
     let projectStatsSearchParams = new URLSearchParams({ statistics: "true" })
-    await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, 0) + "?" + projectStatsSearchParams.toString(), (data) => {
+    await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, 0) + "?" + projectStatsSearchParams.toString(), proxy, (data) => {
         $(widget).find("#commits").text(data['statistics']['commit_count'])
     })
 }
@@ -231,10 +243,11 @@ async function getBugCountSinceRelease(widget, milestoneTitle) {
     var indice = 0
     var bugCount = 0
 
+    var proxy = $(widget).find("#proxy")
+
     let serverCount = gitlabWidgets.getGitlabServerCount(widget)
 
     await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, 0) + gitlabWidgets.ENDPOINTS.P.MILESTONES, (data) => {
-        //console.log(data)
         for(var milestone of data) {
             milestones.push(milestone['title'])
         }
@@ -247,7 +260,7 @@ async function getBugCountSinceRelease(widget, milestoneTitle) {
     for(var milestone of subsequentMilestones) {
         let milestoneBugIssuesParams = new URLSearchParams({ ...issuesSearchParams, milestone: milestone, labels: ["Type::Bug"] })
         for(let i = 0; i < serverCount; i++) {
-            await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i) + gitlabWidgets.ENDPOINTS.P.ISSUES + "?" + milestoneBugIssuesParams.toString(), (data) => {
+            await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i) + gitlabWidgets.ENDPOINTS.P.ISSUES + "?" + milestoneBugIssuesParams.toString(), proxy, (data) => {
                 bugCount += data.length
             })
         }
@@ -265,33 +278,35 @@ async function populateFooter(widget) {
     var mergeRequestTotal = 0
     var commitCount = 0
 
+    var proxy = $(widget).find("#proxy")
+
     for(let i = 0; i < gitlabWidgets.getGitlabServerCount(widget); i++) {
         // Project info
-        await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i), (data) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i), proxy, (data) => {
             starCount += data['star_count']
             issueCount += data['open_issues_count']
         })
 
         // Issue count
-        await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i) + gitlabWidgets.ENDPOINTS.P.ISSUES, (data) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i) + gitlabWidgets.ENDPOINTS.P.ISSUES, proxy, (data) => {
             issueTotal += data.length
         })
 
         // Merge request count
         let openMRSearchParams = new URLSearchParams({ state: "opened" })
-        await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i) + gitlabWidgets.ENDPOINTS.P.MERGE_REQUESTS + "?" + openMRSearchParams.toString(), (data) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i) + gitlabWidgets.ENDPOINTS.P.MERGE_REQUESTS + "?" + openMRSearchParams.toString(), proxy, (data) => {
             mergeRequestCount += data.length
         })
 
         // Merge request count, part 2
         let allMRSearchParams = new URLSearchParams({ state: "all" })
-        await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i) + gitlabWidgets.ENDPOINTS.P.MERGE_REQUESTS + "?" + allMRSearchParams.toString(), (data) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i) + gitlabWidgets.ENDPOINTS.P.MERGE_REQUESTS + "?" + allMRSearchParams.toString(), proxy, (data) => {
             mergeRequestTotal += data.length
         })
 
         // Count the project commits
         let projectStatsSearchParams = new URLSearchParams({ statistics: "true" })
-        await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i) + "?" + projectStatsSearchParams.toString(), (data) => {
+        await gitlabWidgets.apiCall(gitlabWidgets.buildProjectURL(widget, i) + "?" + projectStatsSearchParams.toString(), proxy, (data) => {
             // We don't sum these values because we don't want to double-count commits
             // We want the higher count, though
             let singleProjectCommitCount = data['statistics']['commit_count']
@@ -314,9 +329,11 @@ function removeFooter(widget) {
 }
 
 function styleReleaseName(widget, releases) {
+    var proxy = $(widget).find("#proxy")
+
     Array.from(releases).forEach(release => {
         var allBugIssuesParams = new URLSearchParams({ ...issuesBugSearchParams, milestone: release.innerText })
-        gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, 0) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + allBugIssuesParams.toString(), (data) => {
+        gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, 0) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + allBugIssuesParams.toString(), proxy, (data) => {
             if(data.length == 0) {
                 $(release).addClass("green")
             } else {
@@ -329,6 +346,8 @@ function styleReleaseName(widget, releases) {
 async function populateProgressList(widget, progressList, releases) {
     var displayCount = gitlabWidgets.getDisplayCount(widget)
 
+    var proxy = $(widget).find("#proxy")
+
     var displayedReleases = null
 
     if(displayCount != null) {
@@ -360,11 +379,11 @@ async function populateProgressList(widget, progressList, releases) {
         for(let i = 0; i < gitlabWidgets.getGitlabServerCount(widget); i++) {
 
             // Get issues of milestone_title, open and closed
-            await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + allIssuesParams.toString(), (allIssuesData) => {
+            await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + allIssuesParams.toString(), proxy, (allIssuesData) => {
                 allIssuesCount += allIssuesData.length
             });
 
-            await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + closedIssuesParams.toString(), (closedIssuesData) => {
+            await gitlabWidgets.apiCall(gitlabWidgets.getGitlabServerURL(widget, i) + gitlabWidgets.ENDPOINTS.ISSUES + "?" + closedIssuesParams.toString(), proxy, (closedIssuesData) => {
                 closedIssuesCount += closedIssuesData.length
             });
         }
diff --git a/static/javascripts/gitlab-widgets/helpers.js b/static/javascripts/gitlab-widgets/helpers.js
index 6ea587950d73f4ee18f5f8ab1b52fb0486f8d6d9..812c970da461b3418902718548e8cb7ea8accb5a 100644
--- a/static/javascripts/gitlab-widgets/helpers.js
+++ b/static/javascripts/gitlab-widgets/helpers.js
@@ -2,9 +2,6 @@ export { getDisplayCount, getGitlabServerCount, getGitlabServerURLs, getGitlabSe
          getGitlabServerProjectID, generateMilestoneAnchor, buildProjectURL, buildProjectMilestoneURL, 
          apiCall, compareSemanticVersions, ENDPOINTS, PUBLIC_PROJECT_ENDPOINT };
 
-const GITLAB_CLEVERTHIS_TOKEN = "glpat--dYnjsqjXfHxkf6yrzvL"
-const GITLAB_QOTO_TOKEN = "glpat-7LzfVvDzWyb_8gwgpG2b"
-
 const PUBLIC_PROJECT_ENDPOINT = "/projects/"
 
 const ENDPOINTS = {
@@ -76,20 +73,17 @@ function buildProjectMilestoneURL(widget, index) {
     return url
 }
 
-function apiCall(endpoint, callback) {
-    var token = null
-    if(endpoint.toString().includes("cleverthis.com")) {
-        token = GITLAB_CLEVERTHIS_TOKEN
-    } else if(endpoint.toString().includes("qoto.org")) {
-        token = GITLAB_QOTO_TOKEN
-    } else {
-        return
-    }
+function apiCall(endpoint, proxy, callback) {
+    let proxyURL = new URL(proxy.val())
+    let proxySearchParams = new URLSearchParams({ url: endpoint.toString() })
+    let fullProxyEndpointWithParams = proxyURL.toString() + "?" + proxySearchParams.toString()
+
 
     return $.ajax({
-        url: endpoint,
-        dataType: 'json',
-        headers: { "PRIVATE-TOKEN": token },
+        url: fullProxyEndpointWithParams,
+        method: "GET",
+        timeout: 0,
+        error: function(error, status, errorThrown) { console.dir({error, status, errorThrown}) },
     }).done(callback)
 }