Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 640b39c77691f7bb8ddb40f536fc678f88b8df8d)
+++ src/config/database.js	(revision 25d4041f989e999fe4673b2c9ac3e03f874f5980)
@@ -106,4 +106,43 @@
   `);
   db.prepare("INSERT OR IGNORE INTO app_settings (key, value) VALUES ('tenancy', 'solo')").run();
+
+  // ── Cirkels (federatie) ─────────────────────────────────────
+  // Decentrale, asymmetrische verbindingen tussen solo-instances.
+  db.exec(`
+    CREATE TABLE IF NOT EXISTS circle_links (
+      id TEXT PRIMARY KEY,
+      local_site_id TEXT NOT NULL,
+      remote_url TEXT NOT NULL,
+      remote_actor_id TEXT,
+      label TEXT,
+      status TEXT DEFAULT 'active',
+      added_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+      last_synced DATETIME,
+      last_error TEXT,
+      UNIQUE(local_site_id, remote_url),
+      FOREIGN KEY (local_site_id) REFERENCES sites(id)
+    );
+    CREATE TABLE IF NOT EXISTS remote_actors (
+      id TEXT PRIMARY KEY,
+      url TEXT UNIQUE NOT NULL,
+      name TEXT,
+      summary TEXT,
+      avatar TEXT,
+      public_key TEXT NOT NULL,
+      fetched_at DATETIME DEFAULT CURRENT_TIMESTAMP
+    );
+    CREATE TABLE IF NOT EXISTS remote_posts (
+      id TEXT PRIMARY KEY,
+      actor_id TEXT NOT NULL,
+      published DATETIME,
+      title TEXT,
+      summary TEXT,
+      url TEXT,
+      media_json TEXT,
+      raw_json TEXT,
+      fetched_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+      FOREIGN KEY (actor_id) REFERENCES remote_actors(id)
+    );
+  `);
 }
 
