Index: src/routes/activitypub.js
===================================================================
--- src/routes/activitypub.js	(revision de89079d54feaf1fd4748e90006fb3a84ebbc096)
+++ src/routes/activitypub.js	(revision fc404105536bc9fcadc1fdb7dceb0449fee77e98)
@@ -145,4 +145,10 @@
   if (!auth || auth.site.slug !== req.params.slug) return res.status(403).end();
   const base = baseUrl(req);
+  // Gated feature (FEP-633c): may this account see EXTERNAL embeds? A ward's
+  // world outside the fediverse is the guardians' call. The gate is applied
+  // here, at serialisation: a blocked embed is never sent, because an embed the
+  // client merely hides has still been delivered to the device.
+  const isWard = (() => { try { return Guardianship.listGuardians(auth.site.slug).length > 0; } catch { return false; } })();
+  const embedsAllowed = Guardianship.externalEmbedsAllowed(auth.site.external_embeds, isWard);
   const items = AP.getTimeline(auth.site.slug, 60).map((t) => ({
     id: `${t.id}#create`,
@@ -195,4 +201,7 @@
       'shaer:liked': !!t.liked,
       'shaer:boosted': !!t.boosted,
+      // An external (non-fediverse) embed, thumbnail-only and never an iframe.
+      // Omitted entirely when the gate is closed (see above).
+      'shaer:embed': embedsAllowed ? AP.timelineEmbed(t.embed_json) : undefined,
     },
   }));
