Key points
nopsai-apiowns REST APIs, validation, orchestration, setup, monitoring, credentials, notifications, GitOps, auth integration, and run records.aaaowns authorization decisions, policy checks, ACL expansion, filtering, and decision audit records.dispatcherowns runner registration, queueing, routing, capacity selection, and job assignment over gRPC.git-botowns GitHub App webhooks, repository access, check runs, and GitHub-specific integration.- Runners start one agent per assigned run; the agent then starts step containers or pods and reports status back.
- Gotenberg renders PDF final outputs. The Docker socket proxy exposes only the allow-listed reads System Logs needs.
How it works
The API submits jobs to the dispatcher. Runners hold long-lived outbound connections to the dispatcher, which keeps registration and capacity visible to the control plane without inbound access to the runner.
Docker runners create containers and named Docker volumes. Kubernetes runners create an agent pod, a PVC-backed workspace, and step pods in their namespace.
UI and CLI are entry points only. They call authenticated REST routes and never talk directly to AAA, the dispatcher, PostgreSQL, or runners.
During cold starts, setup preflight keeps /healthz unready while retrying a database that is still starting. /livez stays process-alive, and normal API startup resumes automatically once PostgreSQL is reachable.
Examples
ENTRY POINTS
browser · CLI · API clients git providers
│ │
│ authenticated REST │ signed webhooks
│ ▼
│ git-bot
└───────────────┬─────────────────┘
▼
───────────────────────────────────────────────────────────
DURABLE CONTROL PLANE
nopsai API ◀────▶ aaa
│
┌────────────────┼──────────────────┐
▼ ▼ ▼
PostgreSQL gotenberg docker-socket-proxy
durable state PDF outputs allow-listed reads
───────────────────────────────────────────────────────────
│ SubmitJob gRPC
▼
EPHEMERAL EXECUTION PLANE
dispatcher
▲ │
runner dials out ─┘ │ assigns runs over that stream
▼
runner
│ starts one agent per run
▼
agent ────▶ step containers or pods
│
├───────▶ LLM providers
└───────▶ MCP servers
───────────────────────────────────────────────────────────Limits
- Kubernetes emptyDir is not used for shared run workspaces; the agent owns a PVC instead.
- Docker runners ignore Kubernetes runtime pools and affinity settings.
Implementation evidence
doc/service-reference.mdWhat each service owns and which files to read.
services/nopsai/routes.goThe REST surface the control plane exposes.

