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
- Retry with backoff until a timeout - full status typically appears seconds after the daemon starts
- Verify CLI and daemon versions match ('netbird version' vs the installed service binary) and restart the service if skewed
- 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
- Configure container probes with an initial delay so the daemon finishes its first status gather
- Align CLI and daemon versions so FullStatus is always populated
- Treat 'no full status' as transient: poll with deadline rather than failing on first attempt
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
- readiness check: unexpected daemon status %q
- wait for extend session: %v
- switch profile: %v
- switch profile on daemon: %v
- failed initializing log %v
AI-assisted analysis of netbirdio/netbird@93e97f4bf1 (2026-08-16).
Data as JSON: /api/errors/ddd812bd0a1e25d5.
Report an issue: GitHub.