Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision fc404105536bc9fcadc1fdb7dceb0449fee77e98)
+++ src/config/database.js	(revision c52dc82434331354ded181d0905a44614892a72e)
@@ -555,5 +555,9 @@
   ensureColumn('ap_timeline', 'link_json', 'TEXT');          // FEP-e232 object-link (quote/ref) tags from the inbound note, served back as `tag`
   ensureColumn('ap_timeline', 'quote_json', 'TEXT');         // FEP-044f resolved quoted-post snapshot (author + content), for the embedded quote card
-  ensureColumn('ap_timeline', 'embed_json', 'TEXT');         // resolved EXTERNAL embed (oEmbed/provider), thumbnail-only; gated per site (sites.external_embeds)
+  // FEP-044f: the fediverse object THIS post quotes, resolved once at publish
+  // time so buildNote (sync, also used by the outbox) needs no network.
+  ensureColumn('posts', 'quote_uri', 'TEXT');     // the quoted object's id
+  ensureColumn('posts', 'quote_actor', 'TEXT');   // its author, so we can address them
+  ensureColumn('ap_timeline', 'embed_json', 'TEXT');       // resolved EXTERNAL embed (oEmbed/provider), thumbnail-only; gated per site (sites.external_embeds)
   ensureColumn('ap_timeline', 'author_emoji_json', 'TEXT');  // FEP-9098 custom emojis in the author's display name (shaer:author.emojis)
   ensureColumn('ap_timeline', 'reblog_emoji_json', 'TEXT');  // FEP-9098 custom emojis in the booster's display name (shaer:booster.emojis)
