tailscale/tailscale · error
local node is not configured or missing Self information
Error message
local node is not configured or missing Self information
What it means
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.
Source
Thrown at cmd/tailscale/cli/file.go:457
func getTargetStableID(ctx context.Context, ipStr string) (id tailcfg.StableNodeID, isOffline bool, err error) {
ip, err := netip.ParseAddr(ipStr)
if err != nil {
return "", false, err
}
st, err := localClient.Status(ctx)
if err != nil {
// This likely means tailscaled is unreachable or returned an error on /localapi/v0/status.
return "", false, fmt.Errorf("failed to get local status: %w", err)
}
if st == nil {
// Handle the case if the daemon returns nil with no error.
return "", false, errors.New("no status available")
}
if st.Self == nil {
// We have a status structure, but it doesn’t include Self info. Probably not connected.
return "", false, errors.New("local node is not configured or missing Self information")
}
// Find the PeerStatus that corresponds to ip.
var foundPeer *ipnstate.PeerStatus
peerLoop:
for _, ps := range st.Peer {
for _, pip := range ps.TailscaleIPs {
if pip == ip {
foundPeer = ps
break peerLoop
}
}
}
// If we didn’t find a matching peer at all:
if foundPeer == nil {
if !tsaddr.IsTailscaleIP(ip) {
return "", false, fmt.Errorf("unknown target; %v is not a Tailscale IP address", ip)View on GitHub (pinned to cfe32b8be6)
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
Example fix
# before $ tailscale file cp report.pdf device: error: local node is not configured or missing Self information # after $ tailscale up --auth-key=tskey-... $ tailscale file cp report.pdf device:
Defensive patterns
Strategy: type-guard
Type guard
// Narrow before resolving a peer:
func statusUsable(st *ipnstate.Status) bool {
return st != nil && st.Self != nil
} Try / catch
st, err := localClient.Status(ctx)
if err != nil {
return fmt.Errorf("failed to get local status: %w", err)
}
if st == nil || st.Self == nil {
// prompt the user to run 'tailscale up' / 'tailscale login' before retrying
return errors.New("node not logged in; run tailscale login")
} Prevention
- 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
When it happens
Trigger: st.Self == nil from a reachable but unconfigured daemon: a fresh tailscaled install before 'tailscale up'/'tailscale login', or a logged-out node.
Common situations: New nodes; after 'tailscale logout'; headless setups where the auth step was skipped or an auth key was never supplied.
Related errors
- no status available
- HTTP %s: %s
- usage: tailscale file cp <files...> <target>:
- unexpected brackets around target
- can't use --name= with multiple files
AI-assisted analysis of tailscale/tailscale@cfe32b8be6 (2026-08-15).
Data as JSON: /api/errors/cf0c5271864df94d.
Report an issue: GitHub.