Casus

Een AI-website-assistent die ik als SaaS-product zelf bouwde en draai

Stewie is een embeddable AI-website-assistent die ik bouwde. Een bedrijf richt hem op de eigen website en documenten, plakt één script-tag, en bezoekers krijgen een chat die hun vragen beantwoordt met antwoorden die enkel uit die eigen content komen, met bronvermelding. Hij vangt leads en herkent intentie. De concierge die je hier in mijn navbar ziet, is exact dat product. Alles draait op een Cloudflare-edge-stack met EU-dataresidentie.

Laatst bijgewerkt: juni 2026 · stewie.io
stewie.io
Stewie, de AI-website-assistent die ik zelf bouwde en draai, met dashboard en widget
AI-kost per gesprek
~$0,012
50 pagina's crawlen
15-30s
Opslag & AI-verwerking
EU
Embed-snippet
1 regel

De uitdaging.

De meeste bedrijfssites hebben een zoekbalk of een FAQ die de echte vraag van een bezoeker niet beantwoordt, en een generieke chatbot maakt het vaak erger: die gokt maar wat of dwaalt af van het onderwerp. Ik wilde een product bouwen dat de bestaande website en documenten van een bedrijf omzet in een assistent die 24/7 antwoordt, maar enkel uit die eigen content, met bronvermelding, en die geïnteresseerde bezoekers meteen als lead vastlegt. Zonder dat het bedrijf zelf antwoorden moet schrijven of onderhouden.

De moeilijkheid zit in de volledige keten, en die moest multi-tenant, goedkoop en EU-conform draaien. Een willekeurige site betrouwbaar crawlen ondanks bot-blocking en rommelige HTML. De inhoud in stukken knippen, embedden en per klant strikt geïsoleerd opslaan. Bij elke vraag de juiste context ophalen en herrangschikken. Een gegrond, geciteerd antwoord genereren dat bestand is tegen prompt-injection vanuit vergiftigde pagina's en vijandige bezoekers. Dat alles met de AI-verwerking in de EU, goedkoop genoeg voor een gratis tier, en achter een widget die op een vreemde host-pagina moet blijven werken.

De aanpak.

Ik ontwierp en bouwde dit als multi-tenant SaaS. De kern is een RAG-lus: crawlen, parsen, in stukken knippen, embedden, opslaan, ophalen, herrangschikken en genereren met bronnen. De ingestie draait als duurzame Cloudflare Workflows met retries en resume per stap, gebufferd via Queues, met de ruwe markdown in R2. Elke klant is geïsoleerd op companyId: een namespace-prefilter op elke vectorquery en een companyId-scope op elke relationele query. Naast de widget is er een dashboard met inbox, leads, kennisbank, analytics en instellingen.

Eerlijk over de status: Stewie is een AI-SaaS die ik bouw en draai, momenteel in open beta. De billing-infrastructuur staat klaar, maar ik verkoop nog niet publiek en er zijn nog geen betalende klanten. Het bewijs dat het werkt staat gewoon op deze pagina: de concierge in mijn eigen navbar is dezelfde Stewie, die live antwoordt over mijn eigen site. Dat is het echte product, live in productie.

Architectuur en keuzes.

Rode draad: een all-Cloudflare edge-backbone die naar nul schaalt, met de AI-verwerking bewust in de EU.

  • ·

    SvelteKit op Cloudflare Workers. De hele app en de widget draaien aan de edge, multi-tenant, zonder serverbeheer en zonder koude opstart. De vaste kost is de Workers-bodem van ongeveer $5 per maand; daarboven schaalt alles mee met gebruik.

  • ·

    Vectorize en D1, per tenant geïsoleerd. Eén vector-index met namespace gelijk aan companyId, en één D1-database scoped op companyId als bron van waarheid. D1 houdt ook het vector-ID-grootboek bij, zodat GDPR-verwijdering mechanisch wordt ondanks dat Vectorize niet per namespace kan wissen.

  • ·

    Workflows, Queues en R2 voor ingestie. Crawlen, parsen, chunken, embedden en upserten loopt als één duurzame workflow met retries en resume per stap. De ruwe en verrijkte markdown gaat naar R2, dat geen egresskosten heeft.

  • ·

    EU-residente AI op Amazon Bedrock (Frankfurt). Generatie met Claude Haiku 4.5, embeddings en herrangschikking met Cohere, en OCR voor documenten met Mistral in Parijs. Bewust gekozen om alle AI-verwerking in de EU te houden, onder no-training-voorwaarden.

  • ·

    Durable Objects voor realtime. Per-tenant rate limiting en WebSocket-relays voor live overname, zodat een mens een lopend gesprek kan binnenstappen wanneer dat nodig is.

  • ·

    Eén script-tag, custom launcher. De widget embedt met één regel. Een custom-mount laat een bedrijf de assistent in de eigen navbar zetten in plaats van als bubbel rechtsonder, precies wat je hier bovenaan ziet gebeuren.

De moeilijkste problemen, opgelost.

  • 1

    EU-residente generatie zonder kant-en-klare gateway. De first-party Claude-API is US-only. Om alle AI-verwerking in Europa te houden, verplaatste ik de generatie naar Amazon Bedrock in Frankfurt. Dat betekende dat ik zelf de binaire eventstream van Bedrock moest decoderen (big-endian frames, header-parsing, tool-aanroepen die in stukjes binnenkomen) om streaming antwoorden terug te krijgen. Test-first geschreven, want het is het soort code waar je geen verrassingen in wil.

  • 2

    Tenant-isolatie als verdediging in de diepte. Vectorize is eventually-consistent en kan niet per namespace verwijderen. Opgelost met een vector-ID-grootboek in D1, een namespace-prefilter op elke vectorquery, een companyId-scope op elke relationele query, en een 404 in plaats van een 403 bij cross-tenant toegang, zodat het bestaan van andermans data niet eens lekt.

  • 3

    Prompt-injection op volledig onvertrouwde input. Gecrawlde pagina's kunnen vergiftigd zijn, bezoekers kunnen vijandig zijn, en er is een lead-capture-tool die persoonsgegevens aanraakt. De verdediging zit in de architectuur zelf: een instructie-sandwich rond onvertrouwde content, neutralisatie van markers, een misbruikdetector en rate limiting.

  • 4

    Crawlen tegen bot-blocking. De echte blokkade bleek IP-reputatie te zijn, niet de user-agent of een JS-challenge. De crawler werkt sitemap-first en robots-bewust, bewaart partiële resultaten, offloadt naar R2 om onder de platformlimieten te blijven, en valt indien nodig terug op een residential-proxy met een budgetcap per klant.

  • 5

    De widget op een vijandige host-pagina. Een open invoerveld dat over een vreemde site zweeft is lastig: een iframe is één rechthoekig klikvlak, dus een breed transparant iframe eet alle kliks eronder op. Opgelost met een hybride aanpak, een launcher in de Shadow DOM van de host-pagina en een chat-paneel in een same-origin iframe. Precies die opzet laat Stewie als ask-bar in deze navbar leven in plaats van als losse bubbel.

Resultaat.

Stewie draait: een multi-tenant AI-website-assistent die een bedrijfssite in seconden crawlt en bezoekersvragen beantwoordt met antwoorden uit enkel die eigen content, met bronvermelding, terwijl hij leads vangt en intentie herkent. Alles draait op een Cloudflare-edge-stack met EU-residente AI, een product dat ik ontwierp, bouwde en draai. Stewie is in open beta; het levende bewijs staat gewoon in mijn eigen navbar.

Wat dit voor jouw site betekent: dit is precies de capaciteit die ik kan bouwen en draaien. Een AI-assistent die enkel uit jouw eigen content put, met bronnen, die je bezoekers echt helpt en je beste leads eruit haalt, in plaats van een generieke chatbot die dingen verzint. Of ik nu Stewie op jouw site zet of een variant op maat bouw die in jouw stack en processen past: ik heb de volledige keten, van crawler tot edge-RAG tot productie, zelf gebouwd en draaiend.

Onder de motorkap.

SvelteKitCloudflare WorkersVectorizeD1Cloudflare WorkflowsDurable ObjectsR2 + QueuesAmazon Bedrock (EU)Claude Haiku 4.5CohereRAG

Veelgestelde vragen.

Iets wat hier niet bij staat? Mail rechtstreeks.

Kan ik zo'n AI-assistent op mijn eigen website zetten? +

Ja. Stewie embedt met één script-tag en richt zich op jouw eigen site en documenten, dus de antwoorden komen enkel uit jouw content. Hij kan rechtsonder als chatbubbel staan of, via een custom launcher, als ask-bar in je navbar, precies zoals op deze site. Wil je iets dat dieper in jouw stack of processen haakt, dan bouw ik een variant op maat.

Hoe weet de assistent het antwoord, en verzint hij niets? +

De assistent draait op RAG: hij haalt de relevante stukken uit jouw gecrawlde content, herrangschikt ze en genereert daar een antwoord op, met bronvermelding erbij. Hij put dus niet uit algemene kennis maar uit jouw site, en als het antwoord er niet in staat, zegt hij dat liever dan te gokken. Een laag verdediging tegen prompt-injection houdt vijandige input en vergiftigde pagina's buiten spel.

Waar staat mijn data, en hoe zit het met de AVG? +

Opslag staat EU-pinned op Cloudflare en alle AI-verwerking gebeurt in de EU: generatie en embeddings op Amazon Bedrock in Frankfurt, documentherkenning bij Mistral in Parijs, telkens onder no-training-voorwaarden. Elke klant is strikt geïsoleerd op companyId, en verwijderen is mechanisch geregeld via een vector-ID-grootboek, zodat een wisverzoek volledig kan worden uitgevoerd.

Heb je dit zelf gebouwd? +

Ja. Stewie is mijn eigen product: het ontwerp, de RAG-pipeline, de crawler, het dashboard, de billing-infrastructuur en de widget. De concierge in mijn navbar is exact dit product, live in productie. Eerlijk erbij: Stewie zit in open beta, ik verkoop nog niet publiek en er zijn nog geen betalende klanten. Het is een AI-SaaS die ik bouw en draai, en die je hier gewoon kan uitproberen.

Wat kost een AI-assistent zoals dit voor mijn bedrijf? +

Dat hangt af van de scope, dus een exact bedrag hier zou misleidend zijn. Wat dit project laat zien, is dat één developer een complete AI-assistent kan ontwerpen, bouwen en draaien, tot en met de unit-economics: de AI-kost van een volledig gesprek ligt rond $0,012. We bakenen samen een eerste versie af en koppelen daar een vaste prijs aan.

Meer over ai-integratie

Zoiets voor jouw zaak?
Een gesprek kost niets.