Index: src/middleware/site.js
===================================================================
--- src/middleware/site.js	(revision 07de4643e4f06cd942b3afd21c09df855614ea4b)
+++ src/middleware/site.js	(revision 0a7ba905c05d6c28831160e9023b8c6d66787f6e)
@@ -110,9 +110,12 @@
   const site = res.locals.site;
   
-  // Priority: user setting > site setting > default
-  const palette = (user && PALETTES.includes(user.palette) ? user.palette : null)
-                || (site && PALETTES.includes(site.palette) ? site.palette : null)
+  // A site always renders in ITS OWN palette, regardless of who is viewing. There is
+  // no per-user palette UI (user.palette is vestigial/stale data from old migrations),
+  // and the htmx pcmsNav path (render.js) already uses the site palette only — so reading
+  // user.palette here made a full page load (owner logged in) flip to the viewer's stale
+  // palette while htmx-nav kept the site's, i.e. "palette changes on hard refresh".
+  const palette = (site && PALETTES.includes(site.palette) ? site.palette : null)
                 || 'klonkt';
-  
+
   res.locals.palette = palette;
   res.locals.theme = (user && ['dark','light'].includes(user.theme)) ? user.theme : 'dark';
