cms-core v3.49.0
01 / 10
CodeBlauw · het CMS achter onze sitesCodeBlauw · the CMS behind our sites

Eén kern.
Elke site.
One core.
Every site.

cms-core is het fundament onder al onze websites. Verbeteringen aan de gedeelde kern komen beschikbaar voor alle sites die erop draaien. Scroll door het verhaal, of probeer de onderdelen direct uit.cms-core is the foundation under all of our websites. Improvements to the shared core benefit every site that uses it. Explore the story and try the interactive examples.

144featuresfeatures
5modules
250gedocumenteerde releases in 133 dagendocumented releases in 133 days
cms-core v3.49.0 1 kern · 93 features1 core · 93 features Sitesmeerdere websitesmultiple websites Webshopproducten · betalenproducts · payments Geoplaatsen · postcodesplaces · postcodes Feedscontent uitwisselenshare your content KeuzehulpSelectorvragen · adviesquestions · advice

De kern beheert je content, publicaties en team. Modules voegen toe wat jouw website nodig heeft.The core manages your content, publishing and team. Modules add what your website needs.

Eén verbonden systeem.One connected system.

klik een module om erheen te gaanclick a module to jump to it

Hoofdstuk 1 · BouwenChapter 1 · Building

Pagina's bouw je uit blokken. Op maat van jouw ontwerp.Pages are built from blocks, made for your design.

Geen standaardthema: elke site krijgt eigen blokken. Redacteuren slepen ze in de juiste volgorde, vullen velden in en zien direct het resultaat. Probeer het hieronder.No stock theme: every site gets its own blocks. Editors drag them into order, fill in fields and see the result straight away. Try it below.

/beheer/content/pages/home
+
voorbeeld.nllive voorbeeldlive preview

sleep blokken, klik er één aan en pas de titel aandrag blocks, select one and edit its title

alle 41 ingebouwde veldtypes; modules voegen er meer toeall 41 built-in field types; modules add more

defineBlock · container blocks · bindings Een blok is code in de site zelf: velden, categorie, icoon en waar het mag staan. cms-core levert de bouwer, geen blokbibliotheek. Een blocks-veld maakt een containerblok, en _bindings koppelt een blokveld aan een veld van het item. A block is code in the site itself: fields, category, icon and where it's allowed. cms-core ships the builder, not a block library. A blocks field makes a container block, and _bindings ties a block field to an item field.
export default defineBlock({
  name: 'event_list',
  category: 'content',
  allowed_in_collections: ['pages'],
  fields: [
    { key: 'title', type: 'text', required: true },
    { key: 'items', type: 'blocks', max: 6 }, // container block
  ],
})
Hoofdstuk 2 · PublicerenChapter 2 · Publishing

Werk rustig aan een concept. Zet een eerdere versie terug wanneer nodig.Work on a draft. Restore an earlier version when you need to.

De live pagina blijft staan tot je publiceert. Elke versie wordt bewaard, je ziet precies wat er veranderde, en plant je iets in, dan staat het binnen een minuut na het gekozen moment live.The live page stays put until you publish. Every version is kept, you see exactly what changed, and anything you schedule goes live within a minute of the chosen time.

GeschiedenisHistorycontent_revisions
Vergelijken met liveCompare with live
Hoofdstuk 3 · SamenwerkenChapter 3 · Together

Zie wie er meewerkt en voorkom dat je elkaars wijzigingen overschrijft.See who is editing and avoid overwriting each other’s changes.

Collega's verschijnen live in het beheer. Een blok waar iemand aan werkt, gaat op slot. Je kunt een collega zelfs volgen om mee te kijken.Colleagues show up live in the admin. A block someone is editing gets locked. You can even follow a colleague to watch along.

/beheer/content/pages/over-onsJSAMKV
Hero
AM bewerkt dit blokAM is editing this blockTekstText
TeamTeam

voorbeeldcollega's; in het echt via een WebSocketsimulated collaboration; the CMS uses a WebSocket

/_cms/collabAanwezigheid, volgmodus en bloksloten lopen via één WebSocket met same-origin-check. Opslaan gebruikt optimistic locking: wie met een verouderde versie opslaat, krijgt een 409 in plaats van stil overschrijven.Presence, follow mode and block locks run over one WebSocket with a same-origin check. Saving uses optimistic locking: saving from a stale version returns a 409 instead of silently overwriting.
Hoofdstuk 4 · DashboardChapter 4 · Dashboard

Een startscherm dat past bij wie er inlogt.A start screen that fits whoever logs in.

Stel een standaard in voor het project en per rol. Iedereen schuift daarna zelf widgets rond, maar wat vastgezet is, blijft staan. Sleep de widgets hieronder.Set a default for the project and per role. Everyone then arranges their own widgets, but what's locked stays put. Drag the widgets below.

Dashboard16 widget types
Indeling van:Layout layer:

voorbeeldcijfers · modules zoals webshop en feeds brengen eigen widgets meeexample figures · modules like webshop and feeds bring their own widgets

Hoofdstuk 5 · VindbaarChapter 5 · Findable

SEO zit erin, terwijl je schrijft.SEO is built in, while you write.

Acht live checks, een Google-voorbeeld, structured data voor vacatures en producten, sitemaps, llms.txt, IndexNow en redirects met een lussencheck. Typ maar eens een focuswoord.Eight live checks, a Google preview, structured data for vacancies and products, sitemaps, llms.txt, IndexNow and redirects with a loop check. Try typing a focus keyword.

SEO
0/8checks geslaagdchecks passed
    Hoofdstuk 6 · FormulierenChapter 6 · Forms

    Stel je formulier samen. Bepaal ook wat er na verzenden gebeurt.Build your form. Choose what happens after submission.

    Velden, stappen, uploads en spambescherming. Daarna stuurt het formulier mails, webhooks of leads naar ActiveCampaign, afhankelijk van de antwoorden.Fields, steps, uploads and spam protection. Then the form sends emails, webhooks or leads to ActiveCampaign, depending on the answers.

    Velden toevoegenAdd fields15 types
    Na verzendenAfter submit
    /contact

    Hoofdstuk 7 · TalenChapter 7 · Languages

    Tweetalig beheer, twaalf talen op de site.A bilingual admin, twelve languages on the site.

    Deze pagina wisselt zelf van taal met de knop bovenaan. Het beheer doet hetzelfde, met 10.268 teksten in het Nederlands en Engels. Elke tekst pas je zelf aan.This page switches language with the toggle at the top. The admin does the same, with 10,268 interface strings in each language. You can change any of them yourself.

    Welkom

    nl · Nederlands

    10.268 × 210,268 × 2

    beheerteksten, plus een eigen laag per klant voor afwijkende woordenadmin strings, plus a per-client layer for custom wording

    Hoofdstuk 8 · ModulesChapter 8 · Modules

    Klik erbij wat je nodig hebt.Add what you need.

    Modules bouwen op cms-core zonder de kern te veranderen. Ze brengen hun eigen beheerschermen, velden, dashboardwidgets en vertalingen mee.Modules build on cms-core without changing the core. They bring their own admin screens, fields, dashboard widgets and translations.

    Alle demo’s op deze pagina gebruiken fictieve namen, content, producten en pakketten.All demos on this page use fictional names, content, products and plans.

    sites-module

    Eén installatie, een netwerk van sites.One install, a network of sites.

    Elke vestiging of merk krijgt een eigen (sub)domein, eigen kleuren en een eigen beheerportaal. Juridische pagina's en formulieren deel je. Klik een site aan.Each location or brand gets its own (sub)domain, its own colours and its own admin portal. Legal pages and forms are shared. Click a site.

    Bijvoorbeeld: een netwerk van merken, verenigingen of evenementensites met gedeeld beheer.For example: a network of brands, associations or event websites with shared administration.

    /beheer/sites
    Per site eigenEach site has its own
    Gedeeld door alle sitesShared by every site
    webshop-module

    Van catalogus tot afrekenen.From catalogue to checkout.

    Varianten met eigen prijs en voorraad, de juiste btw per land, een winkelwagen die onthoudt en betalen via Mollie of Stripe. Kies een formaat en een land.Variants with their own price and stock, the right VAT per country, a cart that saves your items and payment through Mollie or Stripe. Pick a size and a country.

    Bijvoorbeeld: een productcatalogus of een winkel voor fysieke artikelen. De demo toont alleen varianten, btw en de winkelwagen.For example: a product catalogue or a shop for physical goods. This demo illustrates variants, VAT and the cart.

    NotitieboekNotebook
    WinkelwagenCart0
    geo-module

    Elke plaats en postcode, ingebouwd.Every place and postcode, built in.

    Zoeken binnen een straal zonder externe dienst. Typ een plaats (probeer "Den Haag") en verschuif de straal.Radius search without an outside service. Type a place (try "Den Haag") and adjust the radius.

    Bijvoorbeeld: activiteiten in de buurt, een vestigingenzoeker of een overzicht van lokale diensten.For example: nearby activities, a branch finder or a directory of local services.

      fictieve activiteiten · echte coördinaten · afstand hemelsbreed (haversine)fictional activities · real coordinates · straight-line distance (haversine)

      feeds-module

      Jouw content, in het formaat van je partner.Your content, in a partner's format.

      Koppel velden aan feedvelden, kies opmaakstappen en zie de feed live ontstaan, als JSON of XML.Map fields to feed keys, pick formatting steps and watch the feed take shape, as JSON or XML.

      Bijvoorbeeld: artikelen voor een partnerplatform, een activiteitenagenda of een productfeed.For example: articles for a partner platform, an events calendar or a product feed.

      KoppelingenMapping/feeds/events
      modal-tools-kit

      Een keuzehulp die zich aanpast.A guided selector that adapts to your answers.

      Vragen die zich aanpassen aan eerdere antwoorden, en een gerangschikt advies aan het eind. De adviesregels worden per toepassing ingesteld.Questions that adapt to earlier answers, and ranked advice at the end. The matching rules are configured for each use case.

      Bijvoorbeeld: producten vergelijken, een passend dienstenpakket kiezen of de juiste informatie vinden. Probeer hieronder een fictieve pakketkeuze.For example: compare products, choose a service plan or find relevant information. Try the fictional plan selector below.

      ScoreFnDe kit weet niets van producten. Elke klant levert een pure scorefunctie; op de live site draait die op de server via cms-core, in de sandbox in de browser.The kit knows nothing about products. Each client supplies a pure scoring function; on the live site it runs on the server via cms-core, in the sandbox in the browser.
      type ScoreFn = (answers, items) => RankedResult[]
      // { item, score: 0-100, approximate }
      Hoofdstuk 9 · Onder de motorkapChapter 9 · Under the hood

      Gebouwd om lang mee te gaan.Built to last.

      cms-core is een Nuxt-laag. Een site breidt de modules uit, de modules breiden de kern uit. Werk de pakketversie bij om een nieuwere release te gebruiken.cms-core is a Nuxt layer. A site extends the modules, the modules extend the core. Update the package version to use a newer release.

      KlantsiteClient siteeigen blokken & huisstijlown blocks & brand
      Modulessites · webshop · geo · feeds · keuzehulp
      cms-core@codeblauw/cms-core
      Nuxt 4 · Nitro · PostgreSQLDrizzle · Kysely
      // a module adds a field type without touching the core
      registerFieldType({
        type: 'geo_city', label: 'Plaats', group: 'advanced',
        component: GeoCityField,
      })
      
      // …and its own dashboard widget
      registerDashboardWidgetServer({
        type: 'shop-orders',
        access: ({ actor }) => actor.isAdmin,
        load: ({ settings }) => getOrderStats(settings.period),
      })
      Beveiliging, standaard aanSecurity, on by default
      • Korte sessies met roterende tokens; hergebruik trekt de hele sessie inShort sessions with rotating tokens; reuse revokes the whole session
      • Blokkade bij herhaalde inlogpogingen, per IP en per accountLockout on repeated login attempts, per IP and per account
      • Inlog- en herstelmeldingen geven niet prijs welke accounts bestaanSign-in and recovery messages do not reveal which accounts exist
      • Rechten per sectie, per veld en "alleen eigen items"Permissions per section, per field and "own items only"
      • API-sleutels versleuteld opgeslagen (AES-256-GCM)API keys encrypted at rest (AES-256-GCM)
      • Weigert te starten met een zwak geheimRefuses to start with a weak secret
      CLI26 commando's in cms-core, plus een CLI per module (sites, webshop, geo, feeds). Migraties zijn idempotent; modules houden een eigen migratiejournaal bij.26 commands in cms-core, plus a CLI per module (sites, webshop, geo, feeds). Migrations are idempotent; modules keep their own migration journal.
      npx cms-core project:new
      npx cms-core db:migrate
      npx cms-core i18n:sync
      npx sites db:migrate-media --apply
      Hoofdstuk 10 · WeetjesChapter 10 · Fun facts

      In getallen.By the numbers.

      NaslagReference

      Alle features.Every feature.

      Het featureoverzicht, per module. Zet bovenaan "Onder de motorkap" aan voor de technische details.The feature overview, grouped by module. Switch on "Under the hood" at the top for the technical details.