Where pilot-daemon runs. Pick the right mode.
pilotctl daemon start uses auto: UDP when the beacon answers over UDP, otherwise compat.Two modes
UDP for direct paths. Compat for everything else.
- Flag
-transport=udp- Status
- Default
- Path
- Direct, RTT-bound
- Ports
- Outbound UDP/4000 (inbound too for a public node)
- Proxy
- —
- Trust
- Same overlay, same Ed25519 trust
- Flag
-transport=compat- Status
- Since v1.10.3
- Path
- +1 hop via the beacon
- Ports
- One outbound TCP/443
- Proxy
- Through
HTTPS_PROXYsince v1.13.11 - Trust
- Same overlay, same Ed25519 trust
-transport=udp-transport=compatHTTPS_PROXY since v1.13.11Per-platform
Where it runs. What flag to set.
18 of 34 run on plain UDP. 8 more need compat.
Container hosting / PaaS
Deploy as a Dockerfile or buildpack. UDP availability varies; when in doubt, ship in compat mode.
- RendercompatUDP blocked. Single TCP/443 works as of v1.10.3.
- RailwayudpDefault-allow egress on both protocols.
- Fly.io MachinescompatUDP needs dedicated IPv4; even then app-level egress is flaky.
- HerokucompatApp-UDP undocumented; daemon re-registers fine across the ~24h dyno cycle.
- DigitalOcean App PlatformcompatSafer default; can’t open SSH/SMTP ports.
- NorthflankudpUDP + TCP both first-class.
- Coolify / CapRoverudpSelf-hosted; inherits host firewall. Open UDP/4000 manually.
Serverless / functions
Three out of four can’t host a persistent process. Cloud Run is the exception when min-instances=1.
- AWS Lambdawrong runtime15-min hard timeout kills the tunnel; no persistent daemon. Run the daemon as a Lambda Extension only while warm.
- Google Cloud RuncompatSet min-instances=1 to keep warm. Inbound is HTTPS-only.
- Vercel / Netlify / GCP Functionswrong runtimeEphemeral execution; no persistent process model.
- Cloudflare Workerswrong runtimeNo long-lived sockets, no UDP, no listen().
VMs / IaaS
Full control. UDP works. Use -public to advertise a public node.
- EC2 / GCE / Azure VMudpOpen UDP/4000 in the security group.
- DO Droplets / Hetzner / LinodeudpSame model: managed VMs with full firewall control.
- Bare metaludpNo restrictions beyond your own network policy.
Kubernetes
DaemonSet or sidecar. Default CNI allows UDP; corporate clusters with NetworkPolicy default-deny need compat.
- Vanilla k8s / EKS / GKE / AKSudpDefault CNI allows UDP egress; no special config needed.
- k3s / k0s / OpenShift / kindudpSame model: sidecar pattern over /shared/pilot.sock.
- Locked clusters (NetworkPolicy default-deny)compatAllow egress to TCP/443 only; compat mode covers the rest.
Coding-agent sandboxes
A mix. Modal, E2B, Daytona and Codespaces are open; Docker-AI-Sandbox-class environments (Replit Agent, Devin) block raw TCP and let traffic out through an HTTP proxy, which compat mode uses since v1.13.11.
- Cursor Cloud AgentsallowlistAdd *.pilotprotocol.network + 34.71.57.205 to the egress allowlist.
- Replit Agentcompat + proxyDocker AI Sandbox; raw TCP/UDP blocked. Compat mode goes through HTTPS_PROXY (v1.13.11+).
- Devin (Cognition)compat + proxySame Docker AI Sandbox model; compat through HTTPS_PROXY.
- Modal SandboxesudpDefault-allow. Long timeout for persistent run.
- E2B SandboxesudpIP/CIDR rules only; Pilot endpoints allowed by default.
- Daytona SandboxesudpDefault-allow; iptables-based.
- GitHub CodespacesudpIPv4 outbound works; 30-min idle stop pauses the daemon.
- GitpodudpConfigure a .gitpod.yml task.
- Coder (workspaces)udpInherits the underlying provider (EC2 / k8s / Docker).
- Manus SandboxudpDefault-allow with configurable egress rules.
- Lovable / v0 / Bolt.newwrong runtimeUI generators / WebContainers; no POSIX sockets.
Desktop / local
install.sh wires up the right supervisor for each OS.
- macOS (LaunchAgent)udpWrites ~/Library/LaunchAgents/network.pilotprotocol.pilot-daemon.plist; load it with launchctl.
- Linux (systemd)udpsudo install writes the pilot-daemon + updater units; enable and start them with systemctl.
- tmux / screenudpAd-hoc dev only; no auto-restart.
- Windowsnot shippedNo Windows binary yet. Use WSL2 (Linux mode).
Browser / WASM
The daemon needs a POSIX runtime; the SDKs need a local daemon over a Unix socket, so neither runs in a browser tab or WASM.
- Browser tabwrong runtimeNo raw sockets, and the JS SDK is Node-only (a Unix-socket client of a local daemon).
- WASM runtimewrong runtimeSame model: the daemon needs POSIX.
Corporate networks
Egress models. What works today.
Open egress
Home wifi, most cloud VMs, default Docker
UDP works; use the default.
nothing
Default-deny, TCP/443 only
Hotel, airport, locked corporate wifi
Compat works as-is: a single outbound TCP/443.
-transport=compat
HTTP CONNECT proxy
Corporate networks with an explicit proxy URL
Compat dials the registry and beacon through HTTPS_PROXY (v1.13.11+).
compat, or auto (the pilotctl default)
Transparent TLS interception
Zscaler, Fortinet, Palo Alto, BlueCoat, Netskope
Works with -tls-trust=system (corporate CA in the OS store; the current default).
already supported
HTTP-proxy-only sandbox
Replit Agent, Devin, Docker AI Sandbox
Compat through the proxy, CONNECT by hostname so local DNS does not matter (v1.13.11+).
compat; proxy_cmd if credentials rotate
Domain-name allowlist
Cursor Cloud Agents, Zscaler PAC
Works after adding *.pilotprotocol.network + 34.71.57.205.
doc-only
DPI / protocol allowlist
Great Firewall, Iran-style filters
Blocked. No domain fronting or ECH today.
out of scope
Single-port 443
How single-port-443 works.
Outbound ports a compat daemon needs
Two ports worked for most “UDP blocked but TCP open” environments, but not for airport wifi or strict corporate firewalls that allow only TCP/443. A compat daemon’s lsof now shows exactly one outbound port: 443.
End-to-end protections are unchanged
- TLSprotects the compat hop between daemon and rendezvous
- Ed25519authenticates peer identity
- AES-256-GCMfrom an X25519-derived key protects tunnel payloads, as in UDP mode
Worked examples
Six deployments.
FROM debian:bookworm-slimRUN apt-get update && apt-get install -y curl ca-certificates \&& rm -rf /var/lib/apt/lists/*RUN curl -fsSL https://pilotprotocol.network/install.sh | \PILOT_EMAIL=you@example.com PILOT_ALLOW_ROOT=1 shENTRYPOINT ["/root/.pilot/bin/pilot-daemon", "-transport=compat"]
No port exposed. Render allows arbitrary outbound TCP/443. Zero UDP, zero TCP/9000.
One daemon. Two transport modes.
On a supported runtime, install Pilot and start the daemon: auto picks UDP or compat, through HTTPS_PROXY when there is one. Set transport=compat to skip the UDP probe. Check the platform notes above before deployment.
curl -fsSL https://pilotprotocol.network/install.sh | sh