Terug naar hoofdinhoud
Headless Joomla
Op deze pagina

Headless Joomla

17 juni 2026

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 boven

2. 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.

Naar boven

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:

StrategieWanneer de pagina gebouwd wordtHet 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 boven

5. 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 boven

6. 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 GET over de artikelen, waarbij alleen de velden die ertoe doen worden opgehaald.
  • Schrijven van content terug wanneer de assistent iets produceert: een POST of PATCH, 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 boven

7. 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.

Naar boven

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 boven

9. 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.

Naar boven

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:

LaagWat 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 boven

11. 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.

Naar boven

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.

Naar boven

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.
Naar boven

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 boven

15. 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
Headless Joomla
Peter Martin
Peter Martin

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