| Publishes native Tailscale Services (svc: name, VIP, MagicDNS) | ✅ Same feature, through tailscale serve --service | ✅ |
| Extra software on the host | ⚠️ One agent container with the Docker socket (read-only) and the tailscaled socket | ✅ None beyond tailscaled |
| Per-app configuration | ✅ Three docktail.* labels in the compose file | ⚠️ A definition in the admin console plus a serve command on the host |
| Service definition in the control plane | ✅ Created through the Tailscale API with OAuth or an API key; by hand without credentials | ⚠️ By hand: admin console, API or Terraform |
| Host tag, tagOwners, autoApprovers | ⚠️ One-time policy setup, yours | ⚠️ One-time policy setup, yours |
| Reach a container without publishing a port | ✅ Container IP, read from Docker | ⚠️ Possible by typing the container IP, which nothing updates |
| Container recreated with a new IP | ✅ Reconciled from Docker events and a periodic pass (60 s default) | ⚠️ A typed container IP goes stale; a 127.0.0.1 port does not |
| Host reboot | ✅ Reconciles from the running containers on start | ✅ Serve config persists in tailscaled |
| App removed | ✅ Stops advertising it when the container stops; deleting the definition is opt-in (DELETE_UNUSED_SERVICES) | ⚠️ serve drain, serve clear, then delete the definition |
| Public access with Funnel | ⚠️ Per container from two labels plus the funnel node attribute, on the host's own hostname | ⚠️ tailscale funnel by hand, on the host's own hostname |
| Non-Docker workloads, remote targets, UDP via --tun | ❌ Docker containers only | ✅ |
| Support | ⚠️ Open-source community project (AGPL) on top of the official feature | ✅ Official Tailscale feature, documented in the Tailscale KB |