Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 6053c6cd26763e88d5f2f920fb1270ca5bea6b78)
+++ src/config/database.js	(revision 04031873473c62253ea8961f8fc5cd47159ac270)
@@ -87,4 +87,5 @@
   ensureColumn('posts', 'content_warning', 'TEXT');        // custom CW label (empty = default "Gevoelige inhoud")
   ensureColumn('posts', 'type',    "TEXT DEFAULT 'post'");  // post | foto | video | audio
+  ensureColumn('posts', 'poll_json', 'TEXT');              // a poll WE host → federates as AS2 Question: {multiple,options[{name}],endTime,closed}
 
   // Statistics (premium module) — bare counters, cookie-free.
@@ -331,4 +332,13 @@
     );
     CREATE INDEX IF NOT EXISTS idx_ap_delivery_due ON ap_delivery(next_at);
+    CREATE TABLE IF NOT EXISTS poll_votes (
+      id INTEGER PRIMARY KEY AUTOINCREMENT,
+      post_id INTEGER NOT NULL,     -- our local poll post (posts.id)
+      actor_uri TEXT NOT NULL,      -- the remote voter's AP actor URI
+      choice TEXT NOT NULL,         -- the chosen option's name (matches poll_json options[].name)
+      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+      UNIQUE(post_id, actor_uri, choice)
+    );
+    CREATE INDEX IF NOT EXISTS idx_poll_votes_post ON poll_votes(post_id);
   `);
   // "Feature" a followed account: its posts show in the local Cirkel.
