Het schrijven van een CV is voor de meeste professionals een terugkerend ritueel. Een Word-document openen, marges aanpassen, worstelen met de opmaak, en uiteindelijk toch weer een PDF exporteren die er net niet uitziet zoals bedoeld. Voor data-professionals die dagelijks met tooling en automatisering werken, voelt dat onnodig omslachtig.
Dat was de aanleiding om bij WNK Data een eigen CV-builder te ontwikkelen. Niet als commercieel product, maar als intern hulpmiddel dat precies doet wat nodig is — en tegelijkertijd als showcase van wat er mogelijk is wanneer een data-achtergrond gecombineerd wordt met moderne webontwikkeling. Het resultaat draait live op cv.wnkdata.nl.
Een eigen webapplicatie
Het idee ontstond uit een praktische frustratie. Bij elke nieuwe opdracht hoort een op maat geschreven CV, afgestemd op de specifieke vraag van de opdrachtgever. Dat betekent: regelmatig dezelfde basisinformatie opnieuw rangschikken, accenten verleggen, en zorgen dat het eindresultaat er professioneel uitziet. Bestaande tools zoals Canva of Europass bieden templates, maar weinig flexibiliteit. En een compleet Word-document herformatteren kost meer tijd dan het zou moeten.
Zo begon het project. Niet met een uitgebreid ontwerpdocument, maar met een werkend prototype en de nieuwsgierigheid om te kijken hoe ver het kon komen.
Vibe coden met AI
De CV-builder is gebouwd in een stijl die het best omschreven kan worden als "vibe coding" — een manier van ontwikkelen waarbij AI-assistenten een actieve rol spelen in het schrijven van code, terwijl de ontwikkelaar de richting bepaalt, architectuurkeuzes maakt en de kwaliteit bewaakt.
Dat betekent niet dat er blind code werd overgenomen. Elke suggestie werd beoordeeld, getest en waar nodig aangepast. Het proces leek meer op een doorlopend gesprek met een ervaren collega dan op het uitbesteden van werk. De snelheid waarmee functies tot stand kwamen was opmerkelijk, maar de echte waarde zat in de mogelijkheid om snel te itereren: een idee uitproberen, evalueren, en doorontwikkelen of verwerpen.
Deze aanpak maakte het mogelijk om in relatief korte tijd een volwaardige applicatie neer te zetten, inclusief features die bij een traditionele aanpak waarschijnlijk in de "nice-to-have" kolom waren blijven staan.
Architectuur en technische keuzes
De applicatie bestaat uit twee lagen: een frontend voor de gebruikersinterface en een backend voor opslag en authenticatie.
Frontend
De frontend is gebouwd met React 18 en TypeScript, gebundeld met Vite. React was een logische keuze vanwege de component-gebaseerde architectuur: een CV bestaat uit secties (werkervaring, opleiding, vaardigheden), en die secties gedragen zich als herbruikbare bouwblokken. TypeScript voegt daar typeveiligheid aan toe — het vangt fouten op voordat ze in de browser verschijnen.
Voor de styling wordt Tailwind CSS gebruikt. Tailwind werkt met utility-klassen direct in de HTML, wat het snel en voorspelbaar maakt. Geen aparte stylesheet-bestanden die uit sync raken met de componenten.
State management — het bijhouden van de applicatiestatus, zoals welk CV actief is en welke secties zichtbaar zijn — wordt afgehandeld door Zustand. Zustand is een lichtgewicht alternatief voor grotere oplossingen zoals Redux. Het doet precies wat nodig is zonder onnodige complexiteit toe te voegen.
Backend
De backend draait op Node.js met Express en gebruikt SQLite als database. SQLite is een database die in een enkel bestand leeft, zonder aparte databaseserver. Voor een applicatie met een beperkt aantal gebruikers is dat meer dan voldoende, en het maakt deployment en backups eenvoudig.
Authenticatie verloopt via JWT-tokens (JSON Web Tokens) met een httpOnly refresh cookie. Dat betekent dat de browser het refresh-token niet via JavaScript kan uitlezen, wat bescherming biedt tegen bepaalde beveiligingsrisico's.
Een bewuste ontwerpkeuze is de localStorage-first aanpak. De primaire opslag van CV-data vindt plaats in de browser zelf. Pas daarna wordt er gesynchroniseerd met de SQLite-database op de server. Dit zorgt ervoor dat de app snel aanvoelt — er hoeft niet op een serverrespons gewacht te worden bij elke wijziging — en dat offline bewerken in principe mogelijk is.
Deployment
De frontend wordt gebouwd via het standaard Vite build-proces en geserveerd als statische bestanden. De backend API draait als achtergrondproces, beheerd door PM2 — een process manager die ervoor zorgt dat de Node.js-server automatisch herstart bij een crash of serverreboot. Het geheel draait achter nginx op een eigen VPS.
Functionaliteit
De CV-builder is geen kaal formulier met een exportknop. In de loop van de ontwikkeling zijn er features bijgekomen die het verschil maken in dagelijks gebruik:
- Twee layouts: een klassieke opmaak en een variant met zijbalk. Afhankelijk van het type opdracht of de voorkeur van de ontvanger kan er gewisseld worden.
- PDF-export: het uiteindelijke doel van elk CV. De export levert een schoon, print-klaar document op.
- Spellingscontrole: de productieversie beschikt over een server-side integratie met LanguageTool. Teksten worden automatisch gecontroleerd op spel- en grammaticafouten, met suggesties direct in de editor. Woorden kunnen genegeerd worden per document, per instantie of globaal — die voorkeuren worden lokaal opgeslagen. In de demoversie is deze functie niet beschikbaar omdat er geen serververbinding is; daar valt de app terug op de standaard spellingscontrole van de browser.
- Foto-upload: voor CV's waar een profielfoto gewenst is.
- Meerdere CV's per gebruiker: verschillende varianten naast elkaar, zonder kopieer-en-plakwerk.
- Taalondersteuning: Nederlands en Engels, met de mogelijkheid om per CV de taal in te stellen.
- Thema's: visuele variatie in kleuren en stijl.
- Drag-and-drop sectievolgorde: secties slepen naar de gewenste positie, in plaats van knip-en-plakwerk.
- Multi-level bullet lists: geneste opsommingen voor het gestructureerd weergeven van taken en verantwoordelijkheden.
Data-opslag en privacy
Een CV bevat persoonlijke gegevens. Hoe daar mee omgegaan wordt, verdient toelichting.
De applicatie hanteert een localStorage-first aanpak: CV-data wordt primair opgeslagen in de browser van de gebruiker. Bij de productieversie op cv.wnkdata.nl wordt daarnaast automatisch gesynchroniseerd met een eigen server, zodat gegevens bewaard blijven bij het wisselen van apparaat. Alle communicatie verloopt via HTTPS. Er worden geen gegevens gedeeld met derden, en er is geen tracking of analytics actief in de applicatie.
De openbare demoversie op demo.cv.wnkdata.nl gaat nog een stap verder in eenvoud: daar verlaat geen enkel gegeven de browser. Er is geen account nodig, er worden geen cookies geplaatst en er is geen serververbinding. De data bestaat uitsluitend lokaal en verdwijnt bij het wissen van de browsergegevens.
Het onderscheid is bewust. De productieversie biedt het gemak van synchronisatie en een beveiligde login. De demoversie biedt de mogelijkheid om de tool vrijblijvend uit te proberen, zonder zorgen over wat er met de ingevulde gegevens gebeurt: het antwoord is simpelweg niets.
Inzichten
Elk project levert inzichten op. Een paar van de belangrijkste:
localStorage als primaire bron heeft voordelen en nadelen
De keuze om localStorage centraal te zetten maakt de app snel en responsief. Maar het introduceert ook complexiteit bij het synchroniseren met de server. Wat gebeurt er als dezelfde gebruiker op twee apparaten werkt? Welke versie wint? Dit soort conflicten vereist een doordachte sync-strategie. Voor een persoonlijke tool is de huidige aanpak werkbaar, maar bij opschaling zou dit een van de eerste onderdelen zijn die heroverwogen wordt.
SQLite is krachtig genoeg voor meer dan je denkt
Er bestaat een neiging om bij webapplicaties meteen naar PostgreSQL of MySQL te grijpen. SQLite wordt vaak onderschat, maar voor toepassingen met een beperkt aantal gelijktijdige schrijfoperaties is het een uitstekende keuze. Geen aparte server, geen configuratie, en het hele databestand past in een enkel bestand dat makkelijk te back-uppen is.
Vibe coding versnelt, maar vervangt vakkennis niet
AI-assistenten zijn bijzonder effectief voor het genereren van boilerplate-code, het uitwerken van standaardpatronen en het snel prototypen van ideeën. Maar de kwaliteit van het eindresultaat hangt af van de kwaliteit van de sturing. Zonder begrip van architectuurprincipes, beveiligingsoverwegingen en gebruikerservaring zou dezelfde tooling tot een heel ander resultaat leiden. De ontwikkelaar bepaalt nog altijd het niveau.
Kleine features maken het verschil
Drag-and-drop voor sectievolgorde en multi-level bullet lists klinken als details. In de praktijk zijn het precies de features die het verschil maken tussen een tool die "werkt" en een tool die prettig is om te gebruiken. Het loont om tijd te investeren in dit soort interactiedetails.
Verbeterpunten
Geen enkel project is ooit af, en achteraf zijn er altijd dingen die anders of beter hadden gekund.
- Testing: de huidige testdekking is beperkt. Bij een project dat organisch groeit, is het verleidelijk om tests uit te stellen. In een volgende iteratie zou een degelijke set unit- en integratietests bovenaan de lijst staan.
- Sync-strategie: de localStorage-first aanpak werkt goed voor een enkele gebruiker op een enkel apparaat. Een robuustere synchronisatielaag zou de app geschikter maken voor breder gebruik.
- Openbare demo: inmiddels beschikbaar op demo.cv.wnkdata.nl. Een volledig client-side versie zonder login, waar de tool vrijblijvend uitgeprobeerd kan worden.
- Toegankelijkheid: een grondige toets op WCAG-richtlijnen zou de app breder inzetbaar maken.
Roadmap
De CV-builder is een werkend product, maar de roadmap is niet leeg. Een aantal plannen die op de tekentafel liggen:
- AI-gegenereerde teksten: het schrijven van profielteksten en functiebeschrijvingen is een van de meest tijdrovende onderdelen van een CV. De integratie van AI-ondersteuning die op basis van kernwoorden en context een eerste versie genereert, zou dat proces aanzienlijk versnellen.
- Automatische briefopzet: een begeleidende brief hoort bij een CV, maar begint vaak bij een leeg document. Op basis van de CV-inhoud en een korte omschrijving van de opdracht zou de app een concept-brief kunnen genereren dat als startpunt dient.
- Template-uitbreiding: naast de huidige Classic en Sidebar lay-outs zijn er meer varianten denkbaar die aansluiten bij verschillende sectoren en voorkeuren.
Geen van deze features is beloofd, maar ze laten zien in welke richting het project zich ontwikkelt: van een tool die helpt bij het vormgeven van informatie naar een tool die ook helpt bij het formuleren ervan.
Afsluiting
De CV-builder op cv.wnkdata.nl begon als een praktische oplossing voor een alledaags probleem en groeide uit tot een volwaardige webapplicatie.
Tegelijkertijd is het een eerlijk voorbeeld van hoe softwareontwikkeling in de praktijk werkt: met bewuste keuzes, pragmatische compromissen en een backlog die altijd langer is dan de beschikbare tijd. En dat is prima. Het belangrijkste is dat de tool doet wat het moet doen, en dat het bouwen ervan net zo leerzaam was als het eindresultaat zelf.