Een block-based CMS voor React Router

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. Er is niets om in de lucht te houden en geen sleutel om te roteren.

// app/vinum.server.tsexport const vinum = registerVinum(  defineVinum({    site:  { name: "My Site" },    store: denoKvStore({ path: "./data/kv.sqlite" }),    media: fsMedia({ dir: "./data/media" }),    auth:  { cookieName: "site_admin", secret: env("SESSION_SECRET") },  }),);
Dat is een compleet CMS: een admin op /admin, pagina's op /<slug>, concepten, versies, ingeplande publicaties, media, formulieren en redirects.

Wat we beloven

Vijf beloftes

  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. De inline-editor en de publieke renderer zijn één codepad in twee standen.


De nooduitgang

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; je exporteert een CMS-collectie als CSV en verder niets, dus weggaan betekent opnieuw bouwen.

Vinum exporteert alles als één JSON-bestand — vanuit de admin, of met één regel code. Het is geen aparte exportstand. Het is hetzelfde codepad dat het back-upscherm elke dag gebruikt.

{  "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. Lees het vóórdat je voor Vinum kiest — een nooduitgang die je niet hebt gecontroleerd is er geen.

Bewuste weglatingen

Zeggen voor wie iets niet is, is hoe de juiste persoon zichzelf herkent. Niets hiervan staat op een roadmap.

Wat het weigert te zijn

Een headless API?
Nee. 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?
Nee. Eén installatie, één site, één bestandssysteem. Alles daarbuiten verandert elke beveiligingsaanname in de codebase.
Een plugin-marktplaats?
Nee. 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?
Nee. De kern levert de blokken die vrijwel elke site nodig heeft, als vaste set waaruit je kiest en die je ter plekke aanpast — geen doos bouwstenen, en geen palet dat een zoekveld nodig heeft. Jouw eigenwijze hero hoort in jouw repo, geregistreerd via dezelfde publieke API als onze eigen blokken.
Een e-commerceplatform?
Nee. Vinum is gegroeid in een horlogewinkel en die winkelcode is daar gebleven. Vinum kent pagina's, geen producten.

Waar het staat

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.

Begin hier

Installeren

npm install @vinumcms/core @vinumcms/adapters \  @vinumcms/server @vinumcms/react @vinumcms/admin npx vinumcms doctor   # controleert de drie instellingen die stil falen
Daarna vijftien regels bekabeling, de routes koppelen, en inloggen op /admin. De installatiehandleiding staat bij het admin-pakket.

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

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

Vinum is klein met opzet. Voelt het ooit groot, dan is er iets misgegaan.

Read this in English