netbirdio/netbird · error

connect to service CLI interface: %w

Error message

connect to service CLI interface: %w

What it means

`netbird profile list` could not connect to the daemon's gRPC control interface. DialClientGRPCServer (client/cmd/root.go:271) blocks up to 10s on the dial target derived from --daemon-addr (default unix:///var/run/netbird.sock, npipe://netbird on Windows). The error is wrapped with %w, preserving the underlying grpc dial error chain.

Source

Thrown at client/cmd/profile.go:96

	cmd.SetOut(cmd.OutOrStdout())

	err := util.InitLog(logLevel, "console")
	if err != nil {
		return err
	}

	return nil
}

func listProfilesFunc(cmd *cobra.Command, _ []string) error {
	if err := setupCmd(cmd); err != nil {
		return err
	}

	conn, err := DialClientGRPCServer(cmd.Context(), daemonAddr)
	if err != nil {
		return fmt.Errorf("connect to service CLI interface: %w", err)
	}
	defer conn.Close()

	currUser, err := user.Current()
	if err != nil {
		return fmt.Errorf("get current user: %w", err)
	}

	daemonClient := proto.NewDaemonServiceClient(conn)

	resp, err := daemonClient.ListProfiles(cmd.Context(), &proto.ListProfilesRequest{
		Username: currUser.Username,
	})
	if err != nil {
		return err
	}

	tw := tabwriter.NewWriter(cmd.OutOrStdout(), 0, 0, 2, ' ', 0)

View on GitHub (pinned to 93e97f4bf1)

Solutions

  1. Start the daemon service and confirm the socket/pipe exists
  2. Check NB_DAEMON_ADDR env and the --daemon-addr flag match where the daemon actually listens
  3. Inspect daemon logs for startup failures and restart it
  4. Reinstall the service if the socket is not recreated

Example fix

# before
NB_DAEMON_ADDR=tcp://127.0.0.1:41731 netbird profile list
# after (default unix socket where the daemon listens)
unset NB_DAEMON_ADDR; netbird profile list
Defensive patterns

Strategy: validation

Validate before calling

if _, err := os.Stat("/var/run/netbird.sock"); err != nil {
    return fmt.Errorf("daemon not reachable (socket missing); run `netbird service start`")
}

Type guard

func canReachDaemon(addr string) bool {
    conn, err := DialClientGRPCServer(context.Background(), addr)
    if err != nil {
        return false
    }
    conn.Close()
    return true
}

Try / catch

conn, err := DialClientGRPCServer(cmd.Context(), daemonAddr)
if err != nil {
    return fmt.Errorf("connect to service CLI interface: %w", err)
}
defer conn.Close()

Prevention

When it happens

Trigger: Daemon not installed/started; socket or named pipe missing; wrong --daemon-addr / NB_DAEMON_ADDR; dial timeout; running in an environment (container, SSH session with different namespace) that cannot reach the host socket.

Common situations: Fresh machines before `netbird service install && netbird service start`; daemon crashed; NB_DAEMON_ADDR left over from tests pointing at tcp://127.0.0.1:41731 or a test socket; macOS app vs CLI mismatch.

Related errors


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