Skip to main content

Design decisions (ADRs)

Denia records architecture decisions as ADRs in docs/adr/. They are the source of truth for accepted decisions — this page indexes all 37 and links each to its source. Architecture changes (runtime isolation, ingress, secrets, persistence, API, dependencies) require a new or updated ADR.

Status legend: Accepted — in force; Proposed — drafted, not yet ratified; Superseded — replaced by a later ADR.

ADRTitleStatus
001Initial Backend ArchitectureAccepted
002Frontend Effect Logic LayerProposed
003Linux Runtime Process RunnerAccepted
004Embed Web Console in Service BinaryProposed
005Runtime Security HardeningAccepted
006Projects And Versioned MigrationsProposed
007Ingress + TLSProposed
008Project-Scoped RBACProposed
009Observability (Node, Workloads, Access Log)Proposed
010Jobs and SchedulerProposed
011In-Process OCI Image AcquisitionProposed
012src/ Modularization and Per-Aggregate RepositoriesProposed
013Domain Support With HTTP File VerificationAccepted
014Per-Service OCI Registry ConfigurationProposed
015Streaming OCI Layer StagingProposed
016Denia-Managed TraefikSuperseded by 020
017Service CRUD APIProposed
018AutoscalingAccepted
019Per-Replica Runtime Filesystem IsolationAccepted (amended by 026)
020In-Process Pingora IngressAccepted
021Control-Plane SOPS Secret EncryptionAccepted
022Persistent OCI Layer Cache With Weekly GCAccepted
023TOML Config File With Env OverrideAccepted
024Async Deployments With Per-Deployment Log StreamAccepted
025CLI-Driven Host ProvisioningAccepted
026Privileged Overlay Mount Before the User-Namespace UnshareAccepted
027Workload Lifecycle Bound to the DaemonAccepted
028Deploy→Autoscale Replica Ownership HandoffAccepted
029Self-Update From Signed GitHub Release BinariesAccepted
030Cross-Platform Client CLISuperseded by 034
031Hosted OCI RegistryAccepted
032HTTP/2 Ingress HardeningAccepted
033Service ConsoleAccepted
034Client-Driven Deploy via Working-Tree UploadAccepted
035Control Domain Over IngressAccepted
036General-Purpose Protocol IngressProposed
037Cross-Platform Client via cfg-Gated Single Crate + crates.ioProposed

The decisions that shape the product

  • No container runtime (001, 003, 005) — workloads run under Denia-owned namespaces + cgroup v2 + dropped caps, not Docker/containerd/runc.
  • Per-replica overlay rootfs (019, amended by 026) — each replica gets an isolated mutable layer; the privileged overlay mount happens before the userns unshare.
  • In-process ingress + TLS (020, supersedes 016; 032, 035) — Pingora + instant-acme, no Traefik/certbot.
  • Secrets out of the database (021, 023) — SOPS-encrypted files to a host-local age identity; SQLite stores references only.
  • Health-gated async deploys (024, 028) — promote only on a passing health check; clean deploy→autoscale handoff.
  • Client-driven deploy (034, supersedes 030) — denia push uploads the working tree; no local Docker.
  • Signed self-update (029) — minisign-verified GitHub release binaries, atomic swap.
  • Hosted registry (031) — same-origin /v2 OCI Distribution with conservative GC.