ADR 0001 — Runtime and base image

Rendered from docs/decisions/0001-runtime-and-base-image.md in the repository.

Context#

This is the first decision for the remote persistent dev environment described in CLAUDE.md. The image must host AI coding agents (Claude Code, Codex, pi-coding-agent), nvim, tmux, git, and an OpenSSH server, and be runnable as one or more always-on, parallel containers on a personal Linux VPS (Hetzner-class). The operator attaches over SSH and detaches via tmux. Devcontainers were rejected upstream because tooling support outside VSCode is nonexistent.

Two coupled choices are settled here:

  1. The container runtime that hosts these containers on the VPS.
  2. The base image used by the Dockerfile/Containerfile in subsequent work.

Decision#

Rationale#

Runtime — Podman#

Base image — debian:12-slim#

Alternatives considered#

Docker + Ubuntu 24.04 LTS — rejected#

Podman + Alpine 3.x — rejected#

Docker + Debian 12 — rejected#

Trade-offs#

Factor Podman + Debian 12 (chosen) Docker + Ubuntu 24.04 Podman + Alpine Docker + Debian 12
Rootless support Native Bolt-on Native Bolt-on
Daemon footprint Daemonless Daemon Daemonless Daemon
Always-on lifecycle (host init) Quadlet/systemd, native Restart policies only Quadlet/systemd Restart policies only
macOS client local-build ergonomics Lima + docker-cli (operator's existing setup) Docker Desktop / OrbStack Lima + docker-cli or podman machine Docker Desktop / OrbStack
Image size (base) ~30 MB ~80 MB ~5 MB ~30 MB
Node/Python binary compatibility Excellent (glibc) Excellent (glibc) Quirky (musl) Excellent (glibc)
nvim recency from repo Outdated → install upstream Outdated → install upstream Reasonable Outdated → install upstream
Familiarity (operator) Lower Highest Lower Highest

Consequences#

Open questions deferred to later items#