{"record":{"id":"762abf1c9bdc7e53","repo":"paperclipai/paperclip","slug":"no-tailscale-address-was-detected-during-setup-th","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/commands/onboard.ts","lineNumber":545,"sourceCode":"    );\n  } else {\n    const setupModeChoice = await p.select({\n      message: \"Choose setup path\",\n      options: [\n        {\n          value: \"quickstart\" as const,\n          label: \"Quickstart\",\n          hint: \"Recommended: local defaults + ready to run\",\n        },\n        {\n          value: \"advanced\" as const,\n          label: \"Advanced setup\",\n          hint: \"Customize database, server, storage, and more\",\n        },\n      ],\n      initialValue: \"quickstart\",\n    });\n    if (p.isCancel(setupModeChoice)) {\n      p.cancel(\"Setup cancelled.\");\n      return;\n    }\n    setupMode = setupModeChoice as SetupMode;\n  }\n\n  const tc = getTelemetryClient();\n  if (tc) trackInstallStarted(tc);\n\n  let llm: PaperclipConfig[\"llm\"] | undefined;\n  const { defaults: derivedDefaults, usedEnvKeys, ignoredEnvKeys } = quickstartDefaultsFromEnv({\n    preferTrustedLocal: opts.yes === true && !opts.bind,\n  });\n  let {\n    database,\n    logging,\n    server,\n    auth,","sourceCodeStart":527,"sourceCodeEnd":563,"githubUrl":"https://github.com/paperclipai/paperclip/blob/5716fe907e596ce73501408fc6efdb19fb61edf2/cli/src/commands/onboard.ts#L527-L563","documentation":"During `paperclipai onboard --bind tailnet`, buildPresetServerConfig('tailnet', ...) tries to detect the machine's Tailscale address; when detection finds none it falls back to host 127.0.0.1 (isLoopbackHost(preset.server.host) is then true) and warns that the saved config stays on loopback until Tailscale is available or PAPERCLIP_TAILNET_BIND_HOST is set. Server reachability will not match the chosen 'tailnet' mode.","triggerScenarios":"Onboarding with --bind tailnet while Tailscale is not installed, not running (`tailscale status` down), or has no assigned IP, and PAPERCLIP_TAILNET_BIND_HOST is unset.","commonSituations":"Fresh VM without Tailscale yet; tailscaled stopped; tailnet account not authenticated; CI environment where the CLI flag was copied from docs.","solutions":["Install/start Tailscale and authenticate (tailscale up), verify `tailscale ip -4` prints an address, then re-run onboard (or configure) with --bind tailnet.","Alternatively pre-set the bind host: export PAPERCLIP_TAILNET_BIND_HOST=<your-tailscale-ip> before onboarding.","If you intended local-only access, keep the loopback result or re-run with --bind loopback to remove the mismatch."],"exampleFix":"# before\n$ paperclipai onboard --bind tailnet\n! No Tailscale address was detected during setup. ...\n\n# after\n$ tailscale up   # authenticate, then verify\n$ tailscale ip -4\n100.64.0.5\n$ paperclipai onboard --bind tailnet   # preset now binds 100.64.0.5","handlingStrategy":"validation","validationCode":"import { execFileSync } from \"node:child_process\";\nlet tailscaleIp: string | null = null;\ntry { tailscaleIp = execFileSync(\"tailscale\", [\"ip\", \"-4\"], { encoding: \"utf8\" }).trim(); } catch {}\nif (!tailscaleIp && !process.env.PAPERCLIP_TAILNET_BIND_HOST) {\n  // don't pick tailnet preset yet — it will silently fall back to loopback\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Ensure `tailscale ip -4` returns an address before choosing --bind tailnet.","Pin the bind host explicitly with PAPERCLIP_TAILNET_BIND_HOST on hosts where detection is unreliable.","After onboarding, verify server.host in the saved config actually matches the tailscale IP."],"tags":["tailscale","network","bind","onboard","loopback-fallback"],"backgroundTag":"tailscale-address-not-found","analyzedSha":"5716fe907e596ce73501408fc6efdb19fb61edf2","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}