Logs: JSON to stdout (docker compose logs app); LOG_FORMAT=pretty for reading by eye.
Metrics and health on port 9464 only: /metrics (Prometheus) and /health. Alert on the chatAnswering
value, which reports whether model loads actually succeed; it is absent until one has been tried.
Traces: set OTEL_EXPORTER_OTLP_ENDPOINT to your OTLP gRPC collector, and OTEL_EXPORTER_OTLP_HEADERS
(key=value,key2=value2) if it needs an auth header. The GPU overlay runs Jaeger and sends traces there by
default: open http://localhost:16686 (in memory, cleared on restart).
Profiles (off by default): with PROFILING_ENABLED=true,
curl -X POST "http://<host>:9464/debug/profile/cpu?seconds=30" (1 to 120) or .../debug/profile/heap writes a
file to ./mnt/profiles; read it with bun scripts/profile-summary.ts <file> from src/, or open it in Chrome
DevTools. A heap snapshot holds everything in memory, library text and sign-in tokens included: treat the files as
secrets and delete them after use.
API reference at http://<host>:9464/openapi (and /openapi.json), bundled, no internet needed.
Operator API (off by default): the whole /api/v1 surface on port 3003 as an administrator, with no
password. Turn it on with OPERATOR_API=true plus the 3003 ports line, bind it to 127.0.0.1, and try
curl http://localhost:3003/api/v1/status.