Index: src/services/CircleService.js
===================================================================
--- src/services/CircleService.js	(revision 62b899d95ceecddb71c476a3a1f292529c006d92)
+++ src/services/CircleService.js	(revision 221a2097e364410e12aa34d7c668aab224bd16b4)
@@ -29,4 +29,14 @@
 function baseOf(remoteUrl) {
   return String(remoteUrl).replace(/\/+$/, '');
+}
+
+// AS Hashtag-array -> comma-separated tagnamen (zonder #), gesanitized.
+function extractTags(tag) {
+  if (!Array.isArray(tag)) return null;
+  const names = tag
+    .map((t) => String((t && t.name) || '').replace(/^#/, '').trim())
+    .filter(Boolean)
+    .slice(0, 12);
+  return names.length ? names.join(', ') : null;
 }
 
@@ -83,9 +93,10 @@
     `),
     upsertPost: db.prepare(`
-      INSERT INTO remote_posts (id, actor_id, published, title, summary, url, media_json, raw_json, fetched_at)
-      VALUES (@id, @actor_id, @published, @title, @summary, @url, @media_json, @raw_json, CURRENT_TIMESTAMP)
+      INSERT INTO remote_posts (id, actor_id, published, title, summary, url, media_json, tags, raw_json, fetched_at)
+      VALUES (@id, @actor_id, @published, @title, @summary, @url, @media_json, @tags, @raw_json, CURRENT_TIMESTAMP)
       ON CONFLICT(id) DO UPDATE SET
         published=excluded.published, title=excluded.title, summary=excluded.summary,
-        url=excluded.url, media_json=excluded.media_json, raw_json=excluded.raw_json, fetched_at=CURRENT_TIMESTAMP
+        url=excluded.url, media_json=excluded.media_json, tags=excluded.tags,
+        raw_json=excluded.raw_json, fetched_at=CURRENT_TIMESTAMP
     `),
   };
@@ -169,4 +180,5 @@
       url: obj.url || obj.id,
       media_json: media.length ? JSON.stringify(media) : null,
+      tags: extractTags(obj.tag),
       raw_json: JSON.stringify(obj).slice(0, 20000),
     });
