Status: wat werkt echt, wat is gesimuleerd, wat is nog nodig
Laatst bijgewerkt: 28 oktober 2026. Eerlijk overzicht van de demo.
✅ Werkt echt (lokaal, getest)
| Onderdeel | Toelichting |
|---|---|
| Publieke website per klant | 5 klanten, elk met eigen huisstijl, pagina's, diensten. Mobielvriendelijk. |
| Contact- en offerteformulier | Validatie, spamfilter (honeypot), privacy-toestemming. Aanvraag komt in het dashboard + melding. |
| Websitebouwer | Blokken toevoegen, verslepen, dupliceren, verwijderen; velden bewerken; afbeeldingen uploaden; live preview (desktop/tablet/mobiel); ongedaan maken (Ctrl+Z); concept opslaan; publiceren; versiegeschiedenis terugzetten; nieuwe pagina's; SEO-velden. |
| Huisstijl | Kleuren, lettertype, hoeken, logo – direct live op de website. |
| Diensten & producten | Toevoegen, bewerken, volgorde, verbergen – direct op de site. |
| Klantdashboard | Overzicht, aanvragen, offertes (kanban + regels + totalen), klanten, agenda, taken, e-mail, gebruikers & rechten, instellingen, data-export (JSON). |
| Rollen en rechten | Eigenaar / medewerker / alleen-lezen; gecontroleerd in elke server action (niet alleen verborgen knoppen). |
| Tenant-scheiding | Elke query gaat via scoped(tenantId, gebruiker); tenantId komt uit de sessie. Getest op beide opslagvormen. |
| PostgreSQL-opslag (fase 2) | DATA_BACKEND=postgres: zelfde app op PostgreSQL. Migratie 0001_init.sql getest op echte Postgres (PGlite). Hele app doorgeklikt op Postgres: dashboard, AI-analyse + goedkeuren, offerteformulier, nieuwe klant, functie aan/uit, tenant-isolatie (404). |
| Row Level Security (fase 2) | Database dwingt tenantscheiding zelf af, ook buiten de app-filters om. 15 aanvalstests (tests/pg-rls.test.ts): andere klant lezen/wijzigen/aanmaken/verwijderen, eigen pakket of verbruik aanpassen, platformbeheerder aanmaken, tokens lezen, anonieme toegang – allemaal geweigerd. |
| Klant genereren uit een beschrijving | Platformbeheer → "Klant genereren": één beschrijving levert website (5 pagina's, diensten, FAQ), huisstijl en AI-assistent (toon, kennis, prijslijst) plus taken voor wat ontbreekt. Voorstel eerst ter controle. Getest in de browser met de demo-generator; verzint geen reviews, cijfers of prijzen (5 tests). |
| Afbeeldingen in Supabase Storage | MEDIA_BACKEND=supabase: privé-bucket, getest met het echte project (upload, download, niet publiek bereikbaar). |
| Lokale database zonder Docker | npm run db:local start PostgreSQL (PGlite) met schema en demodata. |
| Platformbeheer | Alle klanten, MRR, status, functies per klant aan/uit (werkt direct door), pakket wijzigen, nieuwe klant + startwebsite uit branchetemplate, websiteprojecten met fases, integratiefouten, audit-log, rekenmodel. |
| AI-beleid en goedkeuringen | 12 vaardigheden met niveau uit/advies/concept/uitvoeren, harde limieten, goedkeuringsregels, logboek met reden. |
| Demo-AI | Regelgebaseerde analyse van offerteaanvragen (ontbrekende info, conceptregels uit prijslijst), triage van aanvragen, FAQ uit goedgekeurde bronnen, weekrapportage. Altijd gelabeld als "Demo-AI". |
| Mobiele app (PWA) | Installeerbaar (manifest + service worker), bellen/mailen/route, taken afvinken, aanvragen oppakken, offertes opvolgen, gegevens wijzigen, lokale meldingen. |
| Domeinroutering | <slug>.localhost:3000 en (in productie) eigen domeinen tonen de klantsite op /. |
| Tests | 60 Vitest-tests (npm test), waarvan de tenant-tests op JSON én PostgreSQL draaien. |
🟣 Gesimuleerd (zichtbaar gelabeld, er gebeurt niets extern)
| Onderdeel | Wat er gebeurt | Wat is nodig voor echt |
|---|---|---|
| Inloggen (standaard) | Klik-login per demo-account (ondertekende cookie) | AUTH_MODE=supabase + Supabase-project (zie docs/08) |
| Opslag (standaard) | JSON-bestand data/db.json |
DATA_BACKEND=postgres + Supabase-database (zie docs/08) |
| E-mail verzenden | Opgeslagen met status Niet verzonden + reden | Resend-account, geverifieerd domein, RESEND_API_KEY |
| Inkomende e-mail | Voorbeeldberichten | Gmail- of Microsoft 365-koppeling (OAuth) |
| Integraties (Google, Moneybird, Exact, …) | Status "Demo-verbinding", logregels zeggen expliciet "geen echte API-aanroep" | App-registratie per leverancier, OAuth-flow, tokens in versleutelde kluis |
| Agenda-sync | Afspraken alleen in DV Software | Google Calendar / Microsoft Graph |
| Pushmeldingen | Lokale testmelding via service worker | VAPID-sleutels + push-abonnementen + verzendservice |
| Bezoekersstatistieken | Vaste voorbeeldcijfers | Plausible / Vercel Analytics |
| Facturatie & betalingen | Voorbeeldstatussen | Mollie of Stripe (abonnementen) |
🔑 Werkt echt zodra je een sleutel invult (code is af, niet getest zonder sleutel)
| Sleutel | Effect |
|---|---|
ANTHROPIC_API_KEY |
AI-assistent gebruikt Claude (tool use, beleid + logboek blijven gelijk). Niet getest in deze sessie (geen sleutel beschikbaar). |
RESEND_API_KEY + EMAIL_FROM |
Bevestigingsmails, offertes en goedgekeurde AI-mails worden echt verzonden. Niet getest (geen sleutel). |
HUBSPOT_PRIVATE_APP_TOKEN |
Echte verbindingstest en alleen-lezen-sync van contacten. Niet getest (geen account). |
ANTHROPIC_API_KEY in de generator |
Claude schrijft het websitevoorstel (teksten, kleuren, FAQ). Niet getest (geen sleutel); zonder sleutel draait de demo-generator. |
AUTH_MODE=supabase + Supabase-sleutels |
Echte login: wachtwoord, inloglink per e-mail, wachtwoord vergeten, uitnodigingen voor nieuwe gebruikers en nieuwe klanten. Deels getest: inlogscherm, foutmelding, afwijzen van ongeldige links en het blokkeren van demo-sessies zijn lokaal gecontroleerd; echt inloggen, e-mails en uitnodigingen niet (geen Supabase-project). |
DATABASE_URL naar Supabase |
Getest met een echt Supabase-project (Transaction pooler): verbinding versleuteld met gecontroleerd certificaat, schema en RLS aanwezig, sleutels geldig (npm run check:supabase). |
⚠️ Bekende beperkingen van de demo
- Standaardopslag (JSON-bestand) is alleen voor de demo; productie gebruikt
DATA_BACKEND=postgres. - Afbeeldingen: lokaal in
data/uploads/tenzijMEDIA_BACKEND=supabase(verplicht online). - Nog niet online: zie docs/09 (GitHub en Vercel, jouw accounts nodig).
- Het platformoverzicht laadt alle gegevens in één keer; prima voor tientallen klanten, voor honderden zijn gerichte queries nodig.
- Tweestapsverificatie (2FA) is nog niet aangezet.
- Geen rate limiting op formulieren (productie: Vercel Firewall / Upstash rate limit).
- Geen cookiebanner nodig zolang er alleen functionele cookies zijn; zodra analytics/marketing wordt toegevoegd is toestemming vereist.
- De editor ondersteunt blokken onder elkaar (geen vrije kolommen-indeling); zie docs/03 voor uitbreiding.