Index: src/assets/css/style.css
===================================================================
--- src/assets/css/style.css	(revision 5f3f9ec002fdbf1dddd640956bd34915e10695df)
+++ src/assets/css/style.css	(revision 86fa2d2795c9ba37e01a9f0c0315a1ca031b645d)
@@ -2401,4 +2401,7 @@
 .grid-tile-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center; display: block; transition: opacity .4s ease; }
 .grid-tile-img.is-loading { opacity: 0; }
+/* A video cover keeps its own aspect ratio inside the square tile (centered, letterboxed) instead
+   of zoom-cropping a wide video to fill. Images stay object-fit:cover. */
+video.grid-tile-img { object-fit: contain; background: var(--paper-2, #0a0e1a); }
 .grid-tile:hover { transform: scale(0.98); }
 .grid-tile-overlay {
Index: src/views/partials/post-card.ejs
===================================================================
--- src/views/partials/post-card.ejs	(revision 5f3f9ec002fdbf1dddd640956bd34915e10695df)
+++ src/views/partials/post-card.ejs	(revision 86fa2d2795c9ba37e01a9f0c0315a1ca031b645d)
@@ -154,4 +154,6 @@
   }
   .post-list-cover img.is-loading { opacity: 0; }
+  /* A video cover keeps its aspect ratio (centered, letterboxed) in the square slot, not zoom-cropped. */
+  .post-list-cover video { object-fit: contain; background: var(--paper-2, #0a0e1a); }
 
   /* Re-apply rounded corners on slightly larger phones */
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 5f3f9ec002fdbf1dddd640956bd34915e10695df)
+++ src/views/shell.ejs	(revision 86fa2d2795c9ba37e01a9f0c0315a1ca031b645d)
@@ -216,5 +216,5 @@
 
 <!-- v9 stylesheet (full palette system) -->
-<link rel="stylesheet" href="/assets/css/style.css?v=64">
+<link rel="stylesheet" href="/assets/css/style.css?v=65">
 <script>
 /* iOS safe-area, built by hand. env(safe-area-inset-top) resolves to 0 on this iOS in
