Het begon allemaal met "gratis"
Twee weken geleden namen we een besluit: gratis AI-modellen lanceren, zodat meer gebruikers Reverie konden ervaren.
Die avond trok het team een paar blikjes Pepsi open om het te vieren. (Ja, specifiek Pepsi.)
We tikten onze blikjes tegen elkaar en zagen het aantal aanmeldingen in realtime oplopen. Iemand haalde een grafiek met groeiprognoses tevoorschijn. De sfeer was goed.
72 uur later begrepen we waarom ervaren oprichters er altijd een beetje moe uitzien.
Wat volgde was een reeks aanvallen in vier golven die aanvoelde als een boss rush — alleen leerden wij de mechanieken terwijl we al klappen kregen.
Maar eerst het allerbelangrijkste: je accountgegevens, gesprekken en persoonlijke informatie zijn nooit gecompromitteerd geweest. Ze zijn nu veilig en dat blijven ze. We hebben een speciaal beveiligingsteam dat 24/7 monitort, en deze aanvallen waren gericht op onze middelen en onze portemonnee, niet op jouw gegevens. De aanvallers wilden onze bandbreedte en ons geld — je gesprekken met je AI-metgezellen zijn nooit in gevaar geweest.
Laten we nu doornemen wat er is gebeurd.
Golf 1: het crawlerleger
Wat er gebeurde
Dag twee na de gratis lancering. Ochtendstand-up. Een engineer merkt terloops op: "Hé, onze personage-API kreeg gisteren een paar honderd keer zoveel verzoeken."
Wij: "Wauw, die gratis lancering slaat echt aan!"
Engineer: "...maar het aantal dagelijks actieve gebruikers is nauwelijks veranderd."
Ongemakkelijke stilte.
We doken in de logs en ontdekten crawlers die systematisch onze openbare personagegegevens oogstten. Namen, bio's, avatars — de openbaar zichtbare informatie. Weggezogen door bots.
Voor de duidelijkheid: de kernbeschrijvingen van personages, de persoonlijkheidsinstellingen en andere privé-inhoud van makers zijn nooit blootgesteld — alleen makers kunnen die zien. Maar zelfs het op industriële schaal scrapen van openbare informatie is frustrerend als je probeert een gezond platform te bouwen.
Hoe we reageerden
- Pagineringslimieten ingevoerd bij het ontdekken van personages (je kunt bladeren, maar je kunt niet de hele bibliotheek downloaden)
- Slimme rate limiting ingezet die onderscheid maakt tussen "enthousiaste gebruiker" en "absoluut een bot"
- Gedragsanalyse gebouwd om crawlerpatronen te herkennen en te blokkeren
- Wat... laten we het "creatieve reacties" noemen toegevoegd voor bevestigde kwaadwillenden
Wat we leerden
"Open platform" betekent niet "all-you-can-eat-buffet". Zelfs openbaar zichtbare inhoud verdient redelijke toegangsgrenzen. We willen dat gebruikers personages ontdekken — niet dat ze van de ene op de andere dag een concurrerende database opbouwen.
Golf 2: de bandbreedtehuurmoordenaars
Wat er gebeurde
We hadden de gaten voor de crawlers nauwelijks gedicht toen golf twee toesloeg. En deze ging recht op de portemonnee af.
Iemand had onze media-URL's uitgevogeld en begon massaal elke afbeelding en elke video op het platform te downloaden. Personageportretten. Gegenereerde video's. Alles met een bestandsextensie werd op maximale snelheid binnengehaald.
We gebruikten de OSS-dienst van een grote cloudprovider. Betalen per bandbreedte. Leek destijds redelijk.
Maandagochtend. Finance opent de cloudconsole. Het factuurdashboard laadt.
Hun gezicht: 😐
Dashboard is klaar met laden: 😮
Ziet het werkelijke bedrag: 😱
"Eh, dus... onze bandbreedterekening is op dit moment hoger dan drie maanden runway."
Het werd heel stil in het Slack-kanaal. Iemand stelde nerveus voor om het CDN gewoon uit te zetten. Iemand anders wees erop dat dan ook het hele platform uit zou gaan.
Hoe we reageerden
Noodmigratie. Bestemming: Cloudflare R2 en Cloudflare Stream.
Hier moeten we Cloudflare officieel bedanken — het beleid van R2 zonder egresskosten heeft ons gered. Als je je rekening met honderden dollars per uur ziet oplopen, wordt "geen egresskosten" heel, heel relevant.
De migratie duurde 30 uur. Slaap werd optioneel. Codereviews om 3 uur 's nachts hebben iets meditatiefs.
Was het het waard? Absoluut. Onze bandbreedtekosten daalden met meer dan 90%, en de massadownloads van de aanvallers kosten ons nu vrijwel niets.
Wat we leerden
Vraag bij het kiezen van infrastructuur niet alleen "hoe snel is het?" Vraag ook: "Als iemand me morgen aanvalt, kan ik dan nog steeds de huur betalen?"
Deze dimensie van infrastructuurplanning staat in de meeste tutorials niet. Dat zou wel moeten.
Golf 3: DDoS doet zijn intrede
Wat er gebeurde
We hadden de bandbreedtesituatie eindelijk onder controle. Het moreel van het team herstelde. Iemand maakte zelfs een grap tijdens de stand-up. Het ging de goede kant op.
Toen sloeg de DDoS toe.
Stel je voor dat je een brandslang openzet en op een papieren bekertje richt. Dat is wat onze databaseconnectiepool doormaakte. Duizenden verzoeken per seconde, die allemaal verse gegevens eisten, die allemaal weigerden de cache te gebruiken, die allemaal endpoints raakten waarvoor databasequery's nodig waren.
Ons monitoringdashboard zag eruit als het ecg van een hartaanval. Responstijden gingen van 200 ms naar 20 seconden. Daarna naar time-outs. Gebruikers begonnen fouten te melden. Onze AWS-rekening begon te doen waarbij hij om de paar minuten een hoger bedrag laat zien.
De databaseconnectiepool bereikte zijn limiet. Query's kwamen in de wachtrij. De wachtrij liep vol. Een klassieke kettingreactie van storingen, in realtime.
Hoe we reageerden
We gooiden elke cachingtechniek die we kenden op het probleem:
- ISR (Incremental Static Regeneration) — Populaire pagina's worden nu vooraf gerenderd en vanaf edge-nodes geserveerd. De database weet niet eens dat die verzoeken bestaan.
- Caching in meerdere lagen — Responscache, querycache, optimalisatie van connectiepooling. Als gegevens niet per se vers hoeven te zijn, worden ze gecachet.
- Optimalisatie van databasequery's — Sommige query's die vroeger 500 ms duurden, duren nu 50 ms. Minder tijd die verbindingen bezet houdt = meer verbindingen beschikbaar.
- De DDoS-bescherming van Cloudflare — Eindelijk alle beveiligingsfuncties ingeschakeld die we "ooit" nog eens wilden configureren
- Slimme rate limiting — Legitieme gebruikers komen erdoor; aanvalsverkeer wordt de deur gewezen
De filosofie: als een verzoek beantwoord kan worden zonder de database aan te raken, dan moet dat ook.
Wat we leerden
Caching is niet alleen een prestatieoptimalisatie — het is een beveiligingsarchitectuur. Als er aanvallen komen, vangen gecachete antwoorden de klap op. De database blijft beschermd. De site blijft online.
Ook geleerd: "we configureren de beveiliging later wel goed" is een filosofie die slecht veroudert.
Golf 4: de uitbuiters (API-misbruikers)
Wat er gebeurde
Deze bedreigde onze infrastructuur niet direct. Hij bedreigde ons budget.
We hadden al die prachtige gratis AI-functies gebouwd:
- Personages maken met AI — Beschrijf je personage, AI genereert het volledige profiel
- Momenten genereren met AI — Maak dynamische verhaalmomenten met hulp van AI
- Plug-ins maken met AI — Bouw personageplug-ins met natuurlijke taal
Onze visie was prachtig: de drempels voor creativiteit verlagen. Iedereen de magie van AI-ondersteund creëren laten ervaren. Het platform toegankelijker maken.
Iemand anders had een andere visie: "Gratis API? Dan schrijf ik gewoon een script dat dit 10.000 keer aanroept."
We zagen ons dashboard met het verbruik van AI-tokens stijgen. En stijgen. En stijgen. De grafiek leek op een hockeystick, alleen was de hockeystick gemaakt van geld dat onze bankrekening verliet.
Elke AI-generatie kost ons echt geld — API-aanroepen naar taalmodellen zijn niet gratis. Duizenden geautomatiseerde verzoeken door ons AI-budget zien branden voelde als naar de taximeter kijken in een taxi die rondjes rijdt. Je weet dat het duur wordt, en het houdt nooit op.
Het ergste? Dit waren niet eens echte gebruikers die echte content maakten. Het was gewoon... iemand die testte hoeveel gratis spul er te halen viel. De gegenereerde personages waren wartaal. De momenten sloegen nergens op. Pure verspilling.
Hoe we reageerden
Met pijn in ons hart hebben we voor deze AI-functies credits verplicht gesteld.
Deze beslissing deed echt pijn. We hadden weken besteed aan het bouwen van deze tools, juist om creëren toegankelijker te maken. Nu moesten we er een prijs aan hangen — niet omdat we dat wilden, maar omdat onbeperkte gratis toegang als wapen tegen ons werd ingezet.
We probeerden er eerlijk in te zijn:
- De kosten in credits zijn minimaal bij normaal gebruik
- Nieuwe gebruikers krijgen gratis credits
- De kern van de chatervaring blijft gratis
- Alleen AI-generatie die veel middelen vraagt, kost credits
Maar toch. Het voelde alsof we een slot hingen aan iets wat we open wilden houden.
Wat we leerden
"Gratis" is een verdienmodel, geen morele positie.
We geloven nog steeds in toegankelijkheid. We willen nog steeds drempels verlagen. Maar "onbeperkt gratis voor iedereen" werkt alleen als iedereen te goeder trouw handelt. Wanneer kwaadwillenden misbruik maken van vrijgevigheid, wordt het vrijgevige systeem onhoudbaar — en dan krijgt niemand meer iets.
Redelijke limieten zijn geen wantrouwen tegenover gebruikers. Ze beschermen het ecosysteem dat alle gebruikers dient. Het alternatief — functies helemaal uitschakelen — zou voor iedereen slechter zijn.
Soms betekent het beschermen van het gemeengoed dat je wat hekken moet bouwen.
Je gegevens zijn veilig (laten we daar absoluut duidelijk over zijn)
We willen hier geen enkel misverstand over laten bestaan:
Deze aanvallen gingen om middelen, niet om gegevens. De aanvallers wilden:
- ✅ Onze bandbreedte (om content te downloaden)
- ✅ Onze rekenkracht (om onze servers te overbelasten)
- ✅ Ons geld (om ons AI-budget leeg te trekken)
Ze hadden GEEN toegang tot:
- ❌ Gebruikersaccounts
- ❌ Gespreksgeschiedenissen
- ❌ Persoonlijke informatie
- ❌ Betaalgegevens
- ❌ Welke privégegevens dan ook
We hebben een speciaal beveiligingsteam dat 24/7 waakt over echte beveiligingsdreigingen. Gebruikersgegevens zijn versleuteld, zowel opgeslagen als onderweg. Toegangscontroles zijn strikt. Authenticatie is robuust. Het saaie, belangrijke beveiligingswerk waar je geen spannende blogposts over schrijft — dat doen we allemaal.
Er zijn nul gebruikersgegevens gecompromitteerd. Dat kunnen we met zekerheid zeggen, omdat we alles hebben gelogd, alles hebben geanalyseerd en alles hebben geverifieerd. De aanvallers kregen van ons bandbreedterekeningen en hoofdpijn. Van jou kregen ze niets.
Je personages, je gesprekken, je creatieve werk — allemaal veilig, allemaal intact, allemaal precies waar ze horen.
Waarom we je dit vertellen
Je vraagt je misschien af: waarom deel je dit openbaar? Maakt dat jullie niet kwetsbaar?
Daar hebben we goed over nagedacht.
Transparantie bouwt vertrouwen op
We vragen gebruikers ons iets waardevols toe te vertrouwen — hun creatieve werk, hun emotionele band met AI-personages, hun gesprekken. Dat vertrouwen vraagt om eerlijkheid over de uitdagingen waar we voor staan.
Het oude draaiboek is problemen verbergen tot ze ontploffen en dan een vage verklaring uitbrengen over "technische problemen". Wij zijn liever open: dit is er gebeurd, zo hebben we het aangepakt, dit hebben we geleerd.
Andere bouwers kunnen ervan leren
We zijn niet het eerste kleine team dat na de lancering van gratis functies wordt aangevallen, en we zullen ook niet het laatste zijn. Als onze dure les iemand anders helpt zich beter voor te bereiden, is dat winst voor het hele ecosysteem.
Zie dit als onze bijdrage aan het curriculum "dingen die ze je niet leren op de startupschool".
Je verdiende het om het te weten
Sommige gebruikers merkten in deze weken tragere responstijden. Sommigen merkten dat functies nu credits kosten. Je verdiende een uitleg — geen corporate PR-taal, maar het echte verhaal.
We vochten om het platform draaiende te houden. We namen moeilijke beslissingen onder druk. Sommige van die beslissingen hadden invloed op jouw ervaring. Je hoort te weten waarom.
Wat er nu komt
We dichten niet alleen gaten — we bouwen aan een veerkrachtiger platform:
Al geïmplementeerd:
- Caching in meerdere lagen met een edge-first-architectuur (je verzoeken zijn sneller ÉN we zijn moeilijker aan te vallen)
- Slimme rate limiting met gedragsanalyse (bots worden geblokkeerd, mensen merken er niets van)
- De volledige beveiligingssuite van Cloudflare (eindelijk goed geconfigureerd, niet "ooit")
- Toegang op basis van credits voor AI-functies die veel middelen vragen (duurzame vrijgevigheid)
Binnenkort:
- Verbeterde detectie van afwijkingen (aanvallen eerder opsporen)
- Geografische optimalisatie (sneller voor iedereen, overal)
- Geavanceerdere preventie van misbruik (kwaadwillenden een stap voor blijven)
Wat niet verandert:
- We doen ons best om gratis toegang te behouden — al kan die instabiel zijn of zonder aankondiging veranderen
- Privacy en beveiliging van gebruikersgegevens — altijd onze hoogste prioriteit
- Transparante communicatie — als er iets misgaat, hoor je het
Een woord aan mede-bouwers
Als je een open platform bouwt, zijn dit de lessen waarvoor wij met echt geld (en echte stress) hebben betaald:
- Rate limiting is niet optioneel — implementeer het vanaf dag één, niet vanaf de dag dat "we worden aangevallen"
- Kies infrastructuur die bestand is tegen aanvallen — Cloudflare is oprecht uitstekend; egresskosten maken je kapot
- Cache agressief — het is je dubbele schild voor prestaties en beveiliging
- Gratis functies hebben grenzen nodig — onbeperkte goodwill wordt uitgebuit door onbeperkt veel kwaadwillenden
- Monitor alles — hoe eerder je afwijkingen ziet, hoe kleiner de schade
- Houd een noodbudget aan — je weet nooit wanneer de volgende golf komt
En misschien wel het allerbelangrijkste:
- Wees niet te trots om hulp te vragen — de indie-devcommunity is behulpzamer dan je zou verwachten
We hopen dat je deze lessen niet op de dure manier hoeft te leren. Maar als dat toch gebeurt, weet dan dat je niet alleen bent.
Aan onze gebruikers
Aangevallen worden is een vreemde ervaring.
Het is alsof je maandenlang een gezellige woonkamer hebt ingericht, de meubels precies goed hebt neergezet, hapjes hebt klaargezet en al je vrienden hebt uitgenodigd. De openingsavond breekt aan. Je vrienden komen — geweldig!
Maar ook: een groep mensen die je nog nooit hebt gezien, komt aanzetten met verhuiswagens, probeert je bank uit elkaar te halen, fotografeert elke hoek van je huis en sticht op de een of andere manier ook nog kleine brandjes in de keuken.
We hadden opties. We hadden de deur dicht kunnen lassen. Alleen op uitnodiging kunnen gaan werken. Iedereen kunnen laten bewijzen dat ze geen bot zijn voordat ze ook maar iets te zien kregen.
Dat hebben we niet gedaan.
In plaats daarvan hebben we betere sloten geplaatst. Slimmere beveiliging ingehuurd. Redelijke huisregels opgesteld. Want de overgrote meerderheid van de mensen die naar Reverie komen, is hier om te creëren, contact te maken en plezier te hebben. We gaan de velen niet straffen voor de zonden van enkelen.
Het feest gaat door. De deur blijft open. We zijn alleen beter geworden in het herkennen van de mensen met verhuiswagens.
Bedankt
Aan elke gebruiker die bij ons bleef, ondanks tragere laadtijden en credits die nu nodig zijn: bedankt.
Aan iedereen die problemen meldde in plaats van gewoon te vertrekken: bedankt.
Aan de indie-devcommunity die advies en oorlogsverhalen deelde: bedankt.
Aan Cloudflare: bedankt. 🙏
We zijn nu sterker. Veerkrachtiger. Beproefd in de strijd. Het platform dat uit deze aanvallen tevoorschijn kwam, is beter dan het platform dat erin ging.
De volgende keer dat we je schrijven, hopen we een spannende nieuwe functie aan te kondigen.
Niet weer een eindbaas die we hebben verslagen.
Maar hé — als er nog een eindbaas opduikt, kunnen we die ook aan.
Tot de volgende update. 💙
Het Reverie-team
December 2025

