Index: src/assets/css/style.css
===================================================================
--- src/assets/css/style.css	(revision 82079add2859eb42986c97e651ed5be8d0bec7d1)
+++ src/assets/css/style.css	(revision 3d7312ab39fe3619ae0a9b953d94789dded655a0)
@@ -4417,2 +4417,6 @@
 .post-fediverse .fedi-reply-toggle::-webkit-details-marker { display: none; }
 .post-fediverse details[open] .fedi-reply-toggle { margin-bottom: .5rem; }
+
+/* Reply-via-fediverse CTA on post pages */
+.post-fediverse-cta { margin: 1.75rem 0; }
+.fedi-remote-reply-btn { display: inline-flex; align-items: center; gap: .4rem; }
Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 82079add2859eb42986c97e651ed5be8d0bec7d1)
+++ src/routes/posts.js	(revision 3d7312ab39fe3619ae0a9b953d94789dded655a0)
@@ -86,4 +86,5 @@
   'tag', 'type', 'user', 'users', 'artiesten', 'leden', 'favorieten', 'feed.xml', 'atom.xml', 'sitemap.xml',
   'manifest.webmanifest', 'sw.js', 'favicon.ico', 'favicon.svg', 'assets',
+  'authorize_interaction',
 ]);
 
@@ -509,4 +510,36 @@
   return { newerPost, olderPost };
 }
+
+// ==================== REMOTE INTERACTION (reply to a fediverse post as your site) ====================
+// Standard fediverse "reply from your own server" landing endpoint. A post page
+// elsewhere bounces the visitor here with ?uri=<remote post>; the site owner
+// composes a reply that federates back to that post.
+router.get('/authorize_interaction', requireSiteManager, async (req, res) => {
+  const site = res.locals.site;
+  const uri = (req.query.uri || '').toString();
+  let target = null;
+  try { target = await ActivityPubService.resolveRemoteNote(uri); } catch { /* ignore */ }
+  renderPage(req, res, 'pages/authorize-interaction', {
+    pageTitle: 'Reageer via de fediverse',
+    bodyClass: 'on-special',
+    uri,
+    target,
+    siteTitle: site ? site.title : '',
+  });
+});
+
+router.post('/authorize_interaction', requireSiteManager, async (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 || '/'));
+});
 
 // ==================== VIEW POST (last route â€” catches /:slug) ====================
Index: src/services/ActivityPubService.js
===================================================================
--- src/services/ActivityPubService.js	(revision 82079add2859eb42986c97e651ed5be8d0bec7d1)
+++ src/services/ActivityPubService.js	(revision 3d7312ab39fe3619ae0a9b953d94789dded655a0)
@@ -477,8 +477,30 @@
 }
 
+// Resolve a remote post URL (any fediverse/Klonkt post) into a reply target.
+// Returns a parent-shaped object usable by deliverReply(), or null.
+export async function resolveRemoteNote(url) {
+  if (!/^https?:\/\//i.test(String(url || ''))) return null;
+  const note = await fetchActor(url).catch(() => null); // AP GET (content-negotiates)
+  if (!note || !note.id) return null;
+  const att = note.attributedTo;
+  const actorUri = typeof att === 'string' ? att : (att && att.id);
+  if (!actorUri) return null;
+  const actor = await fetchActor(actorUri).catch(() => null);
+  const ai = actorInfo(actor, actorUri);
+  return {
+    object_uri: note.id,
+    actor_uri: actorUri,
+    actor_url: ai.url,
+    actor_handle: ai.handle,
+    actor_name: ai.name,
+    actor_icon: ai.icon,
+    preview: HtmlSanitizerService.toPlainText(note.content || '').slice(0, 240),
+  };
+}
+
 export default {
   getOrCreateKeys, apWants, sendAP, actorId, noteId,
   buildActor, buildNote, buildCreate, buildOutbox, buildFollowers,
   followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete,
-  getInteractions, getInteractionById, buildReplyNote, getOutboxNote, deliverReply,
+  getInteractions, getInteractionById, buildReplyNote, getOutboxNote, deliverReply, resolveRemoteNote,
 };
Index: src/services/i18n.js
===================================================================
--- src/services/i18n.js	(revision 82079add2859eb42986c97e651ed5be8d0bec7d1)
+++ src/services/i18n.js	(revision 3d7312ab39fe3619ae0a9b953d94789dded655a0)
@@ -109,4 +109,5 @@
     'fedi.heading': 'Vanuit de fediverse', 'fedi.likes': 'sterren', 'fedi.boosts': 'boosts', 'fedi.replies': 'Reacties uit de fediverse',
     'fedi.reply': 'Reageer', 'fedi.reply_ph': 'Je antwoord aan de fediverse…', 'fedi.send': 'Versturen', 'fedi.you': 'Jij',
+    'fedi.remote_title': 'Reageer via de fediverse', 'fedi.remote_reply': 'Reageer via de fediverse', 'fedi.remote_prompt': 'Je fediverse-adres (bv. @jij@mastodon.social):', 'fedi.remote_notfound': 'Kon die post niet ophalen. Plak de volledige post-URL:', 'fedi.remote_load': 'Ophalen', 'fedi.remote_replying_to': 'Je reageert op', 'fedi.remote_as': 'Wordt verzonden als {site}.',
     'comments.to_start': 'om de conversatie te starten.',
     'comments.reply': 'Reageer', 'comments.delete': 'Verwijder', 'comments.cancel': 'Annuleren',
@@ -1103,4 +1104,5 @@
     'fedi.heading': 'From the fediverse', 'fedi.likes': 'favourites', 'fedi.boosts': 'boosts', 'fedi.replies': 'Replies from the fediverse',
     'fedi.reply': 'Reply', 'fedi.reply_ph': 'Your reply to the fediverse…', 'fedi.send': 'Send', 'fedi.you': 'You',
+    'fedi.remote_title': 'Reply via the fediverse', 'fedi.remote_reply': 'Reply via the fediverse', 'fedi.remote_prompt': 'Your fediverse address (e.g. @you@mastodon.social):', 'fedi.remote_notfound': 'Could not fetch that post. Paste the full post URL:', 'fedi.remote_load': 'Fetch', 'fedi.remote_replying_to': 'Replying to', 'fedi.remote_as': 'Sent as {site}.',
     'comments.to_start': 'to start the conversation.',
     'comments.reply': 'Reply', 'comments.delete': 'Delete', 'comments.cancel': 'Cancel',
@@ -2095,4 +2097,5 @@
     'fedi.heading': 'Aus dem Fediverse', 'fedi.likes': 'Favoriten', 'fedi.boosts': 'Boosts', 'fedi.replies': 'Antworten aus dem Fediverse',
     'fedi.reply': 'Antworten', 'fedi.reply_ph': 'Deine Antwort an das Fediverse…', 'fedi.send': 'Senden', 'fedi.you': 'Du',
+    'fedi.remote_title': 'Über das Fediverse antworten', 'fedi.remote_reply': 'Über das Fediverse antworten', 'fedi.remote_prompt': 'Deine Fediverse-Adresse (z.B. @du@mastodon.social):', 'fedi.remote_notfound': 'Beitrag konnte nicht geladen werden. Füge die vollständige Beitrags-URL ein:', 'fedi.remote_load': 'Laden', 'fedi.remote_replying_to': 'Antwort an', 'fedi.remote_as': 'Wird als {site} gesendet.',
     'comments.to_start': 'um das Gespräch zu starten.',
     'comments.reply': 'Antworten', 'comments.delete': 'Löschen', 'comments.cancel': 'Abbrechen',
Index: src/views/pages/authorize-interaction.ejs
===================================================================
--- src/views/pages/authorize-interaction.ejs	(revision 3d7312ab39fe3619ae0a9b953d94789dded655a0)
+++ src/views/pages/authorize-interaction.ejs	(revision 3d7312ab39fe3619ae0a9b953d94789dded655a0)
@@ -0,0 +1,48 @@
+<div class="auth-interact">
+  <h1 class="auth-interact-title"><%= t('fedi.remote_title') %></h1>
+
+  <% if (!target) { %>
+    <p class="auth-interact-note"><%= t('fedi.remote_notfound') %></p>
+    <form method="get" action="/authorize_interaction" class="auth-interact-form">
+      <input type="url" name="uri" placeholder="https://…/een-post" value="<%= uri || '' %>" required>
+      <button type="submit" class="btn btn-primary"><%= t('fedi.remote_load') %></button>
+    </form>
+  <% } else { %>
+    <p class="auth-interact-meta">
+      <%= t('fedi.remote_replying_to') %>
+      <a href="<%= target.actor_url %>" rel="nofollow noopener" target="_blank"><strong><%= target.actor_name %></strong></a>
+      <span class="fedi-handle"><%= target.actor_handle %></span>
+    </p>
+    <% if (target.preview) { %>
+      <blockquote class="auth-interact-preview"><%= target.preview %></blockquote>
+    <% } %>
+    <form method="post" action="/authorize_interaction" class="auth-interact-form">
+      <input type="hidden" name="uri" value="<%= uri %>">
+      <textarea name="text" rows="4" required placeholder="<%= t('fedi.reply_ph') %>"></textarea>
+      <div class="auth-interact-actions">
+        <button type="submit" class="btn btn-primary"><%= t('fedi.send') %></button>
+        <a href="<%= uri %>" class="btn"><%= t('comments.cancel') %></a>
+      </div>
+    </form>
+    <p class="auth-interact-note"><%= t('fedi.remote_as', { site: siteTitle }) %></p>
+  <% } %>
+</div>
+
+<style>
+  .auth-interact { max-width: 580px; margin: 2rem auto; padding: 0 1rem; }
+  .auth-interact-title { margin: 0 0 1rem; }
+  .auth-interact-meta { color: var(--ink-soft, #888); margin: 0 0 .75rem; }
+  .auth-interact-preview {
+    margin: 0 0 1rem; padding: .75rem 1rem; border-left: 3px solid var(--accent, #888);
+    background: color-mix(in srgb, var(--ink, #000) 4%, transparent); border-radius: 0 12px 12px 0;
+    color: var(--ink, inherit);
+  }
+  .auth-interact-form { display: flex; flex-direction: column; gap: .75rem; }
+  .auth-interact-form textarea, .auth-interact-form input[type=url] {
+    width: 100%; box-sizing: border-box; padding: .6rem .8rem; font: inherit; resize: vertical;
+    border-radius: 12px; border: 1px solid color-mix(in srgb, var(--ink, #000) 18%, transparent);
+    background: var(--paper, #fff); color: var(--ink, #000);
+  }
+  .auth-interact-actions { display: flex; gap: .5rem; align-items: center; }
+  .auth-interact-note { color: var(--ink-soft, #999); font-size: .85rem; margin-top: 1rem; }
+</style>
Index: src/views/pages/post.ejs
===================================================================
--- src/views/pages/post.ejs	(revision 82079add2859eb42986c97e651ed5be8d0bec7d1)
+++ src/views/pages/post.ejs	(revision 3d7312ab39fe3619ae0a9b953d94789dded655a0)
@@ -135,4 +135,13 @@
     </section>
   <% } %>
+
+  <!-- Reply via the fediverse (remote interaction: bounces to the visitor's own server) -->
+  <% var _postAbsUrl = (typeof ogOrigin !== 'undefined' && ogOrigin ? ogOrigin : '') + (typeof _base !== 'undefined' && _base ? _base : '') + '/' + post.slug; %>
+  <div class="post-fediverse-cta">
+    <button type="button" class="btn fedi-remote-reply-btn"
+      onclick="(function(){var d=prompt(<%- JSON.stringify(t('fedi.remote_prompt')) %>);if(!d)return;d=d.trim().replace(/^@?[^@\s]*@/,'').replace(/^https?:\/\//i,'').replace(/\/.*$/,'').trim();if(d)location.href='https://'+d+'/authorize_interaction?uri='+encodeURIComponent(<%- JSON.stringify(_postAbsUrl) %>);})()">
+      🐘 <%= t('fedi.remote_reply') %>
+    </button>
+  </div>
 
   <!-- Comments -->
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 82079add2859eb42986c97e651ed5be8d0bec7d1)
+++ src/views/shell.ejs	(revision 3d7312ab39fe3619ae0a9b953d94789dded655a0)
@@ -175,5 +175,5 @@
 
 <!-- v9 stylesheet (full palette system) -->
-<link rel="stylesheet" href="/assets/css/style.css?v=38">
+<link rel="stylesheet" href="/assets/css/style.css?v=39">
 
 <!-- Audio player styles: loaded on every page so the mini-player works
