Key points
- Normal authenticated routes and APIs stay locked until setup completes once.
GET /v1/setup/preflightandGET /v1/setup/statusare public so a stuck install can be diagnosed without a token.- During cold starts the API serves preflight while PostgreSQL is still starting:
/livezstays process-alive and/healthzstays unready with the current preflight JSON. - The wizard can generate secrets, seed starter profiles, create the GitOps layout, and create repository teams.
- Setup apply errors include the actionable write or configuration reason.
- Setup does not force an env-file write for dispatcher TLS when a valid effective service JWT fallback is already configured.
- Once the one-time wizard has run, System > Setup is a status page: health checks and resource counts. The setup steps are not shown again.
Examples
# both routes answer before authentication so a stuck install can be diagnosed
curl -s "$NOPSAI_URL/v1/setup/preflight" | jq
curl -s "$NOPSAI_URL/v1/setup/status" | jqHow it works
Bootstrap-created local admin credentials rotate on first login by default, and generated Docker Compose installs reject the built-in development admin password.
Preflight is the right first stop for any "the UI will not let me in" report. It names the blocker rather than leaving you to infer it from logs.
Implementation evidence
doc/first-install-wizard.mdBootstrap flow, starter profiles, and production guardrails.
services/nopsai/setup_preflight.goCold-start preflight behavior.

