🇬🇧 🇳🇱 🇫🇷

BeLibre

Digitale Autonomie

BeLibre

De duif die terugvloog: hoe België stilletjes koos voor open source berichtenverkeer

Logo Belgian Secure Communications

Stel je voor: het jaar is 1914. Ergens aan het Westfront wordt een kleine duif losgelaten met een berichtje vastgebonden aan zijn pootje. Hij weet niet waarom. Hij weet niet voor wie. Hij vliegt gewoon — betrouwbaar, ongezien, onvermoeibaar — en brengt het bericht aan.

De duif was eeuwenlang de gouden standaard van veilige communicatie. Geen draden om af te tappen. Geen centrale server om te hacken. Gedecentraliseerd van nature. En verrassend moeilijk te onderscheppen.

We dachten aan die duif toen we het logo zagen van BSC - Belgian Secure Communications. Gouden cirkel. Belgische kleuren. En daarin: een grote witte vogel met gespreide vleugels. Meteen ontstond er discussie in onze BeLibre-chat. “Is dat een adelaar? We zijn toch geen Amerikanen?” Iemand opperde: “een valk misschien?” En dan, na een korte stilte: “Looks like a pigeon. Communication bird. Makes sense.”

We zijn er nog niet uit of de vogel in het logo een duif is. Maar de metafoor klopt hoe dan ook.

Beam: geen geheim, maar ook geen reclame

Op 18 maart 2026 verschijnt er een artikel op Computable.be: de Belgische overheid lanceert een eigen, beveiligde berichtenapp voor ambtenaren. Beam heet het, een vervanging voor WhatsApp en geschikt voor defensie, politie en overheidsdiensten. Ontwikkeld door Belgian Secure Communications (BSC), een vrij recent overheidsorgaan onder Justitie.

Het artikel beschrijft Beam als een “semi-intern ontwikkelde applicatie”. En daarmee is de toon gezet: mysterieus, gesloten, zelfgemaakt.

Maar is het dat echt?

De detectivemethode: browser devtools en een intuïtie

Emma opent de webversie van Beam, start de browser devtools en herkent meteen wat die ziet: de netwerkrequests verraden onmiskenbaar de vingerafdruk van Element en Synapse, de twee meest gebruikte open source bouwstenen van het Matrix-ecosysteem. Een kleine omweg via het versie-endpoint bevestigt diens vermoeden. (Wil je de details weten? Lees het achteraan dit artikel in de “nerds sectie”.)

Beam is een rebrand van Element, de populairste client voor het Matrix-protocol. Geen geheim, maar ook niet uitdrukkelijk vermeld op de officiële website. Jammer genoeg haalden ze ook de “Powered by Matrix”-link onderaan de loginpagina weg.

Matrix: de open standaard die stiekem wint

Matrix is een open, gedecentraliseerd communicatieprotocol. Berichten worden niet opgeslagen op één centrale server ergens in Silicon Valley, maar verdeeld over een federatie van homeservers — vergelijkbaar met hoe e-mail werkt, maar dan met end-to-end-encryptie.

Het bestaat al since 2014, en toch heeft het nooit de mainstream bereikt. Discord won de markt. WhatsApp won de families. Maar Matrix won wél stilaan de overheden: de Franse overheid draait op Tchap (een Matrix-fork), de Bundeswehr gebruikt het, NATO heeft zijn eigen Element-client, en nu dus ook de Belgische ambtenarij.

Matrix is de duif van de digitale wereld: niet de snelste, niet de mooiste, maar verdomd betrouwbaar. Het zijn niet de moeilijkste beestjes om zelf te houden, en iedereen kan zijn eigen duiventil opzetten op maat van de eigen context.

Wat BSC echt bouwde: een fork van Synapse

Achter de Element-client draait een homeserver. Bij Beam heet die beam.belgium.be, en er blijken niet één maar minstens 15 afzonderlijke Synapse-instanties achter te zitten, vermoedelijk per domein of dienst.

Synapse is de implementatie van Matrix waarop Beam zich gebaseerd heeft, en werd ontwikkeld door Element (het bedrijf achter Matrix). Het is AGPLv3-gelicenseerd (wat betekent dat wie het aanpast en als service aanbiedt, de broncode moet vrijgeven). En dat deed BSC ook keurig: Onderaan de copyrightpagina van beam.belgium.be staat discreet een link naar hun GitHub-organisatie: bsc-oss, waaronder de Beam Synapse repository beschikbaar gesteld wordt. Geen fanfare. Geen persbericht. Gewoon een stille verplichting nagekomen. Netjes zoals het hoort.

De versiestring van hun homeserver verraadt dat het om een aangepaste versie gaat: 1.147.1+pg2. BSC gebruikt naar alle waarschijnlijkheid de FOSS-versie van Synapse, aangevuld met een eigen module, die niet vrijgegeven wordt, maar volgens hun andere aanpassingen, hoogst waarschijnlijk de PG-naam verder draagt. Meer daarover in het technische gedeelte onderaan.

België is niet alleen: het stille Matrix-leger van Europa

Bij het graven in de details van Beam dringt zich een vraag op: hoe ver staan andere Europese overheden? Het antwoord is verbluffend.

Matrix voert al jarenlang een stille opmars in overheidscommunicatie, zonder dat de grote techpagina’s er echt aandacht aan besteden. Een greep uit wat er al draait:

Frankrijk liep al in 2017 voorop. Het resultaat is Tchap, uitgerold over alle ministeries, met 60 Matrix-servers in een gesloten netwerk. In 2025 telt Tchap bijna 300.000 actieve gebruikers per maand. Op 4 augustus 2025 legde premier Bayrou het gebruik van Tchap officieel vast bij circulaire — als beveiligde berichtendienst die WhatsApp en Telegram moet vervangen in alle ministeries. Qua budget is het ook opmerkelijk efficiënt: in 2024 bedroeg het budget van Tchap 1,5 miljoen euro — ofwel 0,50 euro per actieve gebruiker. DINUM, de Franse interministeriële digitale dienst, werd bovendien het eerste land ter wereld dat lid werd van de Matrix.org Foundation als Silver member.

Duitsland heeft Matrix misschien wel het meest systematisch omarmd. De Bundeswehr gebruikt BwMessenger (meer dan 100.000 actieve gebruikers), er is een BundesMessenger voor de bredere publieke sector, en 2,5 miljoen schoolkinderen in Noord-Rijn-Westfalen communiceren via Matrix. ZenDiS (het Centrum voor Digitale Soevereiniteit van de Publieke Administratie) draait Matrix als kern van OpenDesk, het soevereine werkplatform voor de hele Duitse overheid. Het P20-programma voor de 20 Duitste politiekorpsen heeft Matrix aanbevolen als uniform berichtenprotocol.

Polen ging nog een stap verder: het Ministerie van Nationale Defensie bouwde Merkury 2.0 volledig zelf op basis van Matrix-open-sourcecode — geen off-the-shelf Element-fork, maar eigenhandig ontwikkeld.

NATO experimenteert met NI2CE (NATO Interoperable Instant Communication Environment), een zelfgehoste Matrix-gebaseerde messenger. De architectuurvisie is bijzonder: elke natie host zijn eigen instantie, en die instanties federeren tot een soeverein netwerk. De Bundeswehr kan BwMessenger blijven gebruiken, de Fransen Tchap, de Belgen Beam — en ze kunnen toch gewoon met elkaar praten via de Matrix-federatielaag.

Naast Duitsland en Frankrijk zijn ook de VS (US Navy, publiek gemaakt door senatoren Wyden en Schmitt), het VK, Oekraïne, Zweden, Oostenrijk, Estland en Luxemburg Matrix-gebaseerde systemen aan het inzetten. Momenteel zijn er minstens 16 regeringen die Matrix-gebaseerde software gebruiken voor hun communicatie — een cijfer dat Element in januari 2025 publiek maakte. Omdat het doorgaans de meest veiligheidsbewuste delen van de overheid zijn die Matrix als eerste adopteren, kunnen die inzettingen vaak niet publiek worden geciteerd. Eind 2025 volgde Matrix al meer dan 25 landen — het getal groeit snel.

België is dus geen pionier, maar komt ook niet te laat. Beam past in een patroon dat al jaren aan het groeien is, en waaraan de Belgische overheid nu actief bijdraagt.

De kennis is er nu. Gebruik ze verder.

Dit is het punt waar we als BeLibre graag even bij stilstaan, want het gaat verder dan Beam alleen.

Door Beam te bouwen op basis van deze open source tools, hebben ze niet alleen een pak werk uitgespaard. Zo heeft BSC iets waardevols opgebouwd: expertise in het Matrix-protocol. Een team van Belgische ontwikkelaars die weten hoe Synapse werkt van binnen en van buiten. Synapse aanpassen aan de strenge overheidsvereisten, vraagt meer dan kopiëren en plakken: je moet begrijpen hoe het systeem van binnenuit werkt. En die kennis is er nu.

Die eigen infrastructuur, verspreid over minstens 15 eigen servers, draaien in productie. Dat is niet niks. Ze maken gebruik van de grote aanpasbaarheid van Matrix. Ook dat is niet niks.

Die kennis zit nu opgesloten in één applicatie, voor één doelgroep: ambtenaren met een overheidsemailadres.

Maar waarom daar stoppen?

Het Matrix-protocol is niet exclusief voor defensie of justitie. Het is een open standaard: dezelfde laag waarop scholen, gemeenten, ziekenhuizen, parlementen en publieke omroepen zouden kunnen communiceren. Zonder afhankelijkheid van Amerikaanse clouddiensten. Zonder abonnement bij een bedrijf dat zijn servicevoorwaarden eenzijdig kan wijzigen. Zonder data die door serverparken buiten Europa stroomt.

De opgebouwde kennis bij BSC is een strategisch goed voor de hele Belgische publieke sector. We moedigen de betrokken overheidsdiensten (BSC, BOSA, en de Vlaamse, Waalse en Brusselse overheden) dan ook uitdrukkelijk aan om die expertise niet alleen in te zetten voor intern defensiegebruik, maar ook te onderzoeken hoe Matrix breder ingezet kan worden: voor communicatie tussen overheidsdiensten en burgers, voor scholen die nood hebben aan een veilig samenwerkingsplatform, voor ziekenhuizen die veilig patiëntdata willen bespreken, voor lokale besturen die WhatsApp-groepen willen vervangen door iets dat ze zelf in handen hebben.

De geopolitieke context maakt dit alles urgenter dan ooit. De beslissing van de VS om in februari 2025 sancties op te leggen aan het Internationaal Strafhof in Den Haag heeft aangetoond dat soevereine staten niet langer kunnen aannemen dat cloudgebaseerde IT-diensten betrouwbaar blijven als de geopolitieke wind draait. De EU draait op Microsoft — en dat is een kwetsbaarheid, geen keuze.

Wat Computable héél even de bal verkeerd sloeg

Het Computable-artikel stelde dat Beam “gesloten” is en phishing “structureel uitsluit” door de gesloten architectuur. Dat klopt maar gedeeltelijk.

Federatie is ingeschakeld. Beam draait 15 Synapse-servers met actieve federation. De room directory is manueel uitgeschakeld over federation, maar dat is een configuratiekeuze, geen architecturele beperking. Of federation ook actief gebruikt wordt, of alleen maar niet uitgeschakeld is, is onduidelijk (maar hebben we ook niet verder uitgezocht). Hoogst waarschijnlijk is de huidige federatie-configuratie ingesteld zodat dit enkel toegestaan is tussen de 15 deployments van Beam zelf, niet met andere instanties, of het wijdere netwerk van Matrix servers.

De toegangsbeperking via overheidsemailadres is reëel en zinvol — maar dat is een toegangscontrole, niet hetzelfde als een gesloten systeem.

Matrix voor iedereen: ook voor jou

BSC heeft gekozen voor open standaarden en vrije software. Niet voor een proprietary platform van een Amerikaanse techgigant met alle juridische risico’s van dien. Niet voor een vendor lock-in. Ze bouwen op Matrix, ze gebruiken AGPLv3-gelicenseerde software, en ze publiceren hun aanpassingen op GitHub. Da’s een driepunter voor de BSC!

En Matrix is niet alleen voor overheden.

  • Een account aanmaken kan op servers zoals matrix.org, tchncs.de of een van tientallen andere publieke servers.
  • Een eigen groep opzetten is amper moeilijker dan het opzetten van een WhatsApp groep, en kan perfect in de plaats daarvan gebruikt worden.
  • Een eigen server opzetten is technisch haalbaar voor een school, gemeente of vzw met een eigen server. Je hebt er wel wat technische kennis voor nodig, maar minder dan je denkt en het is goed gedocumenteerd. Zo krijg je volledige controle over je data.
  • Element gebruiken als client kan op desktop, mobiel en via de browser (of een van de andere clients, zoals FluffyChat op je telefoon), en is volledig compatibel met de Beam-infrastructuur (al zal BSC je waarschijnlijk niet toelaten op hun servers).

De Belgische overheid heeft stilletjes een signaal gegeven: open standaarden zijn de gouden standaard voor defensie en justitie. Als ze geschikt zijn voor staatsgeheimen, zijn ze zeker geschikt voor je schoolgemeenschap, je buurtcomité, of je vereniging - zelfs voor je familie en vrienden.

Tot slot: over die vogel

We weten nog steeds niet zeker wat het is op het BSC-logo: adelaar, valk, of toch een duif?

Maar laten we het op een duif houden. Want de duif brengt het bericht aan: zonder centrale server en zonder privacybeleid van 47 pagina’s.

Matrix doet hetzelfde. En nu ook de Belgische overheid.


Voor de nerds: technische analyse van de BSC Synapse-fork

Dit gedeelte is voor de technisch geïnteresseerde lezer. Heb je geen interesse in de technische kant? Dan kun je hier perfect stoppen. Er wordt alleen nog uitgelegd hoe Emma dit allemaal vond en wat de technische verschillen zijn.

Voor wie wil weten wat BSC precies veranderde ten opzichte van upstream Synapse: er werd een directe diff gemaakt tussen de BSC-publieke GitHub-repo en de overeenkomstige upstream versie. Hier zijn de opvallendste bevindingen, van het meest onschuldige naar het meest ingrijpende.

🔍 Hoe Emma Beam herkende

De loginpagina van Beam spamt requests naar /_synapse/client/rendezvous — het endpoint dat Synapse gebruikt voor QR-code-login. Na een paginarefresh wordt config.json van de Element Web-client opgehaald, inclusief Element-specifieke iconpaden.

Het versie-endpoint op web.beam.belgium.be/version geeft MS4wLjI= terug — base64 voor 1.0.2. Hetzelfde endpoint op app.element.io/version geeft 1.12.12 terug, in plaintext. Twee verschillende versies, maar hetzelfde endpoint en hetzelfde formaat: de vingerafdruk liegt niet.

⏱️ Rendezvous TTL: van 1 naar 5 minuten

De QR-code-login (rendezvous) verloopt in de standaard Synapse na 1 minuut. BSC heeft dat verlengd naar 5 minuten. Waarschijnlijk pragmatisch: ambtenaren met centraal beheerde apparaten hebben soms meer tijd nodig om de koppelprocedure te doorlopen.

🔔 Notificatiegeluid standaard ingeschakeld

In de Rust-code voor push-regels is SOUND_ACTION toegevoegd aan de standaard notificatieregel voor berichten. Simpel gezegd: Beam speelt standaard een geluid af bij nieuwe berichten, waar dat in upstream Synapse stil is. Kleine aanpassing, grote impact op dagelijks gebruik.

🔒 Manhole volledig en grondig verwijderd

Synapse heeft een debugfunctie genaamd “manhole” — in essentie een interactieve Python-shell die via TCP bereikbaar is en directe toegang geeft tot de interne staat van het draaiende proces. Handig voor ontwikkelaars, rampzalig als het per ongeluk open staat in productie.

BSC heeft dit niet alleen uitgeschakeld maar actief geblokkeerd: wie de manhole-optie in de configuratie zet, krijgt nu een harde foutmelding bij opstart. De listener is verwijderd uit de lijst van bekende listenertypen, uit de config-parser, uit de worker-config, en uit de command-line argumenten. Vijf afzonderlijke plaatsen in de codebase — grondig werk.

🙈 Apparaatnamen verborgen voor andere gebruikers - een twijfelachtige keuze

In Matrix kun je via /keys/query de end-to-end encryptiesleutels van andere gebruikers opvragen, inclusief de weergavenaam van hun apparaat (“Bobs Laptop”, “Dienst-iPhone”). BSC heeft dat aangepast: je ziet alleen nog de apparaatnamen van je eigen toestellen, niet die van anderen.

Op het eerste gezicht klinkt dat als een privacymaatregel. Maar in een beveiligingscontext is het eigenlijk een stap achteruit: zichtbaarheid van apparaatnamen is precies hoe gebruikers kunnen detecteren dat er een onbekend of verdacht toestel op hun account actief is. Het verbergen ervan maakt het moeilijker om compromittering te herkennen, omdat dit de data reduceert tot korte, willekeurige gegeneerde IDs (bvb. CNQATVTHNF). Een discutabele afweging.

🧩 De PG synapse-module: het geheime hart van Beam

Dit is de meest architecturaal ingrijpende aanpassing, en ze omvat meerdere samenhangende wijzigingen.

BSC heeft een nieuw callback-systeem toegevoegd aan de Synapse module-API: on_enrich_membership_content. Wanneer iemand een kamer betreedt (of uitgenodigd wordt, of verwijderd wordt), kunnen geregistreerde modules de inhoud van dat membership-event aanvullen — velden toevoegen voordat het event wordt vastgelegd en gefedereerd.

Om dit mogelijk te maken, moest BSC ook het event-freeze-mechanisme van Synapse omzeilen. Synapse “bevriest” events na aanmaak om onbedoelde mutaties te voorkomen. BSC heeft een unfreeze()-methode toegevoegd aan de event-basisklasse, en past die toe in de check_event_allowed-callback — zodat events alsnog gemuteerd kunnen worden door de module.

Dit is geen triviale ingreep. Het doorbreekt een bewuste immutabiliteitsgarantie in Synapse, en heeft als neveneffect dat de return-semantiek van check_event_allowed veranderd is: waar upstream vroeger bij de eerste afkeuring of vervanging stopte, itereren BSC’s callbacks nu over álle handlers en combineren de resultaten. Dit breekt de compatibiliteit met bestaande Synapse-modules die op het originele gedrag rekenden.

Wat doet de module dan concreet? Dat weten we niet zeker, de PG synapse-module is niet publiek. Maar de architectuur maakt het duidelijk: de module schrijft extra velden in membership-events, vermoedelijk om gebruikersdata vanuit een extern Belgisch identity-systeem te injecteren. In de commentaren bij de aanpassingen wordt trouwens expliciet naar e-mailadressen verwezen.

⚠️ E-mailadressen in de sliding sync-respons

In de sliding sync-code (de modernere sync-API voor Matrix-clients) wordt het veld email uit membership-events doorgegeven als onderdeel van de “hero”-data, de gebruikersinfo die aan de client wordt teruggestuurd bij kamersynchronisatie.

Als de PG synapse-module het e-mailadres van een gebruiker inschrijft in het membership-event (wat de architectuur sterk suggereert), dan kan dat e-mailadres via sliding sync terechtkomen bij andere clients in dezelfde ruimte. Of dat effectief zo werkt, hangt af van wat de module precies injecteert en welke toegangscontroles er zijn — maar het is een datapunt dat verder onderzoek verdient.

🐳 Eigen PKI en een private module-registry

De Dockerfile installeert aangepaste CA-certificaten (custom-cas) op meerdere plaatsen in de build — wat erop wijst dat BSC een eigen interne certificaatinfrastructuur heeft. De PG synapse-module wordt opgehaald uit een private GitLab package registry, waarbij een toegangstoken (pg_access_token) tijdelijk in de container wordt gekopieerd en nadien verwijderd. Dat is een gangbare aanpak, maar het betekent wel dat de buildpipeline niet volledig reproduceerbaar is vanuit de publieke repo.

Tot slot: door de hele diff heen staan de aanpassingen netjes gemarkeerd als # PG_CHANGED — inclusief een spaarzame maar trouwe collectie trailing spaces.