Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 3d7312ab39fe3619ae0a9b953d94789dded655a0)
+++ src/routes/posts.js	(revision 41a7637a2e5b561b6a96b9a2791ddd41145c13c3)
@@ -518,6 +518,7 @@
   const site = res.locals.site;
   const uri = (req.query.uri || '').toString();
+  const sent = !!req.query.sent;
   let target = null;
-  try { target = await ActivityPubService.resolveRemoteNote(uri); } catch { /* ignore */ }
+  if (!sent) { try { target = await ActivityPubService.resolveRemoteNote(uri); } catch { /* ignore */ } }
   renderPage(req, res, 'pages/authorize-interaction', {
     pageTitle: 'Reageer via de fediverse',
@@ -525,20 +526,20 @@
     uri,
     target,
+    sent,
     siteTitle: site ? site.title : '',
   });
 });
 
-router.post('/authorize_interaction', requireSiteManager, async (req, res) => {
+router.post('/authorize_interaction', requireSiteManager, (req, res) => {
   const site = res.locals.site;
   const uri = (req.body.uri || '').toString();
   const text = (req.body.text || '').toString();
   if (site && uri && text.trim()) {
-    try {
-      const parent = await ActivityPubService.resolveRemoteNote(uri);
-      if (parent) await ActivityPubService.deliverReply(site, { postId: '', postSlug: null, parent, text });
-    } catch (e) { console.warn('[AP] remote reply failed:', e.message); }
-  }
-  // Send them to the post they replied to so they can see the thread.
-  res.redirect(uri && /^https?:\/\//i.test(uri) ? uri : (res.locals.siteUrlBase || '/'));
+    // Resolve + deliver in the background so Send responds instantly.
+    ActivityPubService.resolveRemoteNote(uri)
+      .then((parent) => parent && ActivityPubService.deliverReply(site, { postId: '', postSlug: null, parent, text }))
+      .catch((e) => console.warn('[AP] remote reply failed:', e.message));
+  }
+  res.redirect('/authorize_interaction?sent=1&uri=' + encodeURIComponent(uri));
 });
 
