--- type: context id: context.kontra-day.kontra-day-stack-decisions-storage-topology title: Kontra Day — stack decisions + storage topology status: active source_of_truth: false freshness: current last_reviewed: 2026-09-08 tags: - pack/kontra-day - agent-memory/context - kontra-day - goth - golang - htmx - decap - garage-s3 - gitea - topology --- # Kontra Day — stack decisions + storage topology # Kontra Day (news-opinion site) — Phase One decisions ## Stack (decided with user) - **Go + templ + htmx + Alpine + Tailwind** ("GOTH") — single static binary, server-rendered (SEO). - **Content = Markdown (.md) + front-matter** (Goldmark/CommonMark in Go). Author in Neovim/Obsidian. - **Admin = Decap CMS** at `admin.kontra.day` — free browser UI that edits the SAME .md files and commits to git. No custom admin. - **Media = Garage S3** (on .13) via `{{media:...}}` shortcodes resolved at render time. - **Templates**: templ components chosen per page (front-matter `template:`) → page → subject (`_subject.yaml`) → site (`config/site.yaml`) → theme fallback. Front page = `home` template driven by editable blocks list (`config/frontpage.yaml`). Colours = CSS design tokens (per-subject accent), not code. - **Deploy = git push → auto-pull on .13** (no build step; Go renders on request). Obsidian git-sync plugin on .27. ## Verified topology (from system-architect skill + Obsidian notes) - **.27** sam-4screen-desktop (192.168.20.27): dev box, Obsidian vault at `/home/sam/obsidian/`, Neovim. - **.13** nixos-desktop (192.168.20.13): web host, always-on. Sites in `/var/www/` (NixOS `users` group). Docker: Garage S3 (.13:3900 s3 / :3902 admin, `/home/sam/deployment/garage/`, s3 root `s3.lab.audasmedia.com.au`), Outline (:3000, uses Garage S3), PocketBase, family-home-lab stack. - **.35** sam-ubuntu1 (192.168.20.35): Gitea Docker (web :3001, SSH :2222, `gitea.lab.audasmedia.com.au` = origin) + **Caddy master reverse proxy** (`/Docker/Containers/caddy/`). - **.23** file-server (192.168.20.23): NFS backup target. - Go binary + site content run at `/var/www/kontra_day` on .13. Content origin = Gitea repo (proposed `sam/kontra-day-content`), production clone on .13, authoring clone on .27 (Obsidian vault subfolder). ## Notes / gotchas - Vikunja API at `vikunja.lab.audasmedia.com.au/api/v1`; Outline at `outline.lab.audasmedia.com.au/api` (endpoints POST; public endpoint 502s intermittently — retry, or hit container directly at .13:3000). Tokens in `~/.config/environment.d/10-secrets.conf`. Vikunja task-list response is a plain JSON array (not `{"tasks":[]}`). - Vikunja project id 10 = "Kontra Day" (tasks 118-126). Outline collection `7e85478e-8445-4b3b-b0d5-2032309981c4` = "Kontra Day", doc `b74f3299...` = "Phase One — PLAN". - PLAN.md lives at `/home/sam/home_network/web_sites/kontra_day/PLAN.md`. - AGENT.md phases: 1 planning → 2 design → 3 build/test → 4 live (system-architect skill) → 5 email+DNS (Website Host Migration plan) → 6 console+backups → 7 marketing. ## Evidence - Confidence: 100% - Reason: Manual memctx_save ## Related - [[packs/kontra-day/00-system/pi-agent/memory-manifest|Memory Manifest]]