Index: src/middleware/render.js
===================================================================
--- src/middleware/render.js	(revision ee25d450dda38c74ecd9e4a566f87a1c2ab76ecd)
+++ src/middleware/render.js	(revision a3e2f171273617e2d577da3625856ee33bd223fd)
@@ -113,6 +113,13 @@
       // looks "unclickable". Escape any non-ASCII to \uXXXX: the header stays
       // ASCII-safe and remains valid JSON that htmx parses back unchanged.
+      // Per-site accent + palette zitten in de shell-<head> (style#pcms-site-accent
+      // + html[data-palette]) en worden NIET mee-geswapt bij htmx-nav. Stuur ze mee
+      // zodat de client ze bijwerkt — anders erft een artiest de kleuren van de
+      // vorige pagina (bv. hub-paars i.p.v. eigen groen). Zelfde afleiding als shell.ejs.
+      const _navAccent = (_site && _site.accent && /^#[0-9a-fA-F]{6}$/.test(_site.accent))
+        ? _site.accent : '#c2410c';
+      const _navPalette = (_site && _site.palette) ? _site.palette : 'sage';
       const triggerJson = JSON.stringify({
-        pcmsNav: { bodyClass: locals.bodyClass },
+        pcmsNav: { bodyClass: locals.bodyClass, accent: _navAccent, palette: _navPalette },
         pcmsPostSwap: data.post ? {
           title: data.post.title,
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision ee25d450dda38c74ecd9e4a566f87a1c2ab76ecd)
+++ src/views/shell.ejs	(revision a3e2f171273617e2d577da3625856ee33bd223fd)
@@ -330,5 +330,21 @@
 
   document.body.addEventListener('pcmsNav', function(ev) {
-    var next = ev.detail && ev.detail.bodyClass;
+    var d = ev.detail || {};
+    // Per-site accent + palette bijwerken (head wordt niet mee-geswapt bij htmx-nav,
+    // dus zonder dit erft een artiest de kleuren van de vorige pagina).
+    if (d.accent && /^#[0-9a-fA-F]{6}$/.test(d.accent)) {
+      var sa = document.getElementById('pcms-site-accent');
+      if (sa) {
+        sa.textContent =
+          ':root,[data-palette]{--accent:' + d.accent +
+          ';--accent-soft:color-mix(in srgb,' + d.accent + ' 80%,white)' +
+          ';--accent-tint:color-mix(in srgb,' + d.accent + ' 12%,transparent);}';
+      }
+    }
+    if (d.palette && /^[a-z0-9-]+$/i.test(d.palette)) {
+      document.documentElement.setAttribute('data-palette', d.palette);
+    }
+
+    var next = d.bodyClass;
     if (!next) return;
     // Server may send a multi-class string ("on-post extra"). Only the first
