Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision c6cdce64569cbbd1a06b9525eb87dcc265db710c)
+++ src/routes/posts.js	(revision 0596945917047f2e8963b16e2ef73366d22a62e4)
@@ -946,5 +946,5 @@
   const candidates = isHub
     ? db.prepare(`
-        SELECT p.id, p.slug, p.title, p.cover_image_url, p.published_at, p.tags, s.slug AS site_slug
+        SELECT p.id, p.slug, p.title, p.cover_image_url, p.published_at, p.tags, p.nsfw, p.content_warning, s.slug AS site_slug
         FROM posts p JOIN sites s ON s.id = p.site_id
         WHERE p.status = 'published' AND p.id != ?
@@ -952,5 +952,5 @@
       `).all(post.id)
     : db.prepare(`
-        SELECT id, slug, title, cover_image_url, published_at, tags
+        SELECT id, slug, title, cover_image_url, published_at, tags, nsfw, content_warning
         FROM posts
         WHERE site_id = ? AND status = 'published' AND id != ?
Index: src/views/pages/post.ejs
===================================================================
--- src/views/pages/post.ejs	(revision c6cdce64569cbbd1a06b9525eb87dcc265db710c)
+++ src/views/pages/post.ejs	(revision 0596945917047f2e8963b16e2ef73366d22a62e4)
@@ -177,7 +177,7 @@
                hx-push-url="/<%= rp.slug %>" hx-indicator="#pcms-loading"<% } %>>
               <% if (rp.cover_image_url) { %>
-                <span class="post-related-cover"
+                <span class="post-related-cover<%= rp.nsfw ? ' nsfw-media' : '' %>"
                       style="background-image: url('<%= rp.cover_image_url %>')"
-                      aria-hidden="true"></span>
+                      aria-hidden="true"><% if (rp.nsfw) { %><span class="nsfw-veil"><span class="nsfw-veil-label">🔞 <%= rp.content_warning || t('post.nsfw_warning') %></span><span class="nsfw-veil-btn"><%= t('post.nsfw_show') %></span></span><% } %></span>
               <% } else { %>
                 <span class="post-related-cover post-related-cover--empty" aria-hidden="true"></span>
