Index: src/views/pages/news.ejs
===================================================================
--- src/views/pages/news.ejs	(revision a64d7051ecc17fc913a8a15fca76be421fbfd720)
+++ src/views/pages/news.ejs	(revision 600fbf32d8b88504151b06778e4a9069d2025672)
@@ -185,6 +185,12 @@
   /* Always show the FULL image at its natural ratio — never cropped, no letterbox. */
   .tl-media { display: flex; flex-direction: column; gap: .4rem; margin: .75rem 0 0; }
-  .tl-media-img { display: block; border-radius: 12px; overflow: hidden; background: #fff; }
-  .tl-media-img img { width: 100%; height: auto; display: block; }
+  .tl-media-img { display: block; border-radius: 12px; overflow: hidden;
+    background-image: linear-gradient(135deg,
+      color-mix(in srgb, var(--accent, #888) 22%, var(--paper-2, var(--paper))) 0%,
+      color-mix(in srgb, var(--accent, #888) 6%, var(--paper-2, var(--paper))) 100%); }
+  .tl-media-img img { width: 100%; height: auto; display: block; background: #fff; transition: opacity .4s ease; }
+  .tl-media-img img.is-loading { opacity: 0; }
+  /* Reserve placeholder space while the (natural-aspect) feed image loads. */
+  .tl-media-img:has(img.is-loading) { min-height: 220px; }
 
   .tl-media-video, .tl-media-audio { width: 100%; margin: .75rem 0 0; border-radius: 12px; display: block; }
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision a64d7051ecc17fc913a8a15fca76be421fbfd720)
+++ src/views/shell.ejs	(revision 600fbf32d8b88504151b06778e4a9069d2025672)
@@ -743,5 +743,5 @@
   if (window.__coverFadeWired) return; window.__coverFadeWired = true;
   function scan(root) {
-    (root || document).querySelectorAll('.grid-tile-img, .post-list-cover img').forEach(function (img) {
+    (root || document).querySelectorAll('.grid-tile-img, .post-list-cover img, .tl-media-img img').forEach(function (img) {
       if (img.dataset.fade) return; img.dataset.fade = '1';
       if (img.complete && img.naturalWidth > 0) return;   // already loaded → leave visible
