diff --git a/pio-scripts/set_metadata.py b/pio-scripts/set_metadata.py
new file mode 100644
index 0000000000..e023400528
--- /dev/null
+++ b/pio-scripts/set_metadata.py
@@ -0,0 +1,121 @@
+Import('env')
+import subprocess
+import json
+import re
+
+def get_github_repo():
+ """Extract GitHub repository name from git remote URL.
+
+ Uses the remote that the current branch tracks, falling back to 'origin'.
+ This handles cases where repositories have multiple remotes or where the
+ main remote is not named 'origin'.
+
+ Returns:
+ str: Repository name in 'owner/repo' format for GitHub repos,
+ 'unknown' for non-GitHub repos, missing git CLI, or any errors.
+ """
+ try:
+ remote_name = 'origin' # Default fallback
+
+ # Try to get the remote for the current branch
+ try:
+ # Get current branch name
+ branch_result = subprocess.run(['git', 'rev-parse', '--abbrev-ref', 'HEAD'],
+ capture_output=True, text=True, check=True)
+ current_branch = branch_result.stdout.strip()
+
+ # Get the remote for the current branch
+ remote_result = subprocess.run(['git', 'config', f'branch.{current_branch}.remote'],
+ capture_output=True, text=True, check=True)
+ tracked_remote = remote_result.stdout.strip()
+
+ # Use the tracked remote if we found one
+ if tracked_remote:
+ remote_name = tracked_remote
+ except subprocess.CalledProcessError:
+ # If branch config lookup fails, continue with 'origin' as fallback
+ pass
+
+ # Get the remote URL for the determined remote
+ result = subprocess.run(['git', 'remote', 'get-url', remote_name],
+ capture_output=True, text=True, check=True)
+ remote_url = result.stdout.strip()
+
+ # Check if it's a GitHub URL
+ if 'github.com' not in remote_url.lower():
+ return None
+
+ # Parse GitHub URL patterns:
+ # https://github.com/owner/repo.git
+ # git@github.com:owner/repo.git
+ # https://github.com/owner/repo
+
+ # Remove .git suffix if present
+ if remote_url.endswith('.git'):
+ remote_url = remote_url[:-4]
+
+ # Handle HTTPS URLs
+ https_match = re.search(r'github\.com/([^/]+/[^/]+)', remote_url, re.IGNORECASE)
+ if https_match:
+ return https_match.group(1)
+
+ # Handle SSH URLs
+ ssh_match = re.search(r'github\.com:([^/]+/[^/]+)', remote_url, re.IGNORECASE)
+ if ssh_match:
+ return ssh_match.group(1)
+
+ return None
+
+ except FileNotFoundError:
+ # Git CLI is not installed or not in PATH
+ return None
+ except subprocess.CalledProcessError:
+ # Git command failed (e.g., not a git repo, no remote, etc.)
+ return None
+ except Exception:
+ # Any other unexpected error
+ return None
+
+PACKAGE_FILE = "package.json"
+
+def get_version():
+ try:
+ with open(PACKAGE_FILE, "r") as package:
+ return json.load(package)["version"]
+ except (FileNotFoundError, KeyError, json.JSONDecodeError):
+ return None
+
+
+def has_def(cppdefs, name):
+ """ Returns true if a given name is set in a CPPDEFINES collection """
+ for f in cppdefs:
+ if isinstance(f, tuple):
+ f = f[0]
+ if f == name:
+ return True
+ return False
+
+
+def add_wled_metadata_flags(env, node):
+ cdefs = env["CPPDEFINES"].copy()
+
+ if not has_def(cdefs, "WLED_REPO"):
+ repo = get_github_repo()
+ if repo:
+ cdefs.append(("WLED_REPO", f"\\\"{repo}\\\""))
+
+ if not has_def(cdefs, "WLED_VERSION"):
+ version = get_version()
+ if version:
+ cdefs.append(("WLED_VERSION", version))
+
+ # This transforms the node in to a Builder; it cannot be modified again
+ return env.Object(
+ node,
+ CPPDEFINES=cdefs
+ )
+
+env.AddBuildMiddleware(
+ add_wled_metadata_flags,
+ "*/wled_metadata.cpp"
+)
diff --git a/pio-scripts/set_version.py b/pio-scripts/set_version.py
deleted file mode 100644
index 1d8e076ea8..0000000000
--- a/pio-scripts/set_version.py
+++ /dev/null
@@ -1,8 +0,0 @@
-Import('env')
-import json
-
-PACKAGE_FILE = "package.json"
-
-with open(PACKAGE_FILE, "r") as package:
- version = json.load(package)["version"]
- env.Append(BUILD_FLAGS=[f"-DWLED_VERSION={version}"])
diff --git a/platformio.ini b/platformio.ini
index e757490242..8bb38fece3 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -110,7 +110,7 @@ ldscript_4m1m = eagle.flash.4m1m.ld
[scripts_defaults]
extra_scripts =
- pre:pio-scripts/set_version.py
+ pre:pio-scripts/set_metadata.py
post:pio-scripts/output_bins.py
post:pio-scripts/strip-floats.py
pre:pio-scripts/user_config_copy.py
diff --git a/tools/cdata.js b/tools/cdata.js
index c5d3c6aa52..1381cd240f 100644
--- a/tools/cdata.js
+++ b/tools/cdata.js
@@ -370,12 +370,6 @@ const char PAGE_dmxmap[] PROGMEM = R"=====()=====";
name: "PAGE_update",
method: "gzip",
filter: "html-minify",
- mangle: (str) =>
- str
- .replace(
- /function GetV().*\<\/script\>/gms,
- ""
- )
},
{
file: "welcome.htm",
diff --git a/wled00/data/update.htm b/wled00/data/update.htm
index cb439c4e04..267f2b63bc 100644
--- a/wled00/data/update.htm
+++ b/wled00/data/update.htm
@@ -6,7 +6,26 @@