Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 2d6a9c360f54275fa0b6256c64c88bf2d5782554)
+++ src/config/database.js	(revision 3778ddb5c7b7cd65a19638dca0cc1627dab0cac6)
@@ -392,4 +392,10 @@
   // re-rendering. NULL on old posts → the render route bakes on the fly as a fallback.
   ensureColumn('posts', 'content_rendered', 'TEXT');
+
+  // AP addressing of an incoming interaction: 'public' | 'unlisted' | 'followers' | 'direct',
+  // derived from the note's to/cc at ingest. The public post page only renders public/unlisted
+  // replies; followers/direct replies surface in notifications (and later Messages) with post
+  // context instead. Existing rows default to 'public' (historically almost all were).
+  ensureColumn('ap_interactions', 'visibility', "TEXT DEFAULT 'public'");
 }
 
