{"record":{"id":"cf0c5271864df94d","repo":"tailscale/tailscale","slug":"local-node-is-not-configured-or-missing-self-infor","errorCode":null,"errorMessage":"local node is not configured or missing Self information","messagePattern":"local node is not configured or missing Self information","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/tailscale/cli/file.go","lineNumber":457,"sourceCode":"\nfunc getTargetStableID(ctx context.Context, ipStr string) (id tailcfg.StableNodeID, isOffline bool, err error) {\n\tip, err := netip.ParseAddr(ipStr)\n\tif err != nil {\n\t\treturn \"\", false, err\n\t}\n\n\tst, err := localClient.Status(ctx)\n\tif err != nil {\n\t\t// This likely means tailscaled is unreachable or returned an error on /localapi/v0/status.\n\t\treturn \"\", false, fmt.Errorf(\"failed to get local status: %w\", err)\n\t}\n\tif st == nil {\n\t\t// Handle the case if the daemon returns nil with no error.\n\t\treturn \"\", false, errors.New(\"no status available\")\n\t}\n\tif st.Self == nil {\n\t\t// We have a status structure, but it doesn’t include Self info. Probably not connected.\n\t\treturn \"\", false, errors.New(\"local node is not configured or missing Self information\")\n\t}\n\n\t// Find the PeerStatus that corresponds to ip.\n\tvar foundPeer *ipnstate.PeerStatus\npeerLoop:\n\tfor _, ps := range st.Peer {\n\t\tfor _, pip := range ps.TailscaleIPs {\n\t\t\tif pip == ip {\n\t\t\t\tfoundPeer = ps\n\t\t\t\tbreak peerLoop\n\t\t\t}\n\t\t}\n\t}\n\n\t// If we didn’t find a matching peer at all:\n\tif foundPeer == nil {\n\t\tif !tsaddr.IsTailscaleIP(ip) {\n\t\t\treturn \"\", false, fmt.Errorf(\"unknown target; %v is not a Tailscale IP address\", ip)","sourceCodeStart":439,"sourceCodeEnd":475,"githubUrl":"https://github.com/tailscale/tailscale/blob/cfe32b8be6a33f8e24fbc369cbfbf7c729d9e042/cmd/tailscale/cli/file.go#L439-L475","documentation":"The daemon returned a status struct whose Self field is nil: the machine has no logged-in node identity, so there is no 'self' from which to resolve a peer relationship. The CLI surfaces this distinctly from transport failures (wrapped status error) and from the nil-status case. Most often it simply means tailscale has not been brought up on this machine.","triggerScenarios":"st.Self == nil from a reachable but unconfigured daemon: a fresh tailscaled install before 'tailscale up'/'tailscale login', or a logged-out node.","commonSituations":"New nodes; after 'tailscale logout'; headless setups where the auth step was skipped or an auth key was never supplied.","solutions":["Bring the node up: tailscale up (or tailscale login) and complete authentication","For headless flows, use an auth key: tailscale up --auth-key=tskey-...","Confirm state afterwards: 'tailscale status' must list Self"],"exampleFix":"# before\n$ tailscale file cp report.pdf device:\nerror: local node is not configured or missing Self information\n\n# after\n$ tailscale up --auth-key=tskey-...\n$ tailscale file cp report.pdf device:","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"// Narrow before resolving a peer:\nfunc statusUsable(st *ipnstate.Status) bool {\n    return st != nil && st.Self != nil\n}","tryCatchPattern":"st, err := localClient.Status(ctx)\nif err != nil {\n    return fmt.Errorf(\"failed to get local status: %w\", err)\n}\nif st == nil || st.Self == nil {\n    // prompt the user to run 'tailscale up' / 'tailscale login' before retrying\n    return errors.New(\"node not logged in; run tailscale login\")\n}","preventionTips":["Check login state (st.Self != nil) before peer-dependent operations","Automate headless logins with auth keys","Re-check state after 'tailscale logout' in long-lived tooling"],"tags":["local-api","status","login","file-transfer"],"backgroundTag":null,"analyzedSha":"cfe32b8be6a33f8e24fbc369cbfbf7c729d9e042","analyzedAt":"2026-08-15T19:58:31.583Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}