De demo werkt. Productie is een ander vak.
Je beschreef een app aan Lovable, Cursor of Bolt, en een paar uur later had je iets dat draait. Pagina’s, een login, een database, een werkende flow. Het demot prachtig. Dus je zet er echte gebruikers op, en daar begint de ellende.
De reden is saai en voorspelbaar: AI schrijft code die werkt, nog voordat het code schrijft die veilig is. Security, foutafhandeling en toegangscontrole zijn onzichtbaar in een demo, dus slaat het model ze standaard over. De tools doen precies waarvoor ze gemaakt zijn, en in een demo komt de code die echte gebruikers beschermt gewoon nooit aan bod. In Veracode’s analyse van AI-gegenereerde code uit 2025 bevatte 45% minstens één kwetsbaarheid uit de OWASP Top 10, en onafhankelijke studies leggen de kwetsbaarheidsdichtheid op ongeveer 2,7 keer die van handgeschreven code.
We schreven eerder over waarom vibe-coded projecten vastlopen in de laatste 20% van een vibe-coded project. Dit is de andere helft: wat je er concreet aan doet, in de volgorde die telt.
Begin met uitzoeken wat de AI eigenlijk gebouwd heeft
Je kunt geen code beveiligen die je niet begrijpt. Voordat je een regel aanpast, maak een eerlijke inventarisatie van wat er onder de motorkap zit, want vibe coding verbergt die keuzes voor je terwijl je bouwt.
De stack
Welk framework, welke database, welke hosting. De AI koos die voor je. Je moet weten wat het is voordat je kunt beoordelen of het houdbaar is.
Waar de secrets staan
Zoek elke API-key, database-URL en token, en controleer of ze in de frontend staan waar elke bezoeker ze kan lezen. Dit is het meest voorkomende lek in vibe-coded apps.
Het datamodel
Welke tabellen bestaan er, wat hangt aan wat, en vooral: wat weerhoudt de ene gebruiker ervan de rijen van een ander te lezen. Vaak is het antwoord niets.
Het autorisatiemodel
Wie mag wat, en of dat op de server wordt gecontroleerd of alleen in de interface is weggemoffeld. Een verborgen knop is geen recht.
Een middag lezen voordat je iets aanraakt bespaart je hetzelfde probleem drie keer oplossen.
De beveiligingsgaten eerst, en in deze volgorde
Niet elk gat is even gevaarlijk. Fix de dingen waarmee je vandaag gehackt wordt vóór de dingen die je volgende maand vertragen. Dit is de volgorde waarin wij werken.
Haal secrets uit de frontend
API-keys en database-gegevens in client-side JavaScript zijn leesbaar voor iedereen die de dev tools opent. Zet elke secret in server-side environment variables en vervang de sleutels die zijn blootgesteld.
Zet de database op slot
Zet row-level security aan op elke tabel, zodat de database zelf afdwingt wie wat ziet. Het klassieke Lovable-plus-Supabase-lek is een tabel die iedereen mag lezen: gebruiker A haalt stilletjes de data van gebruiker B op.
Controleer rechten op de server
Elke API-call die data wijzigt of teruggeeft moet server-side verifiëren dat deze gebruiker dit met dit record mag doen. Vertrouw dat nooit aan de frontend toe.
Dicht injection en XSS
Parameterized queries in plaats van aan elkaar geplakte SQL-strings, en ge-escapete output in plaats van rauwe invoer die in de pagina belandt. De oudste aanvallen die er zijn, en AI voert ze telkens opnieuw in.
Voeg rate limiting toe
Niets houdt iemand tegen die je login of je betaalde API duizend keer per seconde bestookt, want de AI voegt het nooit toe. Een simpele limiet per IP maakt van een dure storing een non-event.
Een demo heeft één vriendelijke gebruiker die precies doet wat je verwachtte. Productie heeft vreemden, bots en vergissingen die tegelijk op elk pad drukken. Security is de code die dat tweede geval afhandelt, precies de code die een demo nooit nodig had.
Maak het dan bestand tegen echte gebruikers
Zodra het veilig is, maak het robuust. Het happy path werkt altijd. Productie is alles wat gebeurt als de invoer fout is, het netwerk wegvalt of een dienst plat ligt.
Vang de ongelukkige paden af
Elke externe call kan een timeout geven en elk formulierveld kan leeg of verkeerd binnenkomen. Vang ze af, valideer invoer op de server, en geef een echte melding terug in plaats van een wit scherm of een crash.
Zie wat er gebeurt
Gestructureerde logging, uptime-monitoring en een error-tracker als Sentry. Zonder die drie hoor je van een storing via een boze klant in plaats van via een alert, uren te laat.
Maak back-ups van de data
Automatische database-back-ups, en een restore die je één keer echt hebt getest. Een back-up die je nooit hebt teruggezet is een gok, geen vangnet.
Leg een vangnet voordat je iets verandert
Vibe-coded projecten hebben bijna nooit tests, waardoor elke latere aanpassing, door jou of door de volgende AI-prompt, een gok is dat er niets anders sneuvelt. Voordat je verder bouwt, schrijf tests rond de paden die je je niet kunt veroorloven te breken: login, betalingen, alles wat data wegschrijft. Dat is wat je in staat stelt snel te blijven bewegen zonder telkens productie om te leggen.
Deploy alsof het echt is
Het gat tussen een preview-URL en een product is een handvol onglamoureuze stappen die vibe coding volledig overslaat.
Gescheiden omgevingen
Een staging-omgeving waar je wijzigingen test voordat ze de gebruikers raken, met een eigen database. Dus geen losse live app die je rechtstreeks in productie aanpast terwijl je duimt dat er niets sneuvelt.
Config en secrets per omgeving
Sleutels en instellingen die bij het deployen worden ingespoten, en nooit in de repository staan. Andere waarden voor staging en live, op één plek beheerd.
Een herhaalbare deploy
Eén commando of één pipeline die bouwt en uitrolt, zodat releasen geen handmatig ritueel is dat je om 23:00 uur verknalt. HTTPS aan, back-ups ingepland, restore getest.
Weet wanneer je stopt met pleisters plakken en hulp haalt
Een deel hiervan kun je zelf, met dezelfde AI-tools die de app bouwden, zolang je weet wat je moet vragen. Maar er is een punt waarop pleisters plakken niet meer helpt: als de authenticatie niet bij de architectuur past, als de database-structuur niet gaat schalen, als een betaalintegratie betekent dat je moet uitpluizen hoe de hele backend is opgezet. Dat zijn ontwerpbeslissingen, en geen enkele prompt lost een ontwerpbeslissing netjes op.
Dat is het moment waarop een review zichzelf terugverdient. Een vibe coding audit vertelt je precies welke van bovenstaande stappen je app mist en hoe diep de fixes gaan, voordat je een maand aan de verkeerde besteedt. En wil je het verstevigen en hosten liever overlaten aan een team dat dit dagelijks doet, dan is dat managed development: jij blijft tweaken in Cursor terwijl wij de productiekant overeind houden.
Conclusie: je verstevigt, je herbouwt niet
De fout die teams maken is een vibe-coded MVP behandelen als af of als waardeloos. Het is geen van beide. Het bewees het idee sneller dan welk traditioneel proces dan ook had gekund, en dat is echt waardevol. Productieklaar maken is de tweede helft van het werk, en dat is een andere helft.
De MVP bewees het idee
Daar is vibe coding briljant voor. Snel, goedkoop, goed genoeg om aan echte gebruikers te tonen en te leren of het überhaupt de moeite waard is.
Productie is een ander vak
Security, betrouwbaarheid, tests en deploy. Werk de checklist op volgorde af en je verstevigt wat je hebt in plaats van opnieuw te beginnen.
Werk de lijst van boven naar beneden af, fix eerst de gehackt-word-je-vandaag-items, en je maakt van een veelbelovend prototype iets dat je met een gerust hart voor betalende klanten kunt zetten, zonder de snelheid te verliezen die je hier bracht.
Is een vibe-coded app veilig genoeg voor productie?
Hoe maak ik een Lovable- of Cursor-app productieklaar?
Wat is het grootste beveiligingsrisico in AI-gegenereerde code?
Moet ik een vibe-coded app herbouwen om naar productie te gaan?
Hoe lang duurt het om een vibe-coded MVP productieklaar te maken?
Niet zeker wat jouw app mist?
Wij brengen vibe-coded apps naar productie voor de kost. Een audit om precies in kaart te brengen wat er tussen jouw MVP en echte gebruikers staat, en hands-on hulp om het te fixen.