Index: src/routes/circle.js
===================================================================
--- src/routes/circle.js	(revision 69b509deb1cd2e740430a5032713f538d22e90d9)
+++ src/routes/circle.js	(revision 462a931950d40335f90f98364e56eb5eda17c6a2)
@@ -31,5 +31,12 @@
   if (!site || !apEnabled() || (ActivityPubService.autoBoostCount(site.slug) === 0 && ActivityPubService.boostedCount(site.slug) === 0)) return next();
 
-  const posts = ActivityPubService.getCirkelPosts(site.slug, 80).map((r) => {
+  const members = ActivityPubService.getCirkelMembers(site.slug);
+  // Optional ?actor=<uri> → show only that member's posts. Only honour a uri that is
+  // actually a featured member (so it can't be used to probe arbitrary timeline rows).
+  const reqActor = safeUrl(req.query.actor);
+  const activeMember = reqActor ? members.find((m) => m.actor_uri === reqActor) : null;
+  const activeActor = activeMember ? activeMember.actor_uri : null;
+
+  const posts = ActivityPubService.getCirkelPosts(site.slug, 80, activeActor).map((r) => {
     const text = htmlToText(r.content);
     // Show ONLY the title (the bold first line a Klonkt note carries), not the whole
@@ -61,8 +68,13 @@
   });
 
-  const sites = ActivityPubService.getCirkelMembers(site.slug)
-    .map((s) => ({ name: s.name || 'Onbekend', url: safeUrl(s.url), avatar: safeUrl(s.icon) }));
+  const sites = members.map((s) => ({
+    name: s.name || 'Onbekend', url: safeUrl(s.url), avatar: safeUrl(s.icon),
+    actor_uri: s.actor_uri, active: !!(activeActor && s.actor_uri === activeActor),
+  }));
 
-  renderPage(req, res, 'pages/circle-feed', { pageTitle: 'Cirkel', bodyClass: 'on-cirkel', posts, sites });
+  renderPage(req, res, 'pages/circle-feed', {
+    pageTitle: 'Cirkel', bodyClass: 'on-cirkel', posts, sites,
+    activeActor, activeName: activeMember ? (activeMember.name || '') : '',
+  });
 });
 
