Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision f926d13c4545a33246387cc7a96c0fd8fa918942)
+++ src/routes/posts.js	(revision 476672022a20c0df74a19fd6716f8d446cb72fe4)
@@ -1249,4 +1249,7 @@
     pageTitle: 'Connect', bodyClass: 'on-special',
     connections, myGuardians,
+    // Na een verhuizing staat de uitgaande kant op slot. Dat hoort te blijken
+    // VOORDAT je op een knop drukt, niet daarna uit een foutmelding.
+    movedTo: ActivityPubService.movedLock(site).movedTo,
     success: req.query.success || null, error: req.query.error || null,
   });
@@ -1272,5 +1275,9 @@
     try {
       const r = await ActivityPubService.followActor(site, handle, !!req.body.auto_boost);
-      if (r && r.error) q = 'error=' + encodeURIComponent(r.error === 'not_found' ? 'Account niet gevonden' : (r.error === 'unreachable' ? 'Server onbereikbaar' : 'Volgen mislukt'));
+      // 'moved' is geen mislukking maar een weigering met een reden, en die reden
+      // hoort de gebruiker te lezen. "Volgen mislukt" laat hem zoeken naar een
+      // storing die er niet is.
+      if (r && r.error === 'moved') q = 'error=' + encodeURIComponent(`Dit account is verhuisd naar ${r.movedTo}. Volgen doe je daarvandaan.`);
+      else if (r && r.error) q = 'error=' + encodeURIComponent(r.error === 'not_found' ? 'Account niet gevonden' : (r.error === 'unreachable' ? 'Server onbereikbaar' : 'Volgen mislukt'));
       // Een DERDE uitkomst, niet gelukt en niet mislukt (shaer-p729). "Je volgt
       // nu X" zeggen terwijl het verzoek bij de guardians ligt is de leugen die
