diff --git a/LOGO/M2_SCOUT.ico b/LOGO/M2_SCOUT.ico
index 74fc3c2..a0343fd 100644
Binary files a/LOGO/M2_SCOUT.ico and b/LOGO/M2_SCOUT.ico differ
diff --git a/LOGO/M2_SCOUT.png b/LOGO/M2_SCOUT.png
new file mode 100644
index 0000000..19be31e
Binary files /dev/null and b/LOGO/M2_SCOUT.png differ
diff --git a/LOGO/M2_SCOUT.svg b/LOGO/M2_SCOUT.svg
new file mode 100644
index 0000000..89aa32c
--- /dev/null
+++ b/LOGO/M2_SCOUT.svg
@@ -0,0 +1,3 @@
+
diff --git a/scripts/build_logo.py b/scripts/build_logo.py
new file mode 100644
index 0000000..a877698
--- /dev/null
+++ b/scripts/build_logo.py
@@ -0,0 +1,183 @@
+#!/usr/bin/env python3
+"""
+M2_SCOUT - logo builder.
+
+Single source of truth for the M2 brand mark. Extracts the exact M2 logo path
+from src/renderer/index.html (the in-app `gh-icon` SVG), renders it in the brand
+green, and regenerates every logo asset so they stay pixel-consistent:
+
+ LOGO/M2_SCOUT.svg - vector source (green fill)
+ LOGO/M2_SCOUT.png - 256px preview
+ LOGO/M2_SCOUT.ico - multi-size Windows icon (16..256)
+
+Dependency-free apart from Pillow (already available). The compound path uses
+the SVG even-odd fill rule (ring + monogram holes), reproduced here by XOR-ing
+each sub-path's filled mask.
+
+Usage: python scripts/build_logo.py [#RRGGBB]
+"""
+
+import os
+import re
+import sys
+
+from PIL import Image, ImageDraw
+
+# Brand green - the one place the logo color is defined.
+BRAND_GREEN = "#16A34A"
+
+ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+INDEX_HTML = os.path.join(ROOT, "src", "renderer", "index.html")
+LOGO_DIR = os.path.join(ROOT, "LOGO")
+
+VIEWBOX = 1024 # source viewBox is 0 0 1024 1024
+SUPERSAMPLE = 4 # render at 4x then downsample for anti-aliasing
+ICO_SIZES = [16, 32, 48, 64, 128, 256]
+BEZIER_STEPS = 36 # flattening resolution for cubic segments
+
+
+def extract_path_d():
+ """Pull the d="..." of the gh-icon M2 logo out of index.html."""
+ with open(INDEX_HTML, "r", encoding="utf-8") as fh:
+ html = fh.read()
+ m = re.search(r'