diff --git a/package-lock.json b/package-lock.json
index ea3c539c9..353e0ab65 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
         "@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
         "@primer/octicons": "18.2.0",
         "@vue/compiler-sfc": "3.2.47",
+        "@webcomponents/custom-elements": "1.5.1",
         "add-asset-webpack-plugin": "2.0.1",
         "ansi-to-html": "0.7.2",
         "asciinema-player": "3.2.0",
@@ -1915,6 +1916,11 @@
         "@xtuc/long": "4.2.2"
       }
     },
+    "node_modules/@webcomponents/custom-elements": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.5.1.tgz",
+      "integrity": "sha512-6T/XT3S1UHDlRWFSxRXdeSoYWczEl78sygNPS7jDyHVrfZcF/pUtWGYgxF4uviH59iPVw1eOWbhubm8CqO0MpA=="
+    },
     "node_modules/@webpack-cli/configtest": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz",
diff --git a/package.json b/package.json
index 9ff4ac278..db7cf1154 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
     "@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
     "@primer/octicons": "18.2.0",
     "@vue/compiler-sfc": "3.2.47",
+    "@webcomponents/custom-elements": "1.5.1",
     "add-asset-webpack-plugin": "2.0.1",
     "ansi-to-html": "0.7.2",
     "asciinema-player": "3.2.0",
diff --git a/web_src/js/webcomponents/GiteaOriginUrl.js b/web_src/js/webcomponents/GiteaOriginUrl.js
index 47fd13bfc..c8736ac5c 100644
--- a/web_src/js/webcomponents/GiteaOriginUrl.js
+++ b/web_src/js/webcomponents/GiteaOriginUrl.js
@@ -1,3 +1,5 @@
+import '@webcomponents/custom-elements'; // automatically adds custom elements for older browsers that don't support it
+
 // this is a Gitea's private HTML component, it converts an absolute or relative URL to an absolute URL with the current origin
 window.customElements.define('gitea-origin-url', class extends HTMLElement {
   connectedCallback() {