{"record":{"id":"453f40a8d287f7ef","repo":"louislam/uptime-kuma","slug":"tailscale-only-works-if-used-on-other-machines","errorCode":null,"errorMessage":"Tailscale only works if used on other machines: \"${line}\"","messagePattern":"Tailscale only works if used on other machines: \"(.+?)\"","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"server/monitor-types/tailscale-ping.js","lineNumber":67,"sourceCode":"     * @throws Will throw an eror if the output contains any unexpected string.\n     */\n    parseTailscaleOutput(tailscaleOutput, heartbeat) {\n        let lines = tailscaleOutput.split(\"\\n\");\n\n        for (let line of lines) {\n            if (line.includes(\"pong from\")) {\n                heartbeat.status = UP;\n                let time = line.split(\" in \")[1].split(\" \")[0];\n                heartbeat.ping = parseInt(time);\n                heartbeat.msg = \"OK\";\n                break;\n            } else if (line.includes(\"timed out\")) {\n                throw new Error(`Ping timed out: \"${line}\"`);\n                // Immediately throws upon \"timed out\" message, the server is expected to re-call the check function\n            } else if (line.includes(\"no matching peer\")) {\n                throw new Error(`Nonexistant or inaccessible due to ACLs: \"${line}\"`);\n            } else if (line.includes(\"is local Tailscale IP\")) {\n                throw new Error(`Tailscale only works if used on other machines: \"${line}\"`);\n            } else if (line !== \"\") {\n                throw new Error(`Unexpected output: \"${line}\"`);\n            }\n        }\n    }\n}\n\nmodule.exports = {\n    TailscalePing,\n};\n","sourceCodeStart":49,"sourceCodeEnd":78,"githubUrl":"https://github.com/louislam/uptime-kuma/blob/6b5ea0155793e666666745fb8d6fef1e829543a2/server/monitor-types/tailscale-ping.js#L49-L78","documentation":"Thrown by parseTailscaleOutput() when an output line contains 'is local Tailscale IP'. Tailscale refuses to ping a node that is the current machine itself, because Tailscale is designed to connect distinct machines — pinging your own tailnet address is a configuration mistake.","triggerScenarios":"Produced when the monitor target resolves to the Uptime-Kuma host's own Tailscale IP (100.x.x.x by default) or its own magic DNS name, so 'tailscale ping' reports 'is local Tailscale IP'.","commonSituations":"Operator copied the local machine's Tailscale IP into the monitor; monitor hostname resolves (via MagicDNS) to the local node; single-node test setup where source and target are the same host.","solutions":["Replace the target with a different machine's Tailscale IP or MagicDNS name.","Run 'tailscale status' to see your own IP and avoid using it as a monitor target.","If you intended to check local tailscaled health, use a different monitor type (e.g. process check) rather than tailscale-ping."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"function isLocalIpLine(line) { return typeof line === \"string\" && line.includes(\"is local Tailscale IP\"); }","typeGuard":"function isOwnTailnetIp(ip, status) { return status.self && (status.self.ip === ip); }","tryCatchPattern":"if (isLocalIpLine(line)) { heartbeat.status = DOWN; heartbeat.msg = \"Target is the local Tailscale IP\"; return; }","preventionTips":["Check 'tailscale status' and never use your own IP as a target.","Use a remote node's name/IP for tailscale-ping monitors.","Use a different monitor type for local tailscaled health."],"tags":["tailscale","misconfiguration","vpn","self-check"],"backgroundTag":null,"analyzedSha":"6b5ea0155793e666666745fb8d6fef1e829543a2","analyzedAt":"2026-08-12T23:42:12.959Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}