
Headless Joomla
Joomla heeft altijd steeds twee taken tegelijk vervuld: het slaat je content op in een database en zet die content vanuit de database met behulp van een template om in volwaardige webpagina’s. Bij een headless-opstelling blijft de eerste taak behouden, terwijl de tweede aan iemand anders wordt overgelaten. Joomla wordt dan puur een opslagplaats voor content, en een aparte frontend – een React-app, een mobiele app of zelfs een AI-assistent – haalt de content op via de REST API en bepaalt hoe deze wordt weergegeven.
Dit artikel legt uit hoe je Joomla als een headless website gebruikt. Het behandelt de basis voor eigenaren en redacteuren, de architectuur voor beheerders, en de technische details voor ontwikkelaars. Je leert wat headless echt betekent, wanneer het de juiste keuze is en wanneer niet, hoe een frontend-framework verbinding maakt met Joomla, hoe headless de SEO beinvloedt, en hoe dezelfde content AI-assistenten, RAG-pipelines en geautomatiseerde agents kan voeden.
Joomla houdt de content; iets anders schildert de pagina's.
Het doel is simpel: je helpen beslissen of een headless Joomla bij je project past, en begrijpen hoe de onderdelen in elkaar passen als dat zo is.
Dit is de architectuurbegeleider bij het aparte Focus On-artikel over de Joomla Web Services API. Dat artikel legt uit hoe je de API inschakelt, authenticeert en aanroept; dit artikel legt uit wat je daarbovenop bouwt. Lees eerst het API-artikel als je dat nog niet gedaan hebt.
1. De basis
1.1 Wat "headless" betekent
Het woord "head" (hoofd) staat voor het deel van een website dat de pagina's tekent: de template, de layout, de HTML die een browser toont. Een traditioneel CMS heeft zijn hoofd vastzitten. Een headless CMS heeft het verwijderd. De content woont nog steeds in Joomla, maar de presentatie verhuist naar een aparte applicatie die alleen via data met Joomla praat.
Traditioneel Joomla → template → HTML-pagina → browser
Headless Joomla → REST API → jouw frontend → browser
1.2 Joomla wordt een content-hub
In een headless model is Joomla de plek waar redacteuren content schrijven, organiseren en goedkeuren, precies zoals voorheen. Wat verandert is de uitgang. In plaats van te vertrekken als een gerenderde pagina, vertrekt de content als JSON via de Web Services API, en een willekeurig aantal frontends kan die lezen.
Daarom wordt headless vaak decoupled (ontkoppeld) genoemd: de content en de presentatie zitten niet langer aan elkaar vast. Je kunt de frontend volledig herontwerpen zonder Joomla aan te raken, of een tweede frontend toevoegen (bijvoorbeeld een mobiele app) die dezelfde content leest.
1.3 Wat je nog steeds krijgt, en wat je opgeeft
Je behoudt de echte sterke punten van Joomla: een volwassen redactie-ervaring, gebruikers en rechten, categorieen, tags, custom fields, workflow en meertalige content. Je geeft alles op wat de templatelaag gratis bood: de modules, menu's, SEF-URL's, templateposities en de vele extensies die op de site renderen. De frontend moet die zelf opnieuw opbouwen.
Naar boven2. Waarom headless gaan (en wanneer niet)
2.1 De voordelen
- Frontend-vrijheid. Bouw de site in React, Vue, Angular, Svelte of een mobiele toolkit zoals Flutter, en beheer de content toch in Joomla.
- Omnichannel publiceren. Een enkele bron van waarheid kan tegelijk een website, een mobiele app, een kioskscherm, een nieuwsbrief en een AI-assistent voeden.
- Onafhankelijke teams. Redacteuren houden de vertrouwde Joomla-backend terwijl frontend-ontwikkelaars in hun eigen framework werken, zonder dat een van beide kanten de ander blokkeert.
- Een moderne frontend-stack. Frameworks zoals Next.js en Nuxt brengen snelle navigatie, fijnmazige caching en een groot ecosysteem aan UI-tools.
2.2 De kosten
Headless is een serieuze toezegging, geen gratis upgrade. Een ontkoppelde site heeft een tweede applicatie nodig om te bouwen, hosten, deployen en onderhouden. Je bouwt routing, metadata, sitemaps, redirects, formulieren en caching opnieuw op die de gerenderde site voor je deed. De meeste page-builder-extensies en templates zijn simpelweg niet van toepassing. De totale eigendomskosten gaan omhoog.
2.3 Wanneer de klassieke site beter is
Voor een brochuresite, een blog, een vereniging of een kleine bedrijfswebsite is traditioneel gerenderd Joomla simpeler, goedkoper en sneller te leveren, en het doet SEO al goed. Grijp alleen naar headless als je een echte reden hebt: een eigen applicatie-frontend, meerdere kanalen vanuit een backend, of een bestaand JavaScript-team en -toolchain. Als het enige doel "modern" is, is de klassieke site meestal de verstandigere keuze.
Headless lost een distributieprobleem op, geen ontwerpprobleem. Als je alleen een mooiere website nodig hebt, hoef je niet headless te gaan.Naar boven
3. De architectuur
3.1 De drie lagen
Een headless Joomla-project heeft drie duidelijke lagen:
Contentlaag Joomla (backend, database, Web Services API)
Leveringslaag de REST API + eventuele cache of CDN ervoor
Presentatielaag jouw frontend-app (web-framework of mobiele app)
3.2 Hoe een verzoek verloopt
Wanneer een bezoeker een pagina opent, bereikt het verzoek Joomla niet langer rechtstreeks. Het bereikt jouw frontend, die vervolgens aan Joomla vraagt om de data die het nodig heeft:
Bezoeker → frontend-app → Joomla REST API → database
↓
rendert de pagina
De frontend kan ophalen tijdens de build, op de server voor elk verzoek, of in de browser. Sectie 4 legt die keuzes uit, want ze bepalen zowel de snelheid als de SEO.
3.3 De API is het contract
Alles in een headless opzet hangt ervan af dat de Web Services API ingeschakeld en bereikbaar is. De relevante webservices-plugins moeten aan staan, er moet een authenticatiemethode aanwezig zijn, en de frontend moet geldige credentials bezitten. Dat alles is het onderwerp van het bijbehorende API-artikel. Behandel de API hier als het vaste contract tussen Joomla en de frontend: stabiele endpoints die JSON teruggeven.
4. Een frontend-framework verbinden
4.1 Een simpele fetch
In de kern is praten met Joomla vanuit een frontend gewoon een HTTP-verzoek. Hier is een minimale aanroep vanuit JavaScript die de lijst met artikelen leest:
const response = await fetch(
'https://example.test/api/index.php/v1/content/articles',
{ headers: { 'X-Joomla-Token': process.env.JOOMLA_TOKEN } }
);
const result = await response.json();
const articles = result.data; // JSON:API-array van { type, id, attributes }
Merk op dat de token uit een server-side omgevingsvariabele komt, niet uit code die naar de browser verstuurd wordt. Dat onderscheid is belangrijk en sectie 11 komt erop terug.
4.2 Drie manieren om te renderen
Moderne frameworks zoals Next.js, Nuxt en Astro kunnen die data op drie verschillende manieren in pagina's omzetten. De keuze bepaalt prestaties en SEO:
| Strategie | Wanneer de pagina gebouwd wordt | Het beste voor |
|---|---|---|
| Static Site Generation (SSG) | Eenmalig, tijdens de build. | Content die zelden verandert; snelst en goedkoopst om te serveren. |
| Server-Side Rendering (SSR) | Op de server, per verzoek. | Content die vaak verandert of gepersonaliseerd is. |
| Client-Side Rendering (CSR) | In de browser, na het laden. | Dashboards en app-achtige schermen achter een login. |
4.3 Herbouwen of hervalideren bij verandering
Bij statische generatie zijn de pagina's slechts zo vers als de laatste build. Frameworks lossen dit op met incrementele herbouw of getimede hervalidatie, en Joomla kan een herbouw triggeren via een webhook wanneer een redacteur een artikel opslaat. Plan dit verversingspad vroeg; "het artikel is gepubliceerd maar de site toont nog steeds het oude" is de meest voorkomende headless-verrassing.
Naar boven5. SEO voor een headless site
5.1 Het echte risico
Headless schaadt SEO niet vanzelf, maar een onzorgvuldige headless build doet dat makkelijk wel. Het gevaar is een site die alleen in de browser gerenderd wordt (CSR): het eerste antwoord is een lege schil, en zoekmachines indexeren mogelijk weinig of niets. Dit is de allergrootste SEO-fout in ontkoppelde projecten.
5.2 Render HTML op de server
De oplossing is om echte HTML te sturen, geen lege pagina. Gebruik SSG of SSR zodat de content in het eerste antwoord zit. Goed gedaan kan een headless frontend sneller zijn dan een traditionele site en beter scoren op Core Web Vitals, omdat frameworks slanke, vooraf gerenderde pagina's leveren en die cachen aan de edge.
5.3 Jij bezit nu de metadata
Op een gerenderde Joomla-site produceren de template en componenten titels, meta-descriptions, canonical-tags, Open Graph-data, sitemaps en redirects. In een headless site is daar niets van automatisch. Jouw frontend moet elk daarvan opbouwen, meestal uit velden die het via de API leest. Haal de artikeltitel en metavelden uit Joomla en map ze naar de head-tags van de frontend, genereer een sitemap uit de artikellijst, en herbouw alle redirects waarop je vertrouwde. Behandel SEO als een functie die je moet bouwen, niet een die je erft.
Naar boven6. Joomla als AI-contentbron
6.1 Waarom de API zo goed bij AI past
Een AI-assistent is alleen zo goed als de content die hij kan bereiken. Omdat de Web Services API elk artikel, elke categorie en elke tag teruggeeft als schone, gestructureerde JSON, maakt Joomla een natuurlijke bron van waarheid voor assistenten die uit je eigen content moeten antwoorden in plaats van uit het open internet.
6.2 De twee dingen die AI nodig heeft
De meeste AI-integraties hebben dezelfde twee mogelijkheden nodig, en beide zijn gewone API-aanroepen:
- Lezen van content om ervan te leren: een gepagineerde
GETover de artikelen, waarbij alleen de velden die ertoe doen worden opgehaald. - Schrijven van content terug wanneer de assistent iets produceert: een
POSTofPATCH, onderhevig aan dezelfde rechten als elke andere gebruiker.
De rest van dit artikel kijkt naar de gangbare vormen die deze integraties aannemen: retrieval voor het beantwoorden van vragen (RAG), een protocol voor het verbinden van agents (MCP), en agents die op eigen houtje handelen.
Naar boven7. Retrieval-Augmented Generation en vectordatabases
7.1 Wat RAG oplost
Een taalmodel weet alleen waarop het getraind is, wat nooit je private content omvat en altijd verouderd is. Retrieval-Augmented Generation (RAG) lost dit op door de relevante stukken van je content op te halen op het moment van de vraag en die aan het model te geven als context. Het model antwoordt dan uit jouw materiaal, met veel minder risico op het verzinnen van feiten.
7.2 De pipeline
1. Content exporteren gepagineerde GET over de Joomla REST API
2. Opdelen splits elk artikel in kleine passages
3. Embedden een embedding-model zet elk stuk om in een vector
4. Opslaan bewaar de vectors in een vectordatabase
5. Ophalen vind bij de vraag de dichtstbijzijnde stukken
6. Genereren voer die stukken met de vraag naar het model
7.3 Vectordatabases
De opslag in stap 4 is een vectordatabase, gebouwd om de passages te vinden waarvan de betekenis het dichtst bij een vraag ligt. Veelgebruikte keuzes zijn onder andere Qdrant, Weaviate, Pinecone, Chroma en Milvus. Joomla zelf bewaart hier niets van; het levert alleen de brontekst via de API.
7.4 De index vers houden
Content verandert, dus de index moet bijblijven. Voer de import opnieuw uit op een schema, of trigger het wanneer een redacteur opslaat, met behulp van de modified-datum van het artikel om alleen opnieuw te embedden wat veranderd is. Een verouderde index is de RAG-versie van een verouderde cache: de assistent antwoordt zelfverzekerd met verouderde feiten.
8. MCP: Model Context Protocol
8.1 Wat MCP is
Het Model Context Protocol (MCP) is een open standaard voor het verbinden van AI-assistenten met externe tools en databronnen op een uniforme manier. In plaats van een aparte brug voor elke assistent te schrijven, stel je je data beschikbaar via een MCP-server, en elke MCP-bewuste assistent kan die gebruiken.
8.2 MCP zit niet ingebouwd in Joomla
Joomla 6 heeft geen ingebouwde MCP-server. MCP is iets wat je bovenop de Web Services API bouwt: een kleine MCP-server die verzoeken van een assistent ontvangt en ze vertaalt naar Joomla REST-aanroepen.
AI-assistent → MCP-server (bouw je zelf) → Joomla REST API → Joomla
8.3 Wat het mogelijk maakt
Met een MCP-server op zijn plek kan een assistent werken met live Joomla-content - een artikel opzoeken, een categorie doorzoeken, een nieuw item opstellen - via een enkele, standaard interface, zonder ooit de database rechtstreeks aan te raken. De MCP-server is ook de juiste plek om limieten af te dwingen: hij houdt de API-credentials, beslist welke acties zijn toegestaan, en logt wat de assistent doet. Omdat hij voor de API zit, omzeilt hij nooit Joomla's eigen authenticatie en rechten; hij voegt een tweede poort toe, geen achterdeur.
Naar boven9. AI-agents
9.1 Van antwoorden naar handelen
Een chatbot beantwoordt vragen. Een agent onderneemt acties. Verbonden met Joomla via de API (vaak via een MCP-server) kan een agent meer dan lezen:
- Een nieuw artikel opstellen uit een briefing en het opslaan als niet-gepubliceerd.
- Bestaande content samenvatten of herschrijven.
- Een artikel vertalen en de vertaalde versie aanmaken.
- Content automatisch categoriseren en taggen.
- Een item door een reviewworkflow bewegen.
9.2 Houd een mens in de loop
Een agent die kan schrijven is even krachtig als riskant. Het veilige patroon is om de agent concepten te laten maken, nooit te publiceren. Hij schrijft naar een niet-gepubliceerde staat, een redacteur beoordeelt, en een mens drukt op publiceren. Joomla's rechten maken dit makkelijk af te dwingen: geef de gebruiker van de agent core.create maar niet core.edit.state, zodat hij content kan voorstellen maar niet live kan zetten. Combineer dat met logging, en je krijgt de snelheid van automatisering zonder de sleutels van je live site uit handen te geven.
10. Prestaties, caching en schalen
10.1 Pagineer en trim elk verzoek
Een headless frontend kan veel API-aanroepen doen, dus elke aanroep moet slank zijn. Pagineer grote lijsten met page[limit] en page[offset], en vraag alleen de velden die je nodig hebt met fields[...]:
"...?page[limit]=100&page[offset]=0&fields[articles]=id,title,modified"
10.2 Cache op elke laag
Content wordt veel vaker gelezen dan dat het verandert, dus caching is waar headless wint of verliest op snelheid. De lagen stapelen op:
| Laag | Wat het cachet |
|---|---|
| Frontend-build / revalidate | Vooraf gerenderde pagina's (SSG), ververst op een schema of webhook. |
| CDN / edge | Afgewerkte pagina's en API-antwoorden, dicht bij de bezoeker geserveerd. |
| Varnish / reverse proxy | Hele API-antwoorden voor Joomla, zodat een hit nooit PHP bereikt. |
| Redis / Memcached | Joomla's eigen cache en sessies, in snel geheugen. |
Cache alleen wat veilig is: publieke leesacties zijn ideaal, terwijl alles wat gebonden is aan een ingelogde gebruiker of een schrijfactie nooit gecachet mag worden.
10.3 Bescherm de API onder belasting
Een publiek toegankelijke API kan hard geraakt worden. Pas rate limiting toe op de webserver of proxy zodat een client hem niet kan overspoelen, roteer tokens zodat een langlevende integratie zijn credentials ververst, en houd logging en monitoring bij zodat je misbruik kunt opmerken en problemen kunt traceren. Deze leven in je hosting en infrastructuur, niet in Joomla zelf.
Naar boven11. Beveiliging voor een ontkoppelde site
11.1 Stuur nooit een token naar de browser
De grootste beveiligingsfout in headless-projecten is het plaatsen van een API-token in frontend-code die in de browser draait. Iedereen kan de developer tools openen en hem lezen. Een token is een credential: hij hoort alleen op de server.
11.2 Gebruik een backend voor de frontend
Het veilige patroon is een kleine server-side laag - een "backend for frontend" - die de token houdt en Joomla aanroept. De browser praat met jouw server; jouw server praat met Joomla. Frameworks zoals Next.js en Nuxt maken dit natuurlijk, omdat hun serverfuncties en route-handlers draaien waar secrets veilig zijn.
Browser → jouw server-route (houdt de token) → Joomla API
11.3 CORS en minimale rechten
Als een browser Joomla rechtstreeks moet aanroepen voor publieke alleen-lezen data, moet je omgaan met CORS (de cross-origin-regels van de browser) en moet je accepteren dat alles wat de browser kan ophalen publiek is. Hoe dan ook, geef de integratie een toegewijde gebruiker met de smalste rechten die de taak nodig heeft: alleen-lezen voor een contentsite, core.create zonder publiceerrechten voor een agent. Behandel de authenticatie- en ACL-secties van het API-artikel als verplichte literatuur voordat je live gaat.
12. Veelgemaakte fouten en valkuilen
12.1 Headless gaan zonder reden
Symptoom: een simpele contentsite is plots twee codebases, trager om bij te werken en duurder om te hosten.
Oplossing: bevestig dat je echt een eigen frontend of meerdere kanalen nodig hebt. Zo niet, dan is een klassieke gerenderde Joomla-site het betere gereedschap.
12.2 Een browser-only render die zoekmachines niet kunnen zien
Symptoom: pagina's zien er prima uit voor bezoekers maar scoren slecht, en de paginabron is bijna leeg.
Oplossing: render op de server met SSR of SSG zodat het eerste antwoord echte HTML en metadata bevat.
12.3 De token zit in de browser
Symptoom: de API-token is zichtbaar in de paginabron of het netwerktabblad.
Oplossing: verplaats de token naar een server-side laag en laat de browser jouw server aanroepen, nooit Joomla rechtstreeks met een secret.
12.4 Verouderde content na publiceren
Symptoom: een redacteur publiceert, maar de live site blijft de oude versie tonen.
Oplossing: voeg een herbouw- of cache-leegmaakstap toe die getriggerd wordt wanneer content verandert, en bevestig dat je hervalidatie-interval past bij hoe vers de site moet zijn.
12.5 De SEO-plumbing vergeten
Symptoom: ontbrekende metatags, geen sitemap, kapotte oude URL's na de lancering.
Oplossing: herbouw titels, meta, canonicals, sitemap en redirects in de frontend uit data die via de API gelezen wordt. Niets daarvan is nog automatisch.
12.6 Een AI-agent met te veel macht
Symptoom: een geautomatiseerde agent publiceert of verwijdert content zonder toezicht.
Oplossing: geef de agent alleen core.create, houd hem weg van publiceer- en verwijderrechten, en eis menselijke review voordat er iets live gaat.
13. Best practices
Als je maar een paar dingen uit dit artikel onthoudt, onthoud dan deze:
- Kies headless om een echte reden - een eigen frontend of meerdere kanalen - niet omdat het modern klinkt.
- Render content altijd op de server (SSG of SSR) zodat zoekmachines en bezoekers echte HTML krijgen.
- Herbouw de SEO-plumbing zelf: titels, meta, canonicals, sitemap, redirects.
- Houd API-tokens op de server. Gebruik een backend-for-frontend; stel nooit een credential bloot aan de browser.
- Geef elke integratie een toegewijde gebruiker met minimale rechten, en laat agents concepten maken maar niet publiceren.
- Cache agressief maar alleen veilige publieke leesacties, en voeg een verversingspad toe voor wanneer content verandert.
- Houd voor AI de index vers en behandel Joomla als de enige bron van waarheid.
- Bouw MCP en agents bovenop de API; ze vervangen nooit Joomla's authenticatie en rechten.
14. In het kort
WAT HET IS Joomla bewaart content; een aparte frontend rendert het
content vertrekt als JSON via de Web Services API
WANNEER ja: eigen frontend, mobiele app, veel kanalen, JS-team
nee: brochure / blog / kleine site (gebruik klassiek Joomla)
RENDER SSG eenmaal gebouwd snel, voor stabiele content
SSR per verzoek verse of gepersonaliseerde content
CSR in browser app-schermen achter login (slecht voor SEO)
SEO render HTML op de server (SSG/SSR)
herbouw meta, canonicals, sitemap, redirects zelf
AI RAG GET content -> opdelen -> embedden -> vector-DB -> model
VECTOR Qdrant / Weaviate / Pinecone / Chroma / Milvus
MCP je bouwt een server die de REST API omhult
AGENT laat het concepten maken (core.create), nooit publiceren
SCHAAL pagineer + trim verzoeken; cache (build / CDN / Varnish / Redis)
rate-limit, roteer tokens, log en monitor
BEVEILIGING token blijft server-side (backend for frontend)
toegewijde gebruiker met minimale rechten; let op CORS
ZIE OOK het Focus On-artikel over de Joomla Web Services API
(de API inschakelen, authenticeren, aanroepen en beveiligen)
Naar boven15. Samenvatting
Joomla als een headless website gebruiken betekent het behouden als je content-hub en een aparte frontend de presentatie laten afhandelen:
- Headless verwijdert de renderlaag. Joomla bewaart en beheert content; de frontend leest het als JSON via de Web Services API.
- Het is een toezegging, geen gratis upgrade. Kies het voor een eigen frontend of meerdere kanalen, niet voor een normale contentsite.
- SEO is nu jouw taak. Render op de server en herbouw de metadata, sitemap en redirects zelf.
- Dezelfde content voedt AI. RAG, vectordatabases, MCP-servers en agents lezen allemaal uit Joomla als de bron van waarheid.
- Beveiliging en schaal verhuizen naar de randen. Houd tokens server-side, gebruik gebruikers met minimale rechten, en cache veilig.
Headless Joomla is een krachtige architectuur wanneer het project het echt nodig heeft, en een dure omweg wanneer dat niet zo is. De eerlijke eerste stap is om de voordelen af te wegen tegen de extra applicatie die je voor altijd zult bezitten.
Als je een headless build, een mobiele app of een AI-assistent bovenop je Joomla-content overweegt, is het veiligste pad om te starten vanuit een duidelijke reden, de API en de beveiliging ervan goed te krijgen, en een kanaal te bewijzen voordat je het volgende toevoegt. Die architectuur ontwerpen zodat hij snel, vindbaar en veilig blijft is precies het soort planning dat een Joomla-specialist doet voordat het eerste component gebouwd wordt.
Naar boven

Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.


