| Each app on the tailnet as | ✅ A Tailscale Service, advertised by one tagged host | ⚠️ Its own tsnet machine, no Tailscale Services (issue #133 open) |
| Tailscale installed on the Docker host | ⚠️ Needed: host tailscaled or a Tailscale sidecar | ✅ Not needed, tsnet is embedded |
| Configuration | ✅ docktail.* labels | ✅ tsbridge.* labels, or a TOML file |
| Backends that are not containers | ❌ Docker containers only | ✅ Host ports, unix sockets, other machines (TOML) |
| Reaching the container | ✅ Container IP by default, no published ports | ⚠️ By container name: tsbridge must share a Docker network with each app |
| TCP (SSH, databases, game servers) | ✅ tcp, tls-terminated-tcp, optional PROXY protocol | ❌ HTTP(S) only |
| Several ports from one container | ✅ Indexed labels | ❌ One port per service |
| HTTPS out of the box | ⚠️ HTTP on port 80 unless service-port is 443 or service-protocol is https | ✅ HTTPS on :443 by default |
| Public access with Funnel | ✅ On the host's machine name (Funnel cannot attach to a Service), split by path or port; TCP too | ✅ Each app gets its own public hostname; HTTPS |
| Metrics, access logs, identity headers | ❌ Not provided by the agent (DockTail Cloud is separate and optional) | ✅ Prometheus endpoint, access log, X-Tailscale-* headers |
| State to keep | ✅ None, the agent is stateless | ⚠️ A state folder per app on a persistent volume |
| Headscale | — Not covered by the docs | ✅ Documented: auth key, tls_mode = "off" |