0003. One Go binary per service, one stack
Status: accepted, 2026-10-09
Context
pages proved the shape: one Go binary with an embedded React panel, a CLI, systemd and Caddy. The platform
grows to ~20 services; the author wants one stack, strictly.
Decision
- Every service is one Go binary (
<service>d) in its own repository, with its panel (React + Vite +
Tailwind 4 + shadcn/ui) embedded through embed.FS. Inside, a modular monolith: packages per domain,
no internal network hops.
- No other runtime languages on the server side. TypeScript only in panels (and in user bot templates
that run as
apps workloads, see ADR 0011).
- Shared Go code in
kit, shared panel code in the ui shadcn registry, one CLI xvii.
Consequences
- A service fails, upgrades and rolls back alone.
- Cross-service features go through APIs and events, never shared tables.