diff --git a/sites/40k-rankings/.gitignore b/sites/40k-rankings/.gitignore
index 800a23d..573ecc5 100644
--- a/sites/40k-rankings/.gitignore
+++ b/sites/40k-rankings/.gitignore
@@ -3,5 +3,3 @@ dist/
.env
.env.local
-# generated from shared/header.template.html — see scripts/render-header.mjs
-public/header.html
diff --git a/sites/40k-rankings/public/header.html b/sites/40k-rankings/public/header.html
new file mode 100644
index 0000000..ff6ea8d
--- /dev/null
+++ b/sites/40k-rankings/public/header.html
@@ -0,0 +1,59 @@
+
diff --git a/sites/40k-rankings/src/style.css b/sites/40k-rankings/src/style.css
index 4c1b0c2..d34322b 100644
--- a/sites/40k-rankings/src/style.css
+++ b/sites/40k-rankings/src/style.css
@@ -1,2 +1,7 @@
@import "tailwindcss";
@plugin "daisyui";
+
+/* header.html is generated (gitignored) — Tailwind's automatic content
+ detection skips gitignored files, so name it explicitly or its classes
+ get purged from the build. */
+@source "../public/header.html";
diff --git a/sites/aos-rankings/.gitignore b/sites/aos-rankings/.gitignore
index 800a23d..573ecc5 100644
--- a/sites/aos-rankings/.gitignore
+++ b/sites/aos-rankings/.gitignore
@@ -3,5 +3,3 @@ dist/
.env
.env.local
-# generated from shared/header.template.html — see scripts/render-header.mjs
-public/header.html
diff --git a/sites/aos-rankings/public/header.html b/sites/aos-rankings/public/header.html
new file mode 100644
index 0000000..983cf7b
--- /dev/null
+++ b/sites/aos-rankings/public/header.html
@@ -0,0 +1,59 @@
+
diff --git a/sites/aos-rankings/src/style.css b/sites/aos-rankings/src/style.css
index 4c1b0c2..d34322b 100644
--- a/sites/aos-rankings/src/style.css
+++ b/sites/aos-rankings/src/style.css
@@ -1,2 +1,7 @@
@import "tailwindcss";
@plugin "daisyui";
+
+/* header.html is generated (gitignored) — Tailwind's automatic content
+ detection skips gitignored files, so name it explicitly or its classes
+ get purged from the build. */
+@source "../public/header.html";
diff --git a/sites/kingmaker/.gitignore b/sites/kingmaker/.gitignore
index 800a23d..573ecc5 100644
--- a/sites/kingmaker/.gitignore
+++ b/sites/kingmaker/.gitignore
@@ -3,5 +3,3 @@ dist/
.env
.env.local
-# generated from shared/header.template.html — see scripts/render-header.mjs
-public/header.html
diff --git a/sites/kingmaker/public/header.html b/sites/kingmaker/public/header.html
new file mode 100644
index 0000000..8bea7c7
--- /dev/null
+++ b/sites/kingmaker/public/header.html
@@ -0,0 +1,63 @@
+
diff --git a/sites/kingmaker/src/style.css b/sites/kingmaker/src/style.css
index 4c1b0c2..d34322b 100644
--- a/sites/kingmaker/src/style.css
+++ b/sites/kingmaker/src/style.css
@@ -1,2 +1,7 @@
@import "tailwindcss";
@plugin "daisyui";
+
+/* header.html is generated (gitignored) — Tailwind's automatic content
+ detection skips gitignored files, so name it explicitly or its classes
+ get purged from the build. */
+@source "../public/header.html";
diff --git a/sites/scouting/.gitignore b/sites/scouting/.gitignore
index 4fcdf22..d4e0534 100644
--- a/sites/scouting/.gitignore
+++ b/sites/scouting/.gitignore
@@ -4,5 +4,3 @@ dist/
.env.local
.claude/settings.local.json
-# generated from shared/header.template.html — see scripts/render-header.mjs
-public/header.html
diff --git a/sites/scouting/public/header.html b/sites/scouting/public/header.html
new file mode 100644
index 0000000..c4923b7
--- /dev/null
+++ b/sites/scouting/public/header.html
@@ -0,0 +1,57 @@
+
diff --git a/sites/scouting/src/style.css b/sites/scouting/src/style.css
index d9825ce..e571a9e 100644
--- a/sites/scouting/src/style.css
+++ b/sites/scouting/src/style.css
@@ -1,6 +1,11 @@
@import "tailwindcss";
@plugin "daisyui";
+/* header.html is generated (gitignored) — Tailwind's automatic content
+ detection skips gitignored files, so name it explicitly or its classes
+ get purged from the build. */
+@source "../public/header.html";
+
/* Data-viz accent (sequential blue, single hue) — dataviz skill palette, blue slot */
:root[data-theme="dark"] { --viz-accent: #3987e5; }
:root[data-theme="light"] { --viz-accent: #2a78d6; }