Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 74d61e6159ea68f2b2b02a0b15a6f8c9746246fb)
+++ src/services/ActivityPubService.js	(revision 837fc9c1dc50db6b6a042e84da63ed9989edf2fa)
@@ -246,5 +246,9 @@
     tag: Array.isArray(post.tags) ? post.tags.map((t) => ({ type: 'Hashtag', name: '#' + String(t).replace(/\s+/g, '') })) : [],
     replies: `${id}/replies`,
+    // NSFW → Mastodon-style content warning: sensitive (blurs media) + a summary/spoiler
+    // (hides the whole post behind a "Gevoelige inhoud" button until the reader opens it).
+    sensitive: !!post.nsfw,
   };
+  if (post.nsfw) note.summary = 'Gevoelige inhoud';
   if (attachment.length) note.attachment = attachment;
   // Playable-audio posts suppress the cover attachment (player card). Still expose
@@ -771,5 +775,5 @@
   if (!site) return;
   const recent = db.prepare(
-    `SELECT id, slug, title, content, cover_image_url, published_at, created_at
+    `SELECT id, slug, title, content, cover_image_url, nsfw, published_at, created_at
      FROM posts WHERE site_id = ? AND status = 'published' AND (fan_only IS NULL OR fan_only = 0)
      ORDER BY COALESCE(published_at, created_at) DESC LIMIT 20`
