Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision e00c0e9397ee0864f97459b36a39ff5ad86a9e41)
+++ src/services/ActivityPubService.js	(revision 2abd3d2298692016e4857691d7085d151fbe9727)
@@ -660,4 +660,19 @@
 // ── HTTP Signatures + delivery ────────────────────────────────────
 const slugFromActorUrl = (url) => { const m = String(url || '').match(/\/ap\/users\/([^/?#]+)/); return m ? decodeURIComponent(m[1]) : null; };
+// Which of OUR sites are named in a note's Mention tags? Only hrefs on our own base count
+// (an /ap/users/<slug> path on a remote host is someone else's actor), and the slug must be
+// an existing site. Deduped.
+export function localMentionSlugs(tags, base) {
+  if (!base) return [];
+  const out = [], seen = new Set();
+  for (const t of (Array.isArray(tags) ? tags : (tags ? [tags] : []))) {
+    if (!t || t.type !== 'Mention' || typeof t.href !== 'string') continue;
+    if (!t.href.startsWith(base + '/ap/users/')) continue;
+    const slug = slugFromActorUrl(t.href);
+    if (!slug || seen.has(slug)) continue; seen.add(slug);
+    try { if (db.prepare('SELECT 1 FROM sites WHERE slug = ?').get(slug)) out.push(slug); } catch { /* ignore */ }
+  }
+  return out;
+}
 
 // Sign + POST an activity to a remote inbox (draft-cavage HTTP Signatures, RSA-SHA256).
@@ -1073,4 +1088,22 @@
         }
         console.log('[AP] timeline +', actorUri, 'x' + subs.length);
+      }
+    }
+    // Mentioned in a post that is NOT a reply to our content (a reply to us already returned
+    // above): store a mention notification for each of our actors named in the Mention tags.
+    // Requires our own base prefix on the tag href — /ap/users/<slug> on a REMOTE host is
+    // someone else's actor, not ours.
+    if (actorUri && !isLocalActor && o.id) {
+      const slugs = localMentionSlugs(o.tag, base);
+      if (slugs.length) {
+        const ai = actorInfo(await resolveActor(actorUri), actorUri);
+        const html = HtmlSanitizerService.sanitize(o.content || '');
+        for (const slug of slugs) {
+          try {
+            const r = db.prepare('INSERT OR IGNORE INTO ap_mentions (slug, object_uri, note_url, actor_uri, actor_name, actor_handle, actor_icon, actor_url, content, published, created_at) VALUES (?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP)')
+              .run(slug, o.id, safeUrl(o.url) || null, actorUri, ai.name, ai.handle, ai.icon, ai.url, html, o.published || null);
+            if (r.changes) console.log('[AP] mention', actorUri, '→', slug);
+          } catch { /* ignore */ }
+        }
       }
     }
@@ -2161,4 +2194,9 @@
     }
   } catch { /* ignore */ }
+  try {
+    for (const r of db.prepare('SELECT object_uri, note_url, actor_uri, actor_name, actor_handle, actor_icon, actor_url, content, created_at FROM ap_mentions WHERE slug = ? ORDER BY created_at DESC LIMIT 50').all(slug)) {
+      out.push({ type: 'mention', name: r.actor_name, handle: r.actor_handle, url: r.actor_url || r.actor_uri, icon: r.actor_icon, content: stripLeadingMentions(r.content), note_url: r.note_url || r.object_uri, created_at: r.created_at });
+    }
+  } catch { /* ignore */ }
   out.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
   return out.slice(0, limit || 60);
@@ -2335,5 +2373,5 @@
   listOutbox, deliverOutboxDelete, deliverOutboxUpdate,
   webfingerResolve, followActor, resolveRemoteActor, unfollowActor, listFollowing, setAutoBoost, backfillFromOutbox, getTimeline, sendInteraction, voteOnPoll, voteOnRemotePoll,
-  parseOwnPoll, pollTally, ownPollView, deliverPollUpdate, maybeCrawlThread, sendReport,
+  parseOwnPoll, pollTally, ownPollView, deliverPollUpdate, maybeCrawlThread, sendReport, localMentionSlugs,
   autoBoostCount, boostedCount, markBoosted, unmarkBoosted, markLiked, unmarkLiked, getTimelineReaction, upsertBoostedNote, getCirkelPosts, getCirkelMembers, selfHealTimeline,
   getNotifications, listBlocks, isBlockedAny, blockTarget, unblock,
