Skip to content

Architecture Decision Records

Each ADR captures one significant technical decision — its context, what was decided, and the trade-offs accepted. They are listed here in causal order: the foundational choices first, then the ones that build on them.

ADRDecisionTheme
001Hexagonal (ports & adapters) architecture, enforced by ArchUnitBackend structure
002Reactive stack: Spring WebFlux + R2DBCBackend runtime
003Kotlin on the JVM with a Java 25 toolchainLanguage
004Delegated authentication via OIDC (resource server + confidential client)Security
005Database-driven, project-scoped RBAC via a custom PermissionEvaluatorAuthorization
006PostgreSQL with Flyway migrations and pg_trgm trigram searchPersistence
007Keeping (and documenting) the inverted in/out adapter namingConvention
008Frontend runtime configuration injection (one immutable image)Frontend delivery
009NGXS for frontend state managementFrontend state
010Distroless container delivery with semantic-releaseBuild & release
011Frontend framework: Vue 3 on Nuxt (replacing Angular)Frontend framework
012Rendering strategy: server-side rendering on NuxtFrontend rendering
013Design system: Ant Design Vue (replacing PrimeNG)Frontend UI
014Frontend state: Pinia + facades (supersedes 009)Frontend state
015Accessibility: WCAG 2.2 AA (formalizable to EN 301 549 / EAA)Accessibility
017API v2 naming, query conventions, and v1 sunsetAPI contract
018Backend caching (Caffeine in-process) and database optimizationPerformance
019Backend security hardening: rate limiting, session/token policy, audit loggingSecurity
020Frontend observability: OpenTelemetry → Prometheus/GrafanaObservability
021Test strategy and Angular→Vue parity (Playwright)Quality
022Full BFF: Nuxt OIDC client, Spring private resource server (amends 004)Security
023Runtime configuration on Nuxt (revises 008)Frontend delivery
024Frontend-tier security: CSP, cookies, CSRF, headersSecurity

Migration ADRs — review outcome (see the Migration Plan). The frontend rewrite is committed: ADRs 011/012/013/014/022/023 were promoted to Accepted (the Phase-0 spike now de-risks implementation rather than gating the decision). 024 is Accepted with a committed CSP baseline (strict script-src nonce; pragmatic style-src, upgradeable to fully-strict if the spike shows AntD styles can be nonced). All 13 migration ADRs (011–015, 017–024) are now Accepted. ADR 016 (frontend data/caching) was removed; the data layer is Nuxt built-ins, folded into implementation. Supersessions/revisions: 009→014 (Pinia), 008→023 (Nuxt runtime config), 004 amended by 022 (full-BFF auth); 024 is the frontend half of the security work in 019.

Format

Every record follows the same shape:

markdown
# ADR NNN — Title

## Status
Accepted | Superseded by ADR NNN | Deprecated

## Context
What problem or constraint triggered this decision?

## Decision
What was decided?

## Consequences
Positive and negative trade-offs, and why the alternatives were rejected.