Index: src/routes/activitypub.js
===================================================================
--- src/routes/activitypub.js	(revision 30271e652b4f48014f6853585c1628a8ee02f3c8)
+++ src/routes/activitypub.js	(revision 75bda38ace3a3eff7e9ea9d7676a2ad33a8ad24c)
@@ -6,4 +6,5 @@
  *   GET /ap/users/:slug/outbox     OrderedCollection of Create(Note)
  *   GET /ap/users/:slug/followers  count-only OrderedCollection
+ *   GET /ap/users/:slug/featured   pinned posts (Mastodon "Featured" tab)
  *   GET /ap/notes/:id              a single Note
  *   POST /ap/users/:slug/inbox, /ap/inbox  → 202 (Follow/Accept + signature verify: next step)
@@ -72,4 +73,17 @@
 });
 
+// ── Featured (pinned posts → Mastodon "Featured" tab) ─────────────
+router.get('/ap/users/:slug/featured', (req, res) => {
+  const site = publicSite(req.params.slug);
+  if (!site) return res.status(404).end();
+  const posts = db.prepare(
+    `SELECT id, slug, title, content, cover_image_url, published_at, created_at
+     FROM posts WHERE site_id = ? AND status = 'published' AND (fan_only IS NULL OR fan_only = 0)
+       AND pinned IS NOT NULL AND pinned > 0
+     ORDER BY pinned ASC, COALESCE(published_at, created_at) DESC LIMIT 20`
+  ).all(site.id);
+  AP.sendAP(res, AP.buildFeatured(baseUrl(req), site, posts));
+});
+
 // ── Note ──────────────────────────────────────────────────────────
 router.get('/ap/notes/:id', (req, res) => {
