[ Switch to styled version → ]
Switch to the styled self-hosting page
The registry (rendezvous) and beacon that coordinate the public backbone are open source under AGPL-3.0. Run your own and you hold the admin token, so the controls the public backbone keeps for its operators are yours: private networks, roles, identity-provider checks, network policy and audit export.
Nobody runs registries for customers. Vulture Labs runs the public backbone and nothing else. On the public backbone only its operators can create networks, because that takes the registry admin token. If you run your own registry, you build, secure, back up and upgrade it yourself, with no support plan or SLA.
pilotctl extras provision.-standby, -repl-token).-http serves a live dashboard and the public-stats JSON; per-network figures need -dashboard-token.Plain Go, no cgo. Open TCP 9000 and UDP 9001 to your agents. Without -store the registry keeps its state in memory only.
git clone https://github.com/pilot-protocol/rendezvous
cd rendezvous && go build ./cmd/rendezvous
# registry on TCP 9000, beacon on UDP 9001, dashboard on 3000
export PILOT_ADMIN_TOKEN="$(openssl rand -hex 32)"
./rendezvous -registry-addr :9000 -beacon-addr :9001 \
-store /var/lib/pilot/registry.json -http 127.0.0.1:3000
# on each agent machine
pilotctl daemon start --registry registry.example.com:9000 \
--beacon registry.example.com:9001
# create a network with the admin token, then join it
export PILOT_REGISTRY=registry.example.com:9000
pilotctl network create --name ops --join-rule token \
--token "$JOIN_TOKEN" --node-id <your node id>
pilotctl network join <network id> --token "$JOIN_TOKEN"Registry settings, all under pilotctl extras (they read PILOT_REGISTRY and PILOT_ADMIN_TOKEN):
pilotctl extras idp set --type oidc \
--url https://login.example.com/.well-known/jwks.json \
--issuer https://login.example.com --client-id pilot
pilotctl extras audit-export set --format splunk_hec \
--endpoint https://splunk.example.com:8088/services/collector \
--splunk-token "$HEC_TOKEN"
pilotctl extras provision ops-blueprint.json
pilotctl extras directory-sync directory.json --network <id> --remove-unlistedA blueprint:
{
"name": "ops",
"join_rule": "invite",
"enterprise": true,
"policy": { "max_members": 50, "allowed_ports": [1001, 1002] },
"roles": [ { "external_id": "alice@example.com", "role": "admin" } ],
"identity_provider": {
"type": "oidc",
"url": "https://login.example.com/.well-known/jwks.json",
"issuer": "https://login.example.com",
"client_id": "pilot"
},
"audit_export": { "format": "splunk_hec", "endpoint": "https://splunk.example.com:8088/services/collector" }
}-strict-directory-auth (registry): trust or a shared network required before lookups, resolves, punch requests and listings return a node.-strict-registration-auth (registry): proof-of-possession signature required on registrations that submit a public key.-strict-heartbeat-freshness (registry): a timestamp bound into signed heartbeats, so captured heartbeats can't be replayed.-strict-expiry-binding (registry): the requested expiry bound into the key-expiry signature.-tls (registry): TLS for registry connections, with your certificate or a self-signed one generated at start.-require-punch-token (standalone beacon, pilot-protocol/beacon): a peer's endpoint is released only for a punch token issued by that peer. The beacon built into rendezvous doesn't expose it.PILOT_STRICT_DATAPLANE_TRUST=1 (daemon): a private node refuses key exchange and control traffic from peers it doesn't trust.