Index: src/services/ThumbnailService.js
===================================================================
--- src/services/ThumbnailService.js	(revision 041a0df519c3282550fe587c0067c34023f20696)
+++ src/services/ThumbnailService.js	(revision 492fc204b05b272676483f357af4e0478fc8e01b)
@@ -23,6 +23,7 @@
 const execFileP = promisify(execFile);
 
-// Allowed widths (whitelist → no arbitrary-size abuse). 128 = avatars; 480 ≈ 2× a grid tile.
-export const THUMB_SIZES = new Set([128, 320, 480, 640]);
+// Allowed widths (whitelist → no arbitrary-size abuse). 128 = avatars; 256 ≈ 2× a list
+// cover; 480 ≈ 2× a grid tile. Keep these ~2× the display size so line-art stays crisp.
+export const THUMB_SIZES = new Set([128, 256, 320, 480, 640]);
 
 let _seq = 0;
Index: src/views/partials/post-card.ejs
===================================================================
--- src/views/partials/post-card.ejs	(revision 041a0df519c3282550fe587c0067c34023f20696)
+++ src/views/partials/post-card.ejs	(revision 492fc204b05b272676483f357af4e0478fc8e01b)
@@ -49,5 +49,5 @@
        <% if (_ext) { %>target="_blank" rel="noopener"<% } else { %>hx-get="<%= _href %>?partial=1" hx-target="#pcms-main" hx-swap="innerHTML" hx-push-url="<%= _href %>" hx-indicator="#pcms-loading"<% } %>
        aria-label="<%= post.title || '(zonder titel)' %>" tabindex="-1">
-      <img src="<%= thumb(post.cover_image_url, 320) %>" alt="" loading="lazy" decoding="async">
+      <img src="<%= thumb(post.cover_image_url, 256) %>" alt="" loading="lazy" decoding="async">
       <% if (post.nsfw) { %><span class="nsfw-veil"><span class="nsfw-veil-label">🔞 <%= post.content_warning || t('post.nsfw_warning') %></span><span class="nsfw-veil-btn"><%= t('post.nsfw_show') %></span></span><% } %>
     </a>
