Index: src/middleware/render.js
===================================================================
--- src/middleware/render.js	(revision baa2e5942737a6a3adc9bfa93e39e461e0b842a5)
+++ src/middleware/render.js	(revision 00d54bc60781bf561ef19b34dcaec116856374d1)
@@ -95,6 +95,11 @@
 
     if (isPartial) {
-      // HTMX: just send the content. Set HX-Trigger for body class swap
-      res.setHeader('HX-Trigger-After-Settle', JSON.stringify({
+      // HTMX: just send the content. Set HX-Trigger for body class swap.
+      // HTTP-header values are Latin-1 only — a title with an em-dash, smart
+      // quote or emoji (e.g. "Welkom — gebouwd met Klonkt") would make
+      // setHeader throw ERR_INVALID_CHAR and 500 the partial, so the card
+      // looks "unclickable". Escape any non-ASCII to \uXXXX: the header stays
+      // ASCII-safe and remains valid JSON that htmx parses back unchanged.
+      const triggerJson = JSON.stringify({
         pcmsNav: { bodyClass: locals.bodyClass },
         pcmsPostSwap: data.post ? {
@@ -103,5 +108,6 @@
           pageTitle: locals.pageTitle,
         } : null,
-      }));
+      }).replace(/[-￿]/g, (ch) => '\\u' + ch.charCodeAt(0).toString(16).padStart(4, '0'));
+      res.setHeader('HX-Trigger-After-Settle', triggerJson);
       return res.send(pageContent);
     }
