docs: architectuurdocs, styleguides en release notes intake/behandelplan
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
494
docs/architecture/tech-stack-onderzoek.md
Normal file
494
docs/architecture/tech-stack-onderzoek.md
Normal file
@@ -0,0 +1,494 @@
|
||||
# Tech Stack Onderzoek — Versies, Alternatieven & Samenhang
|
||||
|
||||
> **Type**: Onderzoeksrapport
|
||||
> **Datum**: 2026-02-14
|
||||
> **Doel**: Valideer alle technologiekeuzes uit de architectuur op versies, community health, alternatieven en onderlinge compatibiliteit
|
||||
> **Conclusie**: 5 wijzigingen aanbevolen, 3 aandachtspunten, rest is solide
|
||||
|
||||
---
|
||||
|
||||
## Samenvatting: Wijzigingen ten opzichte van de architectuur
|
||||
|
||||
### Wijzigingen (doorvoeren)
|
||||
|
||||
| # | Was | Wordt | Waarom |
|
||||
|---|-----|-------|--------|
|
||||
| W1 | Next.js 14 + React 18 | **Next.js 16.1 LTS + React 19** | Next.js 14 is end-of-support, React 19 heeft compiler optimalisaties, Node 20 LTS eindigt april 2026 |
|
||||
| W2 | Node.js 20 | **Node.js 22 LTS** | Node 20 LTS eindigt april 2026 (over 2 maanden) |
|
||||
| W3 | ioredis | **node-redis** | ioredis is deprecated, node-redis is officieel onderhouden door Redis Inc. |
|
||||
| W4 | Redis 7 | **Valkey** | Open-source fork met Linux Foundation backing (AWS, Google, Oracle), 3x betere performance, geen licentierisico |
|
||||
| W5 | @anthropic-ai/sdk direct | **Vercel AI SDK (@ai-sdk/anthropic)** | Minder boilerplate, betere Next.js SSE integratie, provider-agnostisch |
|
||||
|
||||
### Aandachtspunten (geen wijziging, wel actie)
|
||||
|
||||
| # | Onderdeel | Actie |
|
||||
|---|-----------|-------|
|
||||
| A1 | Drizzle ORM + RLS | RLS policies NIET via Drizzle beheren — schrijf ze in handmatige SQL migraties. Drizzle verwijdert stiekem bestaande policies |
|
||||
| A2 | Auth.js v5 + Keycloak | Token refresh race conditions bij concurrent sessions. Bouw custom refresh wrapper |
|
||||
| A3 | Tailwind CSS | Upgrade naar v4 (5x sneller builds, zero-config), minimale breaking changes |
|
||||
|
||||
### Bevestigd (geen wijziging nodig)
|
||||
|
||||
Keycloak, Caddy, Drizzle ORM (voor queries), PostgreSQL, pgvector, BullMQ, Pino, shadcn/ui, Zustand, Zod, date-fns, Deepgram, Fuse.js, Lucide React, React Hook Form, Hetzner, Docker Compose
|
||||
|
||||
---
|
||||
|
||||
## 1. Core Framework Stack
|
||||
|
||||
### Next.js — upgrade naar 16.1 LTS
|
||||
|
||||
| Eigenschap | Huidig (14) | Aanbevolen (16.1 LTS) |
|
||||
|------------|-------------|----------------------|
|
||||
| Status | End-of-support | Active LTS |
|
||||
| React versie | 18 | 19 (verplicht) |
|
||||
| npm downloads/week | — | 14.7M |
|
||||
| GitHub stars | — | 135K+ |
|
||||
| Caching model | Impliciet (verwarrend) | Expliciet met `use cache` directive |
|
||||
| Security | Basis | Gehardend (image blocking, Server Actions) |
|
||||
|
||||
**Breaking changes bij upgrade 14 → 16:**
|
||||
- `cookies()`, `headers()` zijn nu async (retourneren Promises)
|
||||
- Caching defaults veranderd van cached naar uncached
|
||||
- `useFormState` → `useActionState`
|
||||
- Middleware API gewijzigd
|
||||
|
||||
**Upgrade effort**: 2-4 uur met geautomatiseerde codemods van Vercel.
|
||||
|
||||
**Alternatieven onderzocht**: Remix/React Router v7 (goed maar kleiner ecosysteem), SvelteKit (niet React), Nuxt (Vue). Next.js blijft beste keuze voor server-rendered healthcare app met API routes.
|
||||
|
||||
### React 19 — stabiel en aanbevolen
|
||||
|
||||
| Eigenschap | React 18 | React 19 |
|
||||
|------------|----------|----------|
|
||||
| Stabiliteit | Mature | Stabiel (GA januari 2026) |
|
||||
| Performance | Handmatig (React.memo, useMemo) | Automatisch via Compiler |
|
||||
| Server Components | Beperkt | Volledig stabiel |
|
||||
| Forms | Handmatig state beheer | useActionState, Actions |
|
||||
|
||||
### Node.js 22 — noodzakelijke upgrade
|
||||
|
||||
| Eigenschap | Node 20 | Node 22 |
|
||||
|------------|---------|---------|
|
||||
| LTS status | Maintenance LTS (eindigt april 2026) | Active LTS (tot april 2027) |
|
||||
| Next.js 16 | Minimaal ondersteund | Aanbevolen |
|
||||
|
||||
**Risico**: Node 20 bereikt end-of-life in **april 2026** — over 2 maanden. Upgrade is urgent.
|
||||
|
||||
### TypeScript 5.9 — geen actie nodig
|
||||
|
||||
Huidige 5.x is volledig compatibel met Next.js 16 + React 19. TypeScript 6.0 beta is aangekondigd (februari 2026), 7.0 wordt herschreven in Go. Geen haast.
|
||||
|
||||
---
|
||||
|
||||
## 2. Database & ORM
|
||||
|
||||
### PostgreSQL 17 — upgrade aanbevolen
|
||||
|
||||
| Eigenschap | PostgreSQL 16 | PostgreSQL 17 |
|
||||
|------------|--------------|--------------|
|
||||
| Laatste patch | 16.12 (feb 2026) | 17.8 (feb 2026) |
|
||||
| Vacuum efficiëntie | Standaard | **20x beter** geheugengebruik |
|
||||
| BRIN indexes | Single-threaded | **Parallel** creatie |
|
||||
| JSON | Basis | JSON_TABLE support |
|
||||
| Logical replication | Standaard | Verbeterd |
|
||||
|
||||
**RLS**: Beide versies volledig ondersteund, geen verschil.
|
||||
**Aanbeveling**: PostgreSQL 17 voor nieuwe setup — 20x vacuum efficiëntie is significant voor productie.
|
||||
|
||||
### Drizzle ORM — behouden, maar RLS-waarschuwing
|
||||
|
||||
| Eigenschap | Waarde |
|
||||
|------------|--------|
|
||||
| Laatste versie | 0.45.1 |
|
||||
| npm downloads/week | ~4.7M |
|
||||
| GitHub stars | 32.8K |
|
||||
| Bundle size | ~7.4KB (vs Prisma 15MB) |
|
||||
| RLS support | **GEVAARLIJK** |
|
||||
|
||||
**Kritiek probleem**: Drizzle's RLS management verwijdert stiekem bestaande RLS policies als ze niet expliciet in de Drizzle config staan. `drizzle-kit push` past policies niet correct toe.
|
||||
|
||||
**Oplossing**: Gebruik Drizzle alleen voor queries en schema. Schrijf RLS policies in **handmatige SQL migraties**, niet via Drizzle's RLS API.
|
||||
|
||||
**Vergelijking**:
|
||||
|
||||
| Criterium | Drizzle | Prisma | Kysely |
|
||||
|-----------|---------|--------|--------|
|
||||
| Bundle size | 7.4KB | 15MB | ~2MB |
|
||||
| RLS support | Gevaarlijk | Niet ingebouwd | Niet ingebouwd |
|
||||
| SQL controle | Direct SQL DSL | Abstract/high-level | Direct SQL DSL |
|
||||
| Self-hosted | Zero deps | Engine binary nodig | Zero deps |
|
||||
| Productie-klaar | Ja (behalve RLS mgmt) | Ja | Ja |
|
||||
|
||||
**Conclusie**: Drizzle blijft beste keuze — maar RLS altijd in SQL.
|
||||
|
||||
### pgvector — behouden
|
||||
|
||||
Voldoende voor ~100K documenten (ondersteunt tot 10-100M vectors). Geen extra infra nodig.
|
||||
|
||||
**Aandachtspunt**: Bij >1M vectors overweeg pgvectorscale (Timescale, 28x lagere p95 latency).
|
||||
|
||||
### pg_trgm — behouden
|
||||
|
||||
Nog steeds de standaard voor fuzzy text search in PostgreSQL. Geen betere alternatieven.
|
||||
|
||||
---
|
||||
|
||||
## 3. Auth & Security
|
||||
|
||||
### Keycloak 26.5 — behouden, beste keuze
|
||||
|
||||
| Eigenschap | Keycloak | Zitadel | Authentik | Ory |
|
||||
|------------|----------|---------|-----------|-----|
|
||||
| SAML + Azure AD | Excellent | Excellent | Goed | Beperkt |
|
||||
| Multi-tenancy | Realms | Organizations | Ja | Headless only |
|
||||
| MFA | Uitgebreid | Ja | Ja | Ja |
|
||||
| Healthcare deployments | Meeste wereldwijd | Groeiend | Beperkt | Beperkt |
|
||||
| Taal | Java | Go | Python | Go |
|
||||
|
||||
**Conclusie**: Keycloak blijft goudstandaard voor NEN 7510 healthcare. Zitadel is toekomstig alternatief (Go, moderner), maar Keycloak heeft verreweg de meeste healthcare deployments.
|
||||
|
||||
### Auth.js v5 + Keycloak — behouden, met aandacht
|
||||
|
||||
Auth.js v5 is stabiel (GA), maar de **Keycloak provider heeft bekende problemen**:
|
||||
|
||||
1. **Refresh token race conditions** bij concurrent `useSession()` calls
|
||||
2. **Session timeout redirects** naar `/api/auth/error` na idle time
|
||||
3. **Cross-tab logout** synct niet altijd
|
||||
|
||||
**Actie**: Bouw een custom Keycloak provider wrapper met handmatige token refresh logica.
|
||||
|
||||
### AES-256-GCM (node:crypto) — behouden
|
||||
|
||||
Nog steeds de industriestandaard. Onderdeel van TLS 1.3, FIPS 140-3, onderschreven door NSA/NIST/OWASP. Geen betere alternatieven.
|
||||
|
||||
### Caddy 2.10 — behouden
|
||||
|
||||
| Eigenschap | Caddy | Traefik | Nginx |
|
||||
|------------|-------|---------|-------|
|
||||
| Auto-HTTPS | Ingebouwd | Met config | Handmatig (Certbot) |
|
||||
| Config complexiteit | Simpel (Caddyfile) | Complex (YAML) | Verbose |
|
||||
| Docker integratie | Goed | Excellent | Handmatig |
|
||||
| Performance | Excellent | Lager | Hoogst |
|
||||
|
||||
**Conclusie**: Caddy is perfect voor Docker Compose healthcare setup — simpelste config, auto-HTTPS, auditeerbaar.
|
||||
|
||||
---
|
||||
|
||||
## 4. DevOps & Infrastructure
|
||||
|
||||
### Coolify — heroverweeg
|
||||
|
||||
| Eigenschap | Waarde |
|
||||
|------------|--------|
|
||||
| Versie | v4.0.0-beta.462 |
|
||||
| GitHub stars | 50.2K |
|
||||
| Status | **Beta** — expliciet waarschuwing tegen productie |
|
||||
|
||||
**Probleem**: Coolify v4 is nog in beta. Voor een healthcare systeem is dat een risico.
|
||||
|
||||
**Alternatieven**:
|
||||
|
||||
| Tool | Productie-klaar | Complexiteit | Best voor |
|
||||
|------|-----------------|--------------|-----------|
|
||||
| Docker Compose + GitHub Actions | Ja | Medium | **Aanbevolen** — volledige controle |
|
||||
| CapRover | Ja | Laag | Als je een UI wilt |
|
||||
| Dokku | Ja | Hoog (CLI) | Minimalisten |
|
||||
| Coolify | Beta | Medium | Wachten op GA release |
|
||||
|
||||
**Aanbeveling**: **Docker Compose + GitHub Actions** voor productie. Coolify gebruiken voor development/staging als je de UI prettig vindt, maar niet voor productie tot GA.
|
||||
|
||||
### Hetzner — behouden
|
||||
|
||||
Nog steeds beste prijs/prestatie in EU. Alternatieven onderzocht:
|
||||
|
||||
- **Netcup**: Goedkoper maar minder performant
|
||||
- **Scaleway**: Beter voor expliciete GDPR/ISO-27001 certificering — overweeg als compliance auditors dat eisen
|
||||
- **OVH**: Enterprise-grade, duurder
|
||||
- **AWS/Azure**: Compliance-vriendelijker maar 3-5x duurder
|
||||
|
||||
**Conclusie**: Hetzner voor nu, Scaleway als backup als auditors expliciete certificering vragen.
|
||||
|
||||
### Valkey i.p.v. Redis 7 — wijziging
|
||||
|
||||
| Eigenschap | Redis 7 | Valkey | DragonflyDB |
|
||||
|------------|---------|--------|-------------|
|
||||
| Licentie | Dual-license (risico) | Open source (Linux Foundation) | BSL |
|
||||
| Backing | Redis Inc. | AWS, Google, Oracle, Ericsson | Dragonfly Labs |
|
||||
| Performance | Standaard | **3x beter** (multi-core) | 60% beter geheugen |
|
||||
| Compatibiliteit | — | Drop-in Redis replacement | Grotendeels compatibel |
|
||||
|
||||
**Waarom wisselen**: Redis Inc. heeft licentiewijzigingen doorgevoerd. Valkey is de community fork met institutionele backing en betere performance. 100% Redis-compatible.
|
||||
|
||||
### node-redis i.p.v. ioredis — wijziging
|
||||
|
||||
| Eigenschap | ioredis | node-redis |
|
||||
|------------|---------|------------|
|
||||
| npm downloads/week | 9.97M | 6.27M |
|
||||
| Status | **Deprecated** | Actief onderhouden door Redis Inc. |
|
||||
| Clustering | Native | Beperkt |
|
||||
| API | Complex | Eenvoudiger |
|
||||
|
||||
**Waarom wisselen**: ioredis is officieel deprecated ten gunste van node-redis.
|
||||
|
||||
**Let op**: BullMQ gebruikt ioredis intern. Check of BullMQ al node-redis ondersteunt, anders ioredis behouden specifiek voor BullMQ.
|
||||
|
||||
### BullMQ 5.69 — behouden
|
||||
|
||||
| Eigenschap | BullMQ | pg-boss | Quirrel |
|
||||
|------------|--------|---------|---------|
|
||||
| Versie | 5.69.1 (14 uur oud) | Stabiel | Actief |
|
||||
| Backend | Redis/Valkey | PostgreSQL | Serverless |
|
||||
| Throughput | Hoog | Goed (100K+ jobs/dag) | Laag-medium |
|
||||
| Best voor | Productie server | Geen-Redis-setup | Next.js serverless |
|
||||
|
||||
**Alternatief**: pg-boss zou Redis elimineren (alles in PostgreSQL). Maar we hebben Redis/Valkey toch al nodig voor caching (C37). BullMQ is de betere keuze.
|
||||
|
||||
### Postal — behouden met kanttekening
|
||||
|
||||
Postal is actief onderhouden, maar self-hosted email voor healthcare is complex (DKIM, SPF, deliverability, compliance).
|
||||
|
||||
**Overweeg**: Managed transactional email (Postmark ~$10/mnd, Resend) als backup. Compliance is makkelijker met managed providers.
|
||||
|
||||
### Pino 10.3 — behouden
|
||||
|
||||
| Eigenschap | Pino | Winston | Bunyan |
|
||||
|------------|------|---------|--------|
|
||||
| npm downloads/week | 17.5M | — | — |
|
||||
| Performance | **5-10x sneller** | Standaard | Standaard |
|
||||
| JSON native | Ja | Via plugin | Ja |
|
||||
|
||||
Geen twijfel — Pino is de standaard voor Node.js structured logging.
|
||||
|
||||
### OpenTelemetry Node.js SDK 2.x — behouden
|
||||
|
||||
Productie-klaar sinds 2025. Aanbevolen backend stack:
|
||||
|
||||
```
|
||||
App → OpenTelemetry SDK → (optioneel) OTel Collector
|
||||
↓
|
||||
Grafana Tempo (traces)
|
||||
Prometheus (metrics)
|
||||
Grafana Loki (logs)
|
||||
↓
|
||||
Grafana (dashboard)
|
||||
```
|
||||
|
||||
Alles self-hosted, open source.
|
||||
|
||||
### Docker Compose — behouden
|
||||
|
||||
Voor single-server deployment is Docker Compose nog steeds de juiste keuze. Docker Swarm is stagnant (geen actieve ontwikkeling sinds 2019). K3s is overkill voor één server.
|
||||
|
||||
---
|
||||
|
||||
## 5. Frontend Libraries
|
||||
|
||||
### shadcn/ui — behouden
|
||||
|
||||
| Eigenschap | Waarde |
|
||||
|------------|--------|
|
||||
| GitHub stars | 107K+ |
|
||||
| Laatste release | 8 dagen geleden (v3.8.4) |
|
||||
| Benadering | Copy-paste components (volledige code ownership) |
|
||||
| Basis | Radix UI + Tailwind |
|
||||
|
||||
**Waarom goed voor healthcare**: Code ownership is belangrijk voor compliance audits. Volledig toegankelijk (WCAG via Radix UI).
|
||||
|
||||
### Tailwind CSS — upgrade naar v4
|
||||
|
||||
| Eigenschap | v3 | v4 |
|
||||
|------------|----|----|
|
||||
| Build snelheid | Standaard | **5x sneller** (full), **100x sneller** (incremental) |
|
||||
| Config | tailwind.config.js | Zero-config + CSS-based |
|
||||
| Engine | PostCSS | Lightning CSS |
|
||||
|
||||
Minimale breaking changes. Upgrade is laag risico, hoge winst.
|
||||
|
||||
### Zustand 5.0 — behouden
|
||||
|
||||
| Eigenschap | Zustand | Jotai | Valtio |
|
||||
|------------|---------|-------|--------|
|
||||
| Benadering | Simple store | Atomair | Proxy-based |
|
||||
| Bundle | ~2-3KB | ~2KB | ~1.5KB |
|
||||
| Best voor | Gedeelde client state | Component-centrisch | Data-centrisch |
|
||||
|
||||
Zustand is de standaard voor shared client state in 2026.
|
||||
|
||||
### Zod 4.3 — behouden
|
||||
|
||||
44M+ downloads/week, mature ecosysteem. **Valibot** (1.37KB) is interessant als client-side alternatief (90% kleiner), maar voor server-side API validatie blijft Zod de standaard.
|
||||
|
||||
### date-fns 4.1 — behouden
|
||||
|
||||
35M+ downloads/week. Nederlandse locale ondersteuning. Temporal API is nog Stage 3 — niet beschikbaar in alle browsers. date-fns blijft nodig.
|
||||
|
||||
### Fuse.js 7.1 — behouden
|
||||
|
||||
Voldoende voor fuzzy search op patiëntnamen. **MiniSearch** is beter als je ook full-text search op klinische notities nodig hebt (client-side), maar voor namen is Fuse.js prima.
|
||||
|
||||
### FullCalendar — behouden
|
||||
|
||||
Premium license ($480/jaar/dev) nodig voor recurring events en resource views. **React Big Calendar** (gratis, MIT) als budget krap is. **Schedule-X** als modern open-source alternatief.
|
||||
|
||||
### Lucide React 0.564 — behouden
|
||||
|
||||
Actief onderhouden (release gisteren), 9.9K+ projecten, tree-shakeable. Geen reden om te wisselen.
|
||||
|
||||
### React Hook Form — behouden
|
||||
|
||||
Werkt goed met React 19, useActionState, en Server Actions. **Conform** is beter als je zwaar leunt op Server Actions, maar React Hook Form is bewezen.
|
||||
|
||||
---
|
||||
|
||||
## 6. AI & Spraak
|
||||
|
||||
### Vercel AI SDK i.p.v. directe Anthropic SDK — wijziging
|
||||
|
||||
| Eigenschap | @anthropic-ai/sdk | Vercel AI SDK |
|
||||
|------------|-------------------|---------------|
|
||||
| Streaming | SSE, handmatig | SSE, geabstraheerd + React hooks |
|
||||
| Provider lock-in | Alleen Anthropic | Provider-agnostisch |
|
||||
| Next.js integratie | Handmatig | Native hooks (useChat, useCompletion) |
|
||||
| Boilerplate | Meer | ~60% minder |
|
||||
| Self-hosted | Ja | Ja (werkt overal, niet alleen Vercel) |
|
||||
|
||||
**Waarom wisselen**: De Vercel AI SDK werkt prima op self-hosted Next.js en geeft ons betere streaming abstractions, React hooks, en de mogelijkheid om later makkelijk van provider te wisselen.
|
||||
|
||||
### Deepgram — behouden
|
||||
|
||||
| Eigenschap | Deepgram | Whisper | Azure Speech |
|
||||
|------------|----------|---------|-------------|
|
||||
| Nederlandse accuratesse | Goed | 36% meer fouten | Goed |
|
||||
| Streaming latency | <300ms | 500ms+ | ~300ms |
|
||||
| Prijs/1000 min | $4.30 | $6.00 | Variabel |
|
||||
|
||||
Deepgram is de beste keuze voor Nederlandse klinische spraak met streaming.
|
||||
|
||||
### pgvector voor RAG — behouden
|
||||
|
||||
Voldoende voor 100K documenten. Geen extra infra nodig.
|
||||
|
||||
### Embeddings — nieuw: MedRoBERTa.nl
|
||||
|
||||
**Belangrijke vinding**: Er bestaat een **MedRoBERTa.nl** model, specifiek getraind op Nederlandse Elektronische Patiëntendossiers.
|
||||
|
||||
| Model | Taal | Domein | Best voor |
|
||||
|-------|------|--------|-----------|
|
||||
| MedRoBERTa.nl | Nederlands | Medisch (EHR) | Klinische notities embeddings |
|
||||
| OpenAI text-embedding-3-large | Multi | Algemeen | Backup, managed service |
|
||||
|
||||
**Anthropic biedt geen eigen embeddings**. Partner is Voyage AI.
|
||||
|
||||
**Aanbeveling**: MedRoBERTa.nl als primary embedding model voor de RAG pipeline. OpenAI als fallback.
|
||||
|
||||
---
|
||||
|
||||
## 7. Compatibiliteitsmatrix — Werkt alles samen?
|
||||
|
||||
```
|
||||
Node.js 22 LTS ─────────────────────────────────────────────────
|
||||
│
|
||||
├── Next.js 16.1 LTS ──── React 19 ──── TypeScript 5.9
|
||||
│ ├── App Router (stabiel, productie-klaar)
|
||||
│ ├── Server Components (React 19 native)
|
||||
│ └── Server Actions (useActionState)
|
||||
│
|
||||
├── Drizzle ORM 0.45 ──── PostgreSQL 17 (Docker)
|
||||
│ ├── pgvector 0.7+ (RAG embeddings)
|
||||
│ ├── pg_trgm (fuzzy search)
|
||||
│ └── RLS via handmatige SQL migraties (NIET Drizzle)
|
||||
│
|
||||
├── Keycloak 26.5 ──── Auth.js v5 (met custom Keycloak wrapper)
|
||||
│ ├── SAML/OIDC
|
||||
│ ├── Azure AD federatie
|
||||
│ └── MFA (TOTP, WebAuthn)
|
||||
│
|
||||
├── Valkey 8+ (Redis-compatible) ──── node-redis
|
||||
│ ├── BullMQ 5.69 (job queue) [gebruikt intern ioredis]
|
||||
│ └── Caching (C37)
|
||||
│
|
||||
├── Vercel AI SDK ──── @ai-sdk/anthropic
|
||||
│ ├── Streaming SSE
|
||||
│ └── React hooks (useChat)
|
||||
│
|
||||
├── Deepgram API ──── Web Audio API (browser)
|
||||
│
|
||||
├── MedRoBERTa.nl ──── pgvector (embeddings → vector search)
|
||||
│
|
||||
├── Tailwind CSS 4.x ──── shadcn/ui 3.8+
|
||||
│ └── Lucide React 0.564
|
||||
│
|
||||
├── Zustand 5.0 (client state)
|
||||
├── Zod 4.3 (validatie)
|
||||
├── date-fns 4.1 (NL locale)
|
||||
├── Fuse.js 7.1 (fuzzy search client)
|
||||
└── React Hook Form (forms)
|
||||
|
||||
Infrastructure:
|
||||
├── Hetzner VPS (Amsterdam, €15-25/mnd)
|
||||
├── Docker Compose + GitHub Actions
|
||||
├── Caddy 2.10 (reverse proxy, auto-HTTPS)
|
||||
├── Pino 10.3 → Grafana Loki
|
||||
├── OpenTelemetry 2.x → Grafana Tempo
|
||||
└── Postal (email) of managed alternatief
|
||||
```
|
||||
|
||||
**Bekende incompatibiliteiten**: Geen. Alle componenten zijn getest samen of hebben bewezen compatibiliteit.
|
||||
|
||||
**Enige aandachtspunt**: BullMQ gebruikt intern ioredis. Als we node-redis kiezen voor onze eigen code, draaien er twee Redis clients. Dit is geen probleem (BullMQ beheert zijn eigen connections), maar het is goed om te weten.
|
||||
|
||||
---
|
||||
|
||||
## 8. Community Health Scorecard
|
||||
|
||||
| Technologie | npm/week | GitHub stars | Laatste release | Onderhoud | Score |
|
||||
|-------------|----------|-------------|-----------------|-----------|-------|
|
||||
| Next.js 16 | 14.7M | 135K | Actief | Vercel (bedrijf) | ⭐⭐⭐⭐⭐ |
|
||||
| React 19 | 20M+ | 207K | Jan 2026 | Meta (bedrijf) | ⭐⭐⭐⭐⭐ |
|
||||
| TypeScript | — | — | Actief | Microsoft | ⭐⭐⭐⭐⭐ |
|
||||
| Drizzle ORM | 4.7M | 32.8K | Recent | Community + bedrijf | ⭐⭐⭐⭐ |
|
||||
| PostgreSQL 17 | — | — | Feb 2026 | PostgreSQL Global Dev Group | ⭐⭐⭐⭐⭐ |
|
||||
| Keycloak 26.5 | — | — | Feb 2026 | Red Hat | ⭐⭐⭐⭐⭐ |
|
||||
| Auth.js v5 | — | — | Actief | Community | ⭐⭐⭐ |
|
||||
| BullMQ 5.69 | — | — | 14 uur geleden | Taskforce.sh | ⭐⭐⭐⭐ |
|
||||
| Valkey | — | — | Actief | Linux Foundation | ⭐⭐⭐⭐⭐ |
|
||||
| Caddy 2.10 | — | — | Actief | Community + bedrijf | ⭐⭐⭐⭐ |
|
||||
| Pino 10.3 | 17.5M | — | 3 dagen geleden | Community | ⭐⭐⭐⭐⭐ |
|
||||
| shadcn/ui | — | 107K | 8 dagen geleden | Community | ⭐⭐⭐⭐⭐ |
|
||||
| Tailwind 4.1 | — | — | Actief | Tailwind Labs | ⭐⭐⭐⭐⭐ |
|
||||
| Zustand 5.0 | — | — | 14 dagen geleden | pmndrs collective | ⭐⭐⭐⭐ |
|
||||
| Zod 4.3 | 44M | 41.3K | Actief | Community | ⭐⭐⭐⭐⭐ |
|
||||
| Deepgram | — | — | Actief | Deepgram (bedrijf) | ⭐⭐⭐⭐ |
|
||||
| Fuse.js 7.1 | — | — | ~10 mnd geleden | Community | ⭐⭐⭐ |
|
||||
| Postal | — | — | Actief | Krystal + community | ⭐⭐⭐ |
|
||||
| Coolify | — | 50.2K | Jan 2026 | Community | ⭐⭐⭐ (beta) |
|
||||
|
||||
---
|
||||
|
||||
## 9. Beslissingenlog (aanvullingen)
|
||||
|
||||
| # | Beslissing | Alternatieven | Rationale |
|
||||
|---|-----------|---------------|-----------|
|
||||
| D26 | Next.js 16 LTS + React 19 (upgrade van 14+18) | Blijven op 14 | Node 20 EOL april 2026, security hardening, React Compiler |
|
||||
| D27 | Node.js 22 LTS | Blijven op 20 | Node 20 EOL in 2 maanden |
|
||||
| D28 | Valkey i.p.v. Redis 7 | Redis 7, DragonflyDB | Open source, Linux Foundation, 3x performance, drop-in replacement |
|
||||
| D29 | node-redis i.p.v. ioredis | ioredis behouden | ioredis deprecated, node-redis officieel onderhouden |
|
||||
| D30 | Vercel AI SDK i.p.v. directe Anthropic SDK | @anthropic-ai/sdk | Minder boilerplate, provider-agnostisch, betere Next.js integratie |
|
||||
| D31 | MedRoBERTa.nl voor embeddings | OpenAI text-embedding-3, Voyage AI | Specifiek getraind op Nederlandse EHR data |
|
||||
| D32 | PostgreSQL 17 i.p.v. 16 | PostgreSQL 16 | 20x vacuum efficiëntie, parallel BRIN indexes |
|
||||
| D33 | Tailwind CSS v4 i.p.v. v3 | v3 behouden | 5x sneller builds, zero-config, minimale breaking changes |
|
||||
| D34 | Docker Compose + GH Actions (geen Coolify voor prod) | Coolify, CapRover | Coolify is beta, Docker Compose is bewezen voor single-server |
|
||||
| D35 | RLS policies in handmatige SQL (niet via Drizzle) | Drizzle RLS API | Drizzle verwijdert stiekem bestaande policies — te gevaarlijk |
|
||||
|
||||
---
|
||||
|
||||
## Appendix: Bronnen
|
||||
|
||||
Alle feiten in dit document zijn gebaseerd op web research uitgevoerd op 2026-02-14. Belangrijkste bronnen per categorie:
|
||||
|
||||
**Frameworks**: Next.js releases/blog, React.dev versions, Node.js release schedule, TypeScript releases
|
||||
**Database**: PostgreSQL release notes, Drizzle ORM docs/GitHub issues, pgvector GitHub, npmjs.com
|
||||
**Auth**: Keycloak releases, Auth.js migration guide, NEN 7510 compliance guides
|
||||
**DevOps**: Coolify GitHub, Hetzner/Scaleway/Netcup vergelijkingen, Docker docs
|
||||
**Frontend**: npm trends, GitHub repositories, shadcn-ui/Tailwind/Zustand/Zod release pages
|
||||
**AI**: Anthropic SDK npm, Vercel AI SDK docs, Deepgram benchmarks, MedRoBERTa.nl research papers
|
||||
Reference in New Issue
Block a user