Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision f7d142fd84f4cfd1fcf99b1ca2ac8620ef8159f2)
+++ src/views/shell.ejs	(revision 1ff004363790da4fd47e4c572ebaa3bb8663d228)
@@ -42,8 +42,10 @@
 }
 
-// ── Canonical URL (only when we have one configured) ─────────────
+// ── Canonical URL: per-site override (admin SEO), else the .env base
+//    (PUBLIC_BASE_URL, via ogOrigin → falls back to the request host) ──
 let _canonical = null;
-if (safeSite.canonical) {
-  const _base = safeSite.canonical.replace(/\/+$/, '');
+const _canonBase = safeSite.canonical || (typeof ogOrigin !== 'undefined' ? ogOrigin : '');
+if (_canonBase) {
+  const _base = _canonBase.replace(/\/+$/, '');
   let _path = '/';
   if (typeof post !== 'undefined' && post && post.slug) _path = '/' + post.slug;
