Skip to content

Architecture Decision Records ​

Each ADR captures one significant technical decision — its context, what was decided, and the trade-offs accepted. They describe the system as it is built. Where a decision has proved questionable in hindsight, that is recorded in a Retrospective section rather than hidden.

ADRDecisionThemeStatus
001Hexagonal (ports & adapters) architecture, enforced by ArchUnitBackend structureAccepted
002Reactive stack: Spring WebFlux + R2DBCBackend runtimeAccepted
003Kotlin on the JVM, Java 25 toolchainLanguageAccepted
004Delegated authentication via OIDC (resource server + confidential client)SecurityAccepted
005Database-driven, project-scoped RBAC via a custom PermissionEvaluatorAuthorizationAccepted
006PostgreSQL with Flyway migrations and pg_trgm trigram searchPersistenceAccepted
007Frontend runtime configuration injection (one immutable image)Frontend deliveryAccepted
008NGXS for frontend state managementFrontend stateAccepted
009Distroless container delivery with semantic-releaseBuild & releaseAccepted
010Retention purges as scheduled, permission-gated endpointsData retentionAccepted
011PrimeNG with runtime themingFrontend UIAccepted
012Per-instance authentication rate limiting with Caffeine, not a shared storeSecurityAccepted

Format ​

markdown
# ADR NNN — Title

## Status
<Badge type="tip" text="Accepted" />

## Context
What problem or constraint triggered this decision?

## Decision
What was decided?

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

## Retrospective   (optional)
How the decision has held up in practice, including regrets.

The Status badge uses one of:

BadgeMeaning
AcceptedDecided and in effect
ProposedDrafted, not yet decided
RejectedConsidered and turned down
Superseded by ADR NNNReplaced by a later ADR (or Deprecated)