Index: src/middleware/render.js
===================================================================
--- src/middleware/render.js	(revision 5e61b173e0211ca213200be10da0a4230dcc31cf)
+++ src/middleware/render.js	(revision 421c2d47017ae2891db2b8d62542cca09cf3c4ae)
@@ -31,15 +31,17 @@
 } catch { /* geen versie beschikbaar */ }
 
+// Site-tijdzone (Beheer → Instellingen). Leeg = server-default (UTC). Wordt
+// toegepast op álle server-side geformatteerde datums zodat ze in de zone van
+// de site staan i.p.v. UTC.
+const siteTimezone = () => getSetting('timezone') || undefined;
+
 const formatDate = (iso) => {
   if (!iso) return '';
-  const d = new Date(iso);
-  const months = ['januari','februari','maart','april','mei','juni','juli','augustus','september','oktober','november','december'];
-  return `${d.getDate()} ${months[d.getMonth()]} ${d.getFullYear()}`;
+  return new Date(iso).toLocaleDateString('nl-NL', { timeZone: siteTimezone(), day: 'numeric', month: 'long', year: 'numeric' });
 };
 
 const formatDateTime = (iso) => {
   if (!iso) return '';
-  const d = new Date(iso);
-  return d.toLocaleString('nl-NL', { dateStyle: 'medium', timeStyle: 'short' });
+  return new Date(iso).toLocaleString('nl-NL', { timeZone: siteTimezone(), dateStyle: 'medium', timeStyle: 'short' });
 };
 
@@ -91,4 +93,5 @@
     t: (key, vars) => i18nT(_lang, key, vars),
     langs: LANGS.map((c) => ({ code: c, name: LANG_NAMES[c], active: c === _lang })),
+    timezone: getSetting('timezone') || '',
     userOwnsSite,
     canSeeBeheer,
