Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 69b509deb1cd2e740430a5032713f538d22e90d9)
+++ src/views/shell.ejs	(revision 61514f28dec43d6d1efec657bb1d390d306e7799)
@@ -73,4 +73,10 @@
   _socialImage = ogOrigin + '/og/' + encodeURIComponent(safeSite.slug) + '.png';
   _ogGenerated = true;
+}
+// og:image / twitter:image / JSON-LD image MUST be absolute (OGP spec). A post cover arrives as
+// a relative /media/... path; strict scrapers (WhatsApp/Signal/some fediverse clients) won't
+// resolve it against the page URL → no preview image. Absolutize against the canonical origin.
+if (_socialImage && _socialImage.charAt(0) === '/' && _socialImage.charAt(1) !== '/' && typeof ogOrigin !== 'undefined' && ogOrigin) {
+  _socialImage = ogOrigin + _socialImage;
 }
 const _ogType = isPostPage ? 'article' : 'website';
