netbirdio/netbird · error

startup check: no full status available

Error message

startup check: no full status available

What it means

Thrown by checkStartup (client/cmd/status.go:293), used by 'netbird status --check startup'. The daemon answered the Status RPC but resp.GetFullStatus() is nil, meaning it did not attach the detailed FullStatus snapshot. This happens when the daemon has not yet assembled full status (engine still starting) or when the daemon predates the FullStatus field in the daemon IPC protocol.

Source

Thrown at client/cmd/status.go:293

	}
}

func checkReadiness(resp *proto.StatusResponse) error {
	daemonStatus := internal.StatusType(resp.GetStatus())
	switch daemonStatus {
	case internal.StatusIdle, internal.StatusConnecting, internal.StatusConnected:
		return nil
	case internal.StatusNeedsLogin, internal.StatusLoginFailed, internal.StatusSessionExpired:
		return fmt.Errorf("readiness check: daemon status is %s", daemonStatus)
	default:
		return fmt.Errorf("readiness check: unexpected daemon status %q", daemonStatus)
	}
}

func checkStartup(resp *proto.StatusResponse) error {
	fullStatus := resp.GetFullStatus()
	if fullStatus == nil {
		return fmt.Errorf("startup check: no full status available")
	}

	if !fullStatus.GetManagementState().GetConnected() {
		return fmt.Errorf("startup check: management not connected")
	}

	if !fullStatus.GetSignalState().GetConnected() {
		return fmt.Errorf("startup check: signal not connected")
	}

	var relayCount, relaysConnected int
	for _, r := range fullStatus.GetRelays() {
		uri := r.GetURI()
		if !strings.HasPrefix(uri, "rel://") && !strings.HasPrefix(uri, "rels://") {
			continue
		}
		relayCount++
		if r.GetAvailable() {

View on GitHub (pinned to 93e97f4bf1)

Solutions

  1. Retry with backoff until a timeout - full status typically appears seconds after the daemon starts
  2. Verify CLI and daemon versions match ('netbird version' vs the installed service binary) and restart the service if skewed
  3. Check daemon logs for startup errors that prevent the first status gather
Defensive patterns

Strategy: retry

Validate before calling

var resp *proto.StatusResponse
err := WithBackOff(func() error {
    var e error
    resp, e = getStatus(ctx, true, false)
    if e == nil && resp.GetFullStatus() == nil {
        return fmt.Errorf("full status not gathered yet") // retried by backoff
    }
    return e
})

Prevention

When it happens

Trigger: Running 'netbird status --check startup' immediately after 'netbird service start' before the first status gather completes; running a new CLI against an old daemon binary whose StatusResponse never populates the FullStatus protobuf field.

Common situations: Container health probes configured with no initial delay or too-short timeouts; version skew after upgrading only the CLI; daemon stuck in early startup (slow engine init).

Related errors


AI-assisted analysis of netbirdio/netbird@93e97f4bf1 (2026-08-16). Data as JSON: /api/errors/ddd812bd0a1e25d5. Report an issue: GitHub.