Index: src/routes/activitypub.js
===================================================================
--- src/routes/activitypub.js	(revision 75bda38ace3a3eff7e9ea9d7676a2ad33a8ad24c)
+++ src/routes/activitypub.js	(revision 2af2e693865d490de81cae42a6a49dc2f30d25dc)
@@ -77,9 +77,12 @@
   const site = publicSite(req.params.slug);
   if (!site) return res.status(404).end();
+  // NB: Mastodon DISPLAYS the featured collection in REVERSE (pins shown
+  // last-processed-first). So we emit it reversed (lowest pin priority first,
+  // rank 1 last) → Mastodon flips it back to pin-rank ascending on the profile.
   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`
+     ORDER BY pinned DESC, COALESCE(published_at, created_at) ASC LIMIT 20`
   ).all(site.id);
   AP.sendAP(res, AP.buildFeatured(baseUrl(req), site, posts));
