Tailscale Platform
Use this skill for any Tailscale work, from local development connectivity to production tailnet architecture and incident diagnostics.
Tailscale changes quickly. Ground version-sensitive advice in the local CLI and current official docs before making claims about flags, policy syntax, product limits, or Kubernetes CRDs.
First Steps
Infer posture from context.
- For personal tailnets, MVPs, local dev, demos, and scrappy startup work, give the fastest viable path first.
- For organizations, production, shared tailnets, sensitive systems, or compliance contexts, use secure-first defaults.
- If the context is unclear and the posture changes commands, exposure, key handling, or access policy, ask before changing state.
Inspect local project and system context before prescribing commands.
rg --files -g 'tailnet*.json' -g '*tailscale*' -g 'acl.hujson' -g 'policy.hujson' -g 'docker-compose*.yml' -g 'Dockerfile*' -g '.github/workflows/**' -g 'k8s/**' -g 'helm/**' command -v tailscale tailscale version tailscale --help tailscale <subcommand> --helpPrefer read-only checks first unless the user explicitly asks to mutate local Tailscale state, tailnet policy, Kubernetes resources, or remote resources.
tailscale status tailscale status --json tailscale netcheck tailscale ping <peer> tailscale dns status tailscale serve status tailscale funnel statusUse official Tailscale docs as the source of truth. Third-party posts can help discover issues, but do not encode them as facts unless confirmed by official docs or the current CLI.
Reference Routing
- Read
references/policy-security.mdfor grants vs ACLs, policy HuJSON, tags, groups, tests,sshTests, Tailscale SSH, device posture, app capabilities, FunnelnodeAttrs, and Tailnet Lock cautions. - Read
references/routing-connectors.mdfor subnet routers, exit nodes, app connectors, MagicDNS, split DNS, route injection, HA/failover, regional routing, DERP/direct diagnostics,tailscale netcheck,tailscale ping, andtailscale status. - Read
references/expose-services.mdfor Tailscale Serve, Funnel, Tailscale Services, TailVIPs, HTTPS certs, identity headers, app capabilities headers, service config files, drain/advertise flows, TCP/TLS forwarding, and public exposure gotchas. - Read
references/automation-containers.mdfor auth keys, OAuth clients, workload identity federation, ephemeral nodes, GitHub Actions, Docker, userspace networking, serverless patterns,tsnet, API usage, and GitOps policy workflows. - Read
references/kubernetes.mdfor the Tailscale Kubernetes Operator, tags/OAuth prerequisites, ingress, egress, API server proxy, Connector, ProxyGroup, ProxyClass, Recorder, subnet routers, app connectors, version compatibility, and CNI notes. - Read
references/production-diagnostics.mdfor production review checklists, least privilege, key expiry, device approval, logs, network flow logs, audit logs, webhooks/log streaming, update policy, incident diagnostics, and safe read-only commands.
Defaults
- For new access policy, prefer grants. Use legacy ACLs only when maintaining an existing ACL-only policy or when the needed behavior is not yet expressible in grants.
- Treat
tailscale upflags as a complete desired state. To change one preference, prefertailscale setwhen available. - Keep route advertisement, route approval, client route acceptance, and access policy separate in explanations. Routing makes paths reachable; policy decides who may connect.
- Treat auth keys, OAuth client secrets, and generated auth keys as secrets. Prefer tagged, ephemeral, short-lived, scoped automation identities.
- For public exposure, make the Serve vs Funnel boundary explicit: Serve is tailnet-private; Funnel is internet-public.
- Use dry runs, status commands, policy tests, and local config inspection before changing production tailnets.
Gotchas To Surface Early
tailscale upwith flags requires the complete set of desired settings; an omitted setting can trigger an error or reset only with--reset.- Grants are preferred for new policy, but existing tailnets may still use ACLs.
- Subnet routes, exit-node routing, app connector route injection, and access rules are separate control layers.
- Serve and Funnel cannot both own the same node, DNS name, and port combination as private and public exposure at the same time.
- Auth keys expire; connector or automation key expiry can fail closed.
- MagicDNS and split DNS behavior depends on resolver setup and platform DNS integration.
- DERP relay use is a performance and reachability fallback, not plaintext traffic. Tailscale traffic remains WireGuard-encrypted between nodes.
Output Style
When answering Tailscale tasks, include:
- The fastest viable path.
- The security hardening path when relevant.
- Exact commands, policy shape, Kubernetes manifests, or API calls.
- The gotchas checked and any remaining risk.
Downrank dashboard-only instructions, stale CLI flags, broad tailnet access, and long-lived reusable keys unless the user explicitly asks for them.