Skip to content

Technical Documentation

This section covers the engineering of Ponos: the single-script orchestrator, the symlink-based dotfiles model, the Python/Click CLI extensions, the Git template hooks, and the Architecture Decision Records that justify each choice. It assumes the Functional Documentation — especially the Actors & Trust Boundary baseline — is understood.

System at a glance

Ponos is not a running service; it is a repository of code and configuration plus one orchestrator that reconciles a macOS machine to the state that repository declares.

The orchestrator installs Homebrew and packages, symlinks the dotfiles, installs the language toolchains, writes the global Git config and template hooks, and wires the shell aliases that expose the Python CLIs. Everything runs as the invoking user; the network is used to fetch Homebrew, packages, plugins and runtimes.

Documentation map

PagePurpose
Getting StartedPrerequisites and the exact procedure to run Ponos on a fresh Mac
ArchitectureThe orchestrator's structure, the idempotency and backup model, and how a run flows end to end
CLI ReferenceEvery alias, Click command, flag and Git alias, with defaults
ConfigurationEnvironment variables, the persisted choices file, the Brewfile, and managed paths
ADR indexAll Architecture Decision Records, in causal order

Stack summary

ConcernChoice
OrchestratorBash (set -euo pipefail), idempotent, macOS-guarded
Package managerHomebrew + brew bundle (declarative Brewfile)
DotfilesSymlinks with timestamped backups; optional chezmoi layer
Pythonpyenv (latest stable 3.x) + click, colorlog
Node.jsnvm (LTS, default lts/*)
JavaSDKMAN (pinned Temurin LTS)
Shellzsh + Starship prompt + autosuggestions + syntax-highlighting
CLI extensionsPython 3 + Click command groups (git_ext, sys_ext)
Git governanceGlobal config + init.templateDir hooks (commit-msg, pre-push)
FontHack Nerd Font (Homebrew cask)
EditorsVim (+ Dracula), VS Code (curated extensions), Opencode
LoggingANSI-coloured, level-tagged, timestamped (bash log + Python colorlog)

ADR format

Each ADR lives in adr/[NNN]-[short-title].md and follows this structure:

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.