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?