{"record":{"id":"a7472096af6505e6","repo":"paperclipai/paperclip","slug":"no-tailscale-address-was-detected-during-setup-th-a74720","errorCode":null,"errorMessage":"No Tailscale address was detected during setup. The saved config will stay on loopback until Tailscale is available or PAPERCLIP_TAILNET_BIND_HOST is set.","messagePattern":"No Tailscale address was detected during setup\\. The saved config will stay on loopback until Tailscale is available or PAPERCLIP_TAILNET_BIND_HOST is set\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"cli/src/prompts/server.ts","lineNumber":103,"sourceCode":"      validate: (val) => {\n        try {\n          parseHostnameCsv(val ?? \"\");\n          return;\n        } catch (err) {\n          return err instanceof Error ? err.message : \"Invalid hostname list\";\n        }\n      },\n    });\n\n    if (p.isCancel(allowedHostnamesInput)) cancelled();\n\n    const preset = buildPresetServerConfig(bind, {\n      port,\n      allowedHostnames: parseHostnameCsv(allowedHostnamesInput),\n      serveUi,\n    });\n    if (bind === \"tailnet\" && isLoopbackHost(preset.server.host)) {\n      p.log.warn(TAILNET_BIND_WARNING);\n    }\n    return preset;\n  }\n\n  const deploymentModeSelection = await p.select({\n    message: \"Auth mode\",\n    options: [\n      {\n        value: \"local_trusted\",\n        label: \"Local trusted\",\n        hint: \"No login required; only safe with loopback-only or similarly trusted access\",\n      },\n      {\n        value: \"authenticated\",\n        label: \"Authenticated\",\n        hint: \"Login required; supports both private-network and public deployments\",\n      },\n    ],","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/paperclipai/paperclip/blob/a7e689b3c35347b529cb9f54c9b9a8575a3dcab6/cli/src/prompts/server.ts#L85-L121","documentation":"Same TAILNET_BIND_WARNING constant, hit through `paperclipai configure`'s interactive promptServer: when the user selects the 'Tailnet' reachability preset, buildPresetServerConfig('tailnet') tries to auto-detect the machine's Tailscale address. If the preset's server.host comes back loopback (no address detected), the prompt warns that the saved config will remain on loopback until Tailscale is available or PAPERCLIP_TAILNET_BIND_HOST is set.","triggerScenarios":"In promptServer: choosing 'Tailnet' under Reachability while `tailscale ip -4` yields no address and PAPERCLIP_TAILNET_BIND_HOST is unset.","commonSituations":"Configuring on a machine where tailscaled is installed but logged out; corporate VMs without Tailscale; running configure before onboarding Tailscale itself.","solutions":["Start and authenticate Tailscale (tailscale up), confirm `tailscale ip -4` prints an address, re-run paperclipai configure and pick Tailnet again.","Or export PAPERCLIP_TAILNET_BIND_HOST=<tailscale-ip> before configure so the preset uses it.","Accept loopback for now and reconfigure later once the machine is on the tailnet."],"exampleFix":"# before\n$ paperclipai configure   # Reachability: Tailnet\n! No Tailscale address was detected during setup. ...\n\n# after\n$ tailscale up && tailscale ip -4\n100.64.0.5\n$ paperclipai configure   # Tailnet preset now binds 100.64.0.5","handlingStrategy":"validation","validationCode":"let host: string | null = null;\ntry { host = execFileSync(\"tailscale\", [\"ip\", \"-4\"], { encoding: \"utf8\" }).trim(); } catch {}\nconst effectiveHost = host ?? process.env.PAPERCLIP_TAILNET_BIND_HOST ?? null;\nif (!effectiveHost) {\n  // defer the Tailnet preset; choosing it now yields a loopback fallback\n}","typeGuard":"const isLoopback = (h: string | undefined | null): boolean =>\n  !!h && (h === \"127.0.0.1\" || h === \"localhost\" || h.startsWith(\"127.\"));\n// post-check: if (bind === \"tailnet\" && isLoopback(preset.server.host)) -> warn user","tryCatchPattern":null,"preventionTips":["Run `tailscale ip -4` before choosing the Tailnet option in configure.","Set PAPERCLIP_TAILNET_BIND_HOST when detection cannot work (headless installs).","After saving, verify config server.host is the tailscale address, not 127.0.0.1."],"tags":["tailscale","network","bind","configure","loopback-fallback"],"backgroundTag":"tailscale-address-not-found","analyzedSha":"a7e689b3c35347b529cb9f54c9b9a8575a3dcab6","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}