Platform

Platform overviewArchitectureWorkflow orchestrationGitOps configurationGovernance and AAAAI and MCPKnowledge and contextRuntime and executionEvidence and monitoring

Use cases

All use casesProduction incidentRelease preparationHotfix to productionSecurity scan triage
Why NopsAIIntegrationsSecurity

Resources

All resourcesAI agent governanceMCP governanceMCP securitySelf-hosted platforms
PricingGitHub

Company

How a run worksAboutContactBook a demo

Platform probes

The five routes that answer without a token, and what an operator should assert on each.

ReferenceOperatorAdministratorDeveloper

Key points

  • All five are public by design: they have to work when authentication does not.
  • /livez reports the process; /healthz reports readiness and stays unready while the database is unreachable.
  • /version is the compatibility contract — released CLIs read it to refuse incompatible mutating requests.
  • /metrics is public unless METRICS_REQUIRE_AUTH=true.
  • None of them writes anything, and /favicon.ico exists specifically to keep browser probes out of the audit log.

Operations

GET/healthzPublic

Readiness. Stays unready while setup preflight is retrying an unreachable database.

Notes

Use this for readiness gates. A cold start answers 503 until PostgreSQL is reachable, then flips to 200 without a restart.

Responses

200application/json

The API is ready to serve requests.

{"status":"ok"}
503application/json

Preflight mode only: the platform is up but not ready. The body is the full preflight response, so the blocking check is visible without a second call.

{"ready":false,"can_login":false,"mode":"setup","checks":[{"id":"database","label":"Database","status":"error","message":"database is not reachable yet","required":true}]}

Side effects

  • None. The probe reads state and never writes.

Proven by

  • services/nopsai/auth_middleware_test.go
  • services/nopsai/health_handler.go
  • services/nopsai/setup_preflight.go
GET/livezPublic

Liveness. Answers as soon as the process is up, independent of database state.

Notes

Never gate a restart on this returning 200 with a broken database — that is what /healthz is for.

Responses

200application/json

The process is alive.

{"status":"alive"}

Side effects

  • None.

Proven by

  • services/nopsai/auth_middleware_test.go
  • services/nopsai/health_handler.go
GET/versionPublic

Build identity: product and API versions, supported CLI and runner ranges, capabilities, and the release manifest digest.

Notes

Released CLIs read this to reject incompatible mutating requests before sending them.

Responses

200application/json

Public build information. Deliberately carries no deployment configuration and no credentials.

{
  "productVersion": "0.22",
  "commit": "e387a81d",
  "buildDate": "2026-08-19T10:04:11Z",
  "apiVersion": "v1",
  "cliCompatibility": ">=0.20",
  "runnerCompatibility": ">=0.20",
  "runnerProtocolVersion": 1,
  "capabilities": [],
  "releaseManifestDigest": ""
}

Side effects

  • None.

Proven by

  • services/nopsai/version_handler_test.go
  • services/nopsai/version_handler.go
  • pkg/buildinfo/buildinfo.go
GET/metricsPublic

Prometheus metrics, including identity-provider capability and authorization grant ownership series.

Notes

Set METRICS_REQUIRE_AUTH=true to require a bearer token. Leave it public only where the scrape path is already private.

Responses

200text/plain; version=0.0.4

Prometheus text exposition format.

# HELP nopsai_build_info Build identity of the running platform.
# TYPE nopsai_build_info gauge
nopsai_build_info{version="0.22"} 1
401

Only when METRICS_REQUIRE_AUTH=true and the request carries no valid bearer token.

Side effects

  • None.

Proven by

  • services/nopsai/routes.go
GET/favicon.icoPublic

Empty cacheable browser probe so missing-favicon requests do not create bearer token errors in audit logs.

Responses

200

Empty body. It exists to keep browser probes out of the authentication path.

Side effects

  • None. It deliberately produces no audit record.

Proven by

  • services/nopsai/auth_middleware_test.go
  • services/nopsai/routes.go

Examples

Check every probe in one passbash
curl -s "$NOPSAI_URL/livez"
curl -s -o /dev/null -w "healthz: %{http_code}\n" "$NOPSAI_URL/healthz"
curl -s "$NOPSAI_URL/version" | jq '{productVersion, apiVersion, runnerProtocolVersion}'
curl -s "$NOPSAI_URL/metrics" | head -5
Result

livez answers immediately, healthz returns 200 once the database is reachable and 503 before that, and version reports the build the images were produced from.

Replace before running
  • $NOPSAI_URL is the API address, http://localhost:8080 on a local install.

How it works

Gate restarts on /livez and traffic on /healthz. Inverting the two produces a restart loop during a slow database start, because readiness is exactly the thing that is temporarily false.

During setup-preflight mode /healthz answers 503 with the full preflight document rather than a bare status, so the blocking check is visible without a second call.

Implementation evidence

  • services/nopsai/health_handler.go

    Readiness and liveness responses.

  • services/nopsai/version_handler.go

    Public build identity payload.