October 12, 2026

Waarom ik Justflows heb gebouwd

Ik was niet tevreden met de datastructuur van WordPress en ook niet met PHP. Dus vroeg ik me af: als je vandaag een CMS vanaf nul bouwt, welke stack kies je dan, en hoe ziet de data eruit?

Waarom ik Justflows heb gebouwd
WordPress heeft zijn plek verdiend. Het maakte publiceren mogelijk voor miljoenen mensen, en de eenvoud van installeren in de browser en een plugin uploaden is iets waar elk CMS van kan leren. Maar elke keer dat ik onder de motorkap keek, zaten twee dingen me dwars: hoe de data wordt opgeslagen, en de taal waarin het is geschreven.
Dus stelde ik mezelf een simpele vraag: als je vandaag een CMS vanaf nul bouwt, welke stack kies je dan, en hoe ziet het datamodel eruit? Justflows is mijn antwoord.

Het datamodel dat ik wilde

In WordPress is bijna alles een rij in wp_posts. Wat daar niet in past, belandt in wp_postmeta als sleutel met een tekstwaarde. De blokeditor slaat een pagina op als HTML, met de blokstructuur verstopt in HTML-commentaar, en leest die er bij elke bewerking weer uit. Het werkt, maar het is een structuur die in twintig jaar is gegroeid, niet een die is ontworpen.
Justflows begint aan de andere kant:
  • Contenttypes met vooraf vastgelegde velden. Een bericht, een pagina of je eigen type geeft vooraf aan welke velden het heeft.
  • Content is een blokdocument, geen HTML. De inhoud van een pagina is geversioneerde JSON, en elk blok wordt vóór het opslaan gecontroleerd tegen het blokregister. Er hoeft niets uit markup te worden teruggelezen.
  • Revisies die respecteren wat live staat. Een gepubliceerde pagina bewerken maakt een werkrevisie aan. De live pagina blijft precies zoals hij is tot je publiceert.
  • Taxonomieën, menu's, headers en footers zijn gestructureerde data die je via dezelfde API leest en schrijft als content.
  • Multisite vanaf dag één. Elk record hoort bij een site, dus één installatie kan veel websites en workspaces draaien.
{"version":1,"blocks":[{"type":"core.heading","props":{"text":"Hello","level":2}},{"type":"core.paragraph","props":{"text":"Content is data, not HTML soup."}},{"type":"core.image","props":{"src":"/uploads/cover.jpg","alt":"Cover"}}]}
Omdat content gestructureerde data is, kan dezelfde pagina door een thema worden weergegeven, als statische HTML worden geëxporteerd, via een API worden geserveerd of door een AI-agent worden bewerkt, allemaal zonder HTML te scrapen.

Een moderne stack, van begin tot eind

Justflows is TypeScript, van de databaselaag tot de admin. Het draait op Node.js 22 en werkt met PostgreSQL, MySQL 8 of MariaDB 10.6, dus je gebruikt gewoon wat je host al aanbiedt. Plugin- en themaontwikkelaars krijgen een stabiele, getypeerde SDK in plaats van een soep aan globale functies.
Wat WordPress goed deed, heb ik gehouden: je kunt Justflows nog steeds uploaden naar shared hosting, je domein openen en het in de browser installeren. Geen terminal, geen npm en geen buildstap voor site-eigenaren.

Security voorop, niet achteraf toegevoegd

Een CMS draait code van anderen op jouw server. Dat verdient meer dan een vinkje, dus security is onderdeel van het ontwerp:
  • Plugin- en themapakketten worden geweigerd, tenzij ze een geldige marketplace-handtekening hebben of je hun exacte SHA-256-digest vastzet.
  • Core-updates zijn ondertekend met een aparte releasesleutel die in Justflows zelf is vastgezet.
  • Plugins geven in hun manifest aan welke rechten ze nodig hebben, zoals privé-bestandsopslag of achtergrondtaken.
  • Sites hebben standaard een strikte Content-Security-Policy, en webhooks en andere uitgaande verzoeken weigeren privé-netwerkadressen.
  • Een nieuwe installatie vraagt om een eenmalige setupsleutel, zodat niemand je site kan claimen voordat jij dat doet.

Caching voorop, zodat je site snel blijft

Snelheid zou niet moeten afhangen van het vinden van de juiste cachingplugin. Justflows heeft een objectcache en paginacaching ingebouwd, en werkt met één server en zonder Redis. Je kunt Cache-Control per contenttype of zelfs per bericht instellen, een CDN zoals Bunny.net legen als content verandert, of de hele site als statische HTML exporteren naar S3-compatibele opslag.
In de codebase is performance een regel, geen bijzaak: lijsten laden gedeelde data één keer en bundelen hun databasequery's, in plaats van één query per item uit te voeren.

Geen afhankelijkheid van plugins van derden

Een gewone site zou geen stapel plugins van verschillende leveranciers nodig moeten hebben om gevonden te worden, een formulier te verwerken of om cookietoestemming te vragen. Elk daarvan is weer een update om bij te houden, weer een beveiligingsrisico en weer iets dat je pagina's vertraagt.
In Justflows zijn de basisfuncties first-party: SEO met metatags, sitemaps en feeds, formulieren, reacties, galerijen, analytics en cookietoestemming. Ze worden gebouwd en uitgebracht door hetzelfde team als de core. Plugins zijn nog steeds van harte welkom, maar ze moeten iets toevoegen, niet de basis repareren.

Waar het nu staat

Justflows is open source, met een core onder de MIT-licentie, en er verschijnen vaak nieuwe versies: versie 0.3.5 voegde net widgetgebieden, caching per bericht en statische exports naar objectopslag toe. Ook deze blog draait erop. Als de vraag "hoe zou een CMS eruitzien als we het vandaag bouwden?" je interesseert, bekijk dan de code, probeer het uit en laat ons weten wat je ervan vindt.
Justflows downloaden Bijdragen