Index: src/routes/federation.js
===================================================================
--- src/routes/federation.js	(revision efdde3749346a7194ffcf47b31d0bd64de1e2d84)
+++ src/routes/federation.js	(revision 8aa85d06c34d1b16a4f9440e4c87fac432d0cf6e)
@@ -8,5 +8,5 @@
 
 import express from 'express';
-import { buildActor, buildOutbox, signBody } from '../services/CircleFederation.js';
+import { buildActor, buildOutbox, signBody, KLONKT_PROTO, MIN_PROTO } from '../services/CircleFederation.js';
 import { getTenancy } from '../services/SettingsService.js';
 
@@ -18,9 +18,17 @@
 }
 
+// De proto die de consument zegt te draaien (uit z'n request-header), of 0.
+function consumerProto(req) {
+  return parseInt(req.get('Klonkt-Proto') || '0', 10) || 0;
+}
+
 router.get('/.klonkt/actor.json', (req, res) => {
   // Cirkels = solo-naar-solo; hubs publiceren geen federatie-actor.
   if (getTenancy() === 'hub') return res.status(404).type('text/plain').send('Niet beschikbaar in hub-modus');
+  // De actor serveren we ALTIJD (ook aan oudere consumenten) zodat zij onze proto
+  // kunnen lezen en een nette "update vereist"-melding kunnen tonen.
   const body = JSON.stringify(buildActor(baseUrl(req)), null, 2);
   res.type('application/activity+json; charset=utf-8');
+  res.set('Klonkt-Proto', String(KLONKT_PROTO));
   res.set('Cache-Control', 'public, max-age=300');
   res.send(body);
@@ -29,4 +37,13 @@
 router.get('/.klonkt/outbox.json', (req, res) => {
   if (getTenancy() === 'hub') return res.status(404).type('text/plain').send('Niet beschikbaar in hub-modus');
+  res.set('Klonkt-Proto', String(KLONKT_PROTO));
+  // Te-oude consument? Weiger met 426 Upgrade Required (de crypto-binding sluit 'm
+  // sowieso al uit; dit geeft een expliciet, leesbaar signaal). proto 0 = geen
+  // header (bv. een browser/curl) → toestaan, die verifieert toch niet.
+  const cp = consumerProto(req);
+  if (cp && cp < MIN_PROTO) {
+    return res.status(426).type('text/plain')
+      .send(`Upgrade Required: deze cirkel draait proto ${KLONKT_PROTO}; jouw Klonkt (proto ${cp}) is te oud.`);
+  }
   const body = JSON.stringify(buildOutbox(baseUrl(req)), null, 2);
   res.type('application/activity+json; charset=utf-8');
