Architectuur Overzicht
Liefdevolle Blik is gebouwd met een privacy-first, defense-in-depth architectuur.
Stack
Frontend: Next.js 16 (App Router, TypeScript)
Styling: Tailwind CSS + CSS variables
Database: Supabase (PostgreSQL + Row Level Security)
Auth: Supabase Auth (email/password + magic link)
Encryptie: AES-256 client-side (Web Crypto API)
WhatsApp: WhatsApp Business Cloud API (Meta)
Email: Resend (transactionele mail)
Scheduling: Supabase Edge Functions (cron)
Hosting: Vercel (edge runtime)
Privacy-architectuur (Defense in Depth)
Browser → HTTPS → Vercel Edge → Next.js API Route
↓
Supabase (RLS policies)
↓
PostgreSQL (encrypted at rest)
↓
Notities: AES-256 versleuteld met cirkel-sleutel
Cirkel-sleutel: alleen vrijgegeven NA openingsdatum
Kernprincipe
De server kan notitiepinhoud nooit lezen vóór de openingsdatum. Row Level Security blokkeert de decryptie-sleutel totdat opening_datum <= NOW().
Data Flow
1. Notitie Schrijven
Gebruiker tikt notitie
↓
Client genereert cirkel-sleutel uit sessie
↓
Browser versleutelt notitie (AES-256-GCM)
↓
Ciphertext + IV naar server
↓
Server slaat op (GEEN plaintext gezien)
2. Openingsdatum Bereikt
Cron job checkt dagelijks of opening_datum voorbij is
↓
RLS policy UPDATE zet cirkel_sleutel = DECRYPT(vault_key)
↓
Clients kunnen sleutel nu ophalen
↓
Browser ontsleutelt notities lokaal
↓
WhatsApp + Email berichten verstuurd
3. Data Vernietiging (30 dagen na opening)
Cron job controleert verwijder_op datums
↓
Verwijdert in volgorde: notities → lidmaatschappen → profielen → auth accounts
↓
Audit log geanonimiseerd
↓
Account volledig weg
Kerncomponenten
Database
- Users — Profielen (niet gekoppeld aan auth.users)
- Circles — Cirkels met mentor + opening_datum
- Notes — Versleutelde notities (AES-256)
- Invitations — Eénmalig gebruik, 7 dagen geldig
- Audit Logs — Geanonimiseerde verwijderingen
→ Zie: Database Schema
Encryptie
- Client-side AES-256-GCM
- Unieke IV per notitie
- Cirkel-sleutel in Supabase Vault
- Server ziet nooit plaintext
→ Zie: Encryptie Implementatie
Cron Jobs
- Dagelijks (07:00) — Opening check + notities verzenden
- Wekelijks — Schrijf-herinneringen
- Dagelijks (03:00) — Data vernietiging
→ Zie: Cron Jobs
RLS Policies
- Gebruikers zien alleen hun eigen profiel
- Cirkels alleen voor leden
- Notities: schrijver ziet metadata, ontvanger ziet inhoud NA opening
- Cirkel-sleutel: NULL totdat opening_datum voorbij
→ Zie: Database Schema
Deployment
- Vercel — Next.js hosting (EU edge network)
- Supabase — Database (EU region)
- Resend — Email (EU)
- WhatsApp Business — API calls via Vercel Edge Functions
→ Zie: Deployment
Security Highlights
- ✅ HTTPS everywhere
- ✅ CSRF protection (SameSite cookies)
- ✅ Rate limiting (10 req/min per IP)
- ✅ hCaptcha on signup
- ✅ Row Level Security (RLS) on all tables
- ✅ No plaintext logging
- ✅ Automatic data deletion after 30 days
- ✅ EU data residency (GDPR compliant)
→ Zie: Security Checklist
Kosten
| Dienst | Doel | Kosten |
|---|---|---|
| Vercel | Next.js hosting | Gratis / €20/mnd |
| Supabase | Database + Auth + Cron | €25/mnd |
| WhatsApp API | WA berichten | €0.06–0.09 per bericht |
| Resend | Transactionele mail | Gratis tot 3000/mnd |
| Meta Business | WA account | Gratis |
Totaal: ±€50–60/mnd bij kleine groepen
→ Zie: Externe Diensten
Wil je details over een specifiek onderdeel?