Een contentsysteem dat van jou is

Geen dienst. Geen headless API. Geen dashboard waar je elders op inlogt. Vinum is een handvol pakketten die je importeert: de admin hangt in je eigen routeboom, de loaders draaien op je eigen server, en je content staat in je eigen opslag, op je eigen schijf. Niets om in de lucht te houden, geen sleutel om te roteren.
Fig. 1Uit elkaar
Een opengewerkte tekening van een Vinum-installatie: je React Router-app, het routebestand, de bekabelingsmodule, je blokken, de admin, de Store-adapter en je contentbestand, langs één as.10121416182022
Kies een onderdeel om het te bekijken

Elk onderdeel van een installatie, uit elkaar getekend. In elkaar zit het allemaal binnen de grens van een app die je toch al deployt — en dat is het hele argument.

Referentienummers
10
Jouw React Router-appDe grens waar al het andere binnen valt. Vinum voegt geen eigen proces toe, geen container naast de jouwe en geen tweede origin.
12
app/routes.tsvinumRoutes() geeft routedefinities terug. Jij kiest waar ze hangen en zet je eigen routes eromheen.
14
app/vinum.server.tsDe hele bekabeling — site, opslag, media, auth — in één bestand, in jouw repo. Verderop op dit blad is het Listing 1.
16
app/blocks.tsxJe eigen blokken, geregistreerd via dezelfde defineBlock als de kernblokken. Deze figuur is er één van.
18
De admin, op /adminHangt in je eigen routeboom en wordt geschilderd door jouw negentien variabelen. Een scherm van je site, geen dashboard elders.
20
De Store-adapterVijf methodes over een key-value-interface. fs, Deno KV, geheugen, of eentje die je zelf op een middag schrijft.
22
data/store.jsonJouw content, op jouw schijf, als gedocumenteerde sleutels en gewone JSON. Eén commando haalt alles er weer uit.

De admin is een scherm van je site

Een admin op /admin, pagina's op /<slug>, concepten, versies, ingeplande publicaties, media, formulieren en redirects — binnen de app die je toch al deployt.

De figuren op deze pagina zijn geen mockups. Vinum rendert geen eigen kleur: negentien CSS-variabelen stylen zowel de publieke renderer als de hele admin, en deze site zet ze één keer. De admin is dus inkt op papier omdat de pagina dat is.

Fig. 2
De landingspagina in bewerkstand: een alinea met een bewerkkader eromheen, met het instellingenpaneel ernaast.
Bewerken gebeurt op de pagina zelf, in de lay-out die hij echt krijgt, met de eigen componenten van de site. De inline-editor en de publieke renderer zijn één codepad in twee standen — daarom is deze figuur een schermafbeelding van de pagina die je nu leest.
  1. het blok dat wordt bewerkt, ter plekke omkaderd
  2. de instellingen, voor wat je niet kunt intypen
  3. hetzelfde vensterkader als de publieke pagina

Vijf beloftes

Elke belofte kost iets om na te komen. Daarom is het er een.

Wat hier wordt geclaimd:

  1. Je data leeft langer dan onze code

    Sleutels zijn strings, waarden gewone JSON. Geen ORM, geen migratieframework, geen eigen formaat — met een SQLite-viewer lees je je eigen content. Vendor lock-in is een bug.

  2. Saai met opzet

    Web-standaard Request en Response. Web Crypto. Een key-value-interface met vijf methodes. Elke afhankelijkheid die wij toevoegen is een upgrade die jij ooit moet uitvoeren, dus we voegen er bijna geen toe.

  3. Veilig door constructie, niet door discipline

    Niets wat is ingevoerd wordt vertrouwd — niet uit de editor, niet uit een importbestand, niet van een agent met een tool. Elke schrijfactie gaat door een zuivere sanitizer die weggooit wat hij niet herkent. Nooit rauwe HTML uit data.

  4. Het CMS heeft geen smaak — het heeft één plek voor de jouwe

    Vinum levert structuur en een stijlcontract; jij levert de waarden. Een redacteur kiest wat een blok zegt en welke variant het draagt, nooit de kleur of de witruimte. Precies die grens zorgt dat een klant een middag kan tekstschrijven zonder de lay-out te slopen.

  5. Bewerken gebeurt waar de content staat

    Op de pagina zelf, in de lay-out die hij echt krijgt, met jouw eigen componenten. Geen formulier links en een preview rechts.

Fig. 3
De blokkenkiezer van Vinum, met kernblokken naast de eigen blokken van deze site.
De kern levert de blokken die vrijwel elke site nodig heeft. Die onder Deze site zijn in deze repo geregistreerd via dezelfde defineBlock-API als de kernblokken — inclusief het venster, de menuregels en de figuurplaat die je hierboven las. Uitbreiden is geen pluginlader; het is TypeScript in je eigen codebase.
  1. kernblokken — de vaste set
  2. de eigen blokken van deze site

Je kunt weg

Dit stuk staat er omdat het antwoord elders vaak "dat kan niet" is. Wix schrijft in de eigen helpdocumentatie dat een Wix-site op Wix' servers gehost en beheerd moet worden, dus weggaan betekent opnieuw bouwen in plaats van verhuizen.

Vinum exporteert alles als één JSON-bestand. Eén commando, op een site die je een jaar niet hebt aangeraakt, zonder dat je eerst iets hoeft te lezen.

Ook vanuit de admin, of met één regel code. Het is geen aparte exportstand — het is hetzelfde codepad dat het back-upscherm elke dag gebruikt. Draai het vóór je voor Vinum kiest, niet erna: een nooduitgang die je niet hebt getest, is er geen.

Listing 1 — terminal
npx vinumcms export
Listing 2 — store-backup.json
{  "version": 1,  "exportedAt": 1754481600000,  "entries": [    { "key": ["page", "about"], "value": { "slug": "about", "title": "About" } },    { "key": ["rev", "about", 1754000000000], "value": {} }  ]}
Dat is het hele formaat: een platte lijst sleutel-waardeparen, met dezelfde gedocumenteerde sleutels die de draaiende site gebruikt.

Wat het weigert te zijn

  • Een headless API

    Wil je content over GraphQL bevragen vanuit een losse frontend, dan is Vinum het verkeerde gereedschap. Het zit bewust vast aan de app die het rendert — juist die koppeling levert inline bewerken en één deployment op.

  • Multi-tenant SaaS

    Eén installatie, één site, één bestandssysteem. Alles daarbuiten verandert elke beveiligingsaanname in de codebase.

  • Een plugin-marktplaats

    Uitbreiden doe je in je eigen codebase, in TypeScript, met types. Er is geen pluginlader en die komt er niet. Van de 11.334 WordPress-kwetsbaarheden die in 2025 zijn gemeld zat 91% in plugins.

  • Een paginabouwer met zestig blokken

    De kern levert de blokken die vrijwel elke site nodig heeft, als vaste set waaruit je kiest en die je ter plekke aanpast. Jouw eigenwijze hero hoort in jouw repo.

  • Een e-commerceplatform

    Vinum is gegroeid in een horlogewinkel en die winkelcode is daar gebleven. Vinum kent pagina's, geen producten.

Een eerlijke vergelijking

Vinum is klein met opzet, en klein heeft een prijs. De laatste rij telt het zwaarst als je hiertussen moet kiezen.

VinumWordPress
UitbreidenTypeScript in je eigen repo, via dezelfde API als de kernblokken.Een plugin-ecosysteem — en 91% van de 11.334 meldingen in 2025 zat in plugins.
WeggaanEén JSON-bestand met gedocumenteerde sleutels, te importeren in een verse installatie.Exporters bestaan, met een betrouwbaarheid die afhangt van welke plugins je content schreven.
Waar je bewerktOp de pagina, in de echte lay-out, met jouw componenten.Gutenberg. Het oordeel over 340+ meningen is ongeveer kop of munt.
BeheerGeen. Het deployt met je app omdat het onderdeel is van je app.Een PHP-host, updates voor kern en plugins, en een beveiligingsoppervlak om bij te houden.
EcosysteemVrijwel geen. Heb je iets nodig dat niemand schreef, dan schrijf je het zelf.Enorm, en een echt voordeel. Wat je nodig hebt bestaat waarschijnlijk al.

Installeren

Listing 3 — terminal
npm install @vinumcms/core @vinumcms/adapters \  @vinumcms/server @vinumcms/react @vinumcms/admin npx vinumcms doctor   # controleert de drie instellingen die stil falen
Daarna de module die in Fig. 1 als onderdeel 14 is getekend, de routes koppelen, en inloggen op /admin. De handleiding staat bij het admin-pakket.

De installatiehandleiding — installeren, bekabelen, de drie build-instellingen en de negentien themavariabelen.

De documentatie — core, server, react, admin, adapters, en mail als je post verstuurt.

Read this in English