A signal relayed onward — so the lighthouse can stay hidden.
relay is the PharosVPN relay. It is a stateless, public, mTLS-terminating
proxy that lets end-user clients reach a controller that has no public presence.
The controller (coxswain) stays behind NAT; relay is the only public ingress
for clients.
Part of the PharosVPN platform — see
docs/DESIGN.md.
- Public ingress for clients only. Terminates client mTLS, forwards their
gRPC streams to
coxswain. - Stateless. No database. Every identity lookup is delegated to
coxswain. - Sanitizing. Strips spoofable client metadata; injects exactly one trusted value — the verified device fingerprint.
- Two transports to
coxswain: embedded (in-process insidecoxswain) or remote reverse tunnel (coxswaindials out to a publicrelay). Identical trust either way. - Sees only ciphertext. Profile bundles cross
relayend-to-end encrypted; a compromised remoterelayhost cannot read user profiles.
Go · transparent gRPC proxy · reverse-tunnel transport (multiplexed) · mTLS.
relay/— the embeddable relay: the transparent proxy, the public mTLS listener, and the in-memoryPipefor embedded mode.tunnel/— the reverse-tunnel transportcoxswaindials out over.cmd/relay— the relay binary:gen-csr(SSH enrolment) andrun(the remote relay).
coxswain embeds a relay in-process by importing the relay package — see
docs/COXSWAIN-INTEGRATION.md.
make build produces a static binary in dist/. To run a remote relay, see
docs/DEPLOY.md and the deploy/relay.service
systemd unit.
🚧 Pre-alpha. The transparent proxy, both transports (embedded + remote), SSH
relay enrolment (gen-csr), and static-binary packaging are built. See
BUILD.md.
Apache-2.0. Contributions under the DCO (git commit -s).