Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 92a2c4643b82e26c44f79b8ad0f7aa15ec0ece34)
+++ src/routes/posts.js	(revision c867b7b644ca4de55b3a9138e1951f420cfc1d31)
@@ -722,12 +722,18 @@
 
 // Manage / delete your own outbound fediverse replies (site owner only).
-router.get('/fediverse', requireSiteManager, (req, res) => {
-  const site = res.locals.site;
-  const items = site ? ActivityPubService.listOutbox(site.slug) : [];
-  renderPage(req, res, 'pages/authorize-interaction', {
-    pageTitleKey: 'fedi.manage_title', bodyClass: 'on-special', // i18n: was hardcoded Dutch
-    manage: items, uri: '', target: null, sent: false, siteTitle: site ? site.title : '',
+// Messages = Reacties + Meldingen in ONE inbox (your sent replies join the stream).
+// The old /fediverse (manage) and /notifications pages redirect here.
+router.get('/messages', requireSiteManager, (req, res) => {
+  const site = res.locals.site;
+  const items = site ? ActivityPubService.getMessages(site.slug, 80) : [];
+  // Read the watermark BEFORE marking seen → unread dots on items newer than last visit.
+  const seenAt = site ? ActivityPubService.notificationsSeenAt(site.slug) : 0;
+  if (site && !isViewer(req.session.user)) ActivityPubService.markNotificationsSeen(site.slug);
+  renderPage(req, res, 'pages/messages', {
+    pageTitleKey: 'msg.title', bodyClass: 'on-special', items, seenAt,
+    success: req.query.success || null, error: req.query.error || null,
   });
 });
+router.get('/fediverse', requireSiteManager, (req, res) => res.redirect(`${res.locals.siteUrlBase || ''}/messages`));
 
 router.post('/fediverse/:id/delete', requireSiteManager, async (req, res) => {
@@ -963,12 +969,5 @@
 
 // Notifications inbox (new followers + replies/likes/boosts on your posts).
-router.get('/notifications', requireSiteManager, (req, res) => {
-  const site = res.locals.site;
-  const items = site ? ActivityPubService.getNotifications(site.slug, 80) : [];
-  // viewing = seen → clears the bell badge. A viewer (kijker) may look but must not
-  // mutate state (the global write-guard only catches non-GET, not this GET-side effect).
-  if (site && !isViewer(req.session.user)) ActivityPubService.markNotificationsSeen(site.slug);
-  renderPage(req, res, 'pages/fedi-notifications', { pageTitle: 'Meldingen', bodyClass: 'on-special', items });
-});
+router.get('/notifications', requireSiteManager, (req, res) => res.redirect(`${res.locals.siteUrlBase || ''}/messages`));
 
 // Blocking / defederation (owner-only).
