Names, not ports
Each app answers to a hostname. The same config runs on a laptop (app.localhost) and on a real domain.
v0.1 “Edge” in development · not production-ready
Switchboard is a self-hostable, identity-aware gateway in a single Go binary. It routes your apps by name, issues their certificates, puts a login in front of the ones that need it — and tells you exactly why each request was let through or refused.
source opens with the first alpha · MIT licensed · one binary · one JSON config · no external database
01 / shipped today
Only features with tests and a running deployment are listed here. Everything else is on the roadmap below, and labelled as such.
Each app answers to a hostname. The same config runs on a laptop (app.localhost) and on a real domain.
ACME certificates over HTTP-01 or DNS-01, including a single-level wildcard, renewed in the background.
OIDC against your existing provider, then a pure policy check on verified email, domain and group claims.
Every allow or deny carries a stable code and a reason. policy explain and the console simulator ask the same engine.
A connector dials out over mutual TLS, so a homelab app is published without opening an inbound port.
Pages serves a built site straight from disk, with SPA fallback and its control files kept private.
A loopback-only console: live decision feed over SSE, route health and the policy simulator.
env: and file: references; the control plane never writes a resolved secret back to disk.
02 / how a request flows
Every request walks the same ordered stages. Security decisions are pure functions that return a decision with a stable code and a human reason, so the proxy, the CLI and the console can never disagree about why.
$ switchboard policy explain -host app.example.com \ -email [email protected] -verified -groups support route: app.example.com (protected) policy: allowed_domains=[example.com] required_groups=[engineering] decision: denied code: missing_required_group reason: account is missing required group engineering scope: authorization only; OIDC, session and transport are not evaluated
03 / the access console
Loopback-only by design. The simulator needs the admin token, because an answer that reveals who is allowed is itself sensitive.

04 / roadmap
The long-range goal: every certificate issued, policy changed and access granted lands in a transparency log that anyone holding a copy can check — so not even the operator can quietly change who has access. That is a direction, not a claim; each release promises only what its tests and deployments show.
in progress · Oct – Dec 2026
Jan – Mar 2027
Apr – Jun 2027
Jul – Sep 2027
05 / get started
Needs Go. Point names at the ports your apps already use, run one binary, and open the console on loopback.
validate checks a config without starting anything.# config.json
{
"listen": ":8888",
"admin": { "listen": "127.0.0.1:9090" },
"routes": [
{ "host": "app.localhost:8888", "target": "http://localhost:3000" },
{ "host": "docs.localhost:8888", "target": "http://localhost:4321" }
]
}The repository opens with the first alpha tag; until then these steps show what running it looks like.
$ git clone https://github.com/octaviosantacruz/switchboard $ cd switchboard && go run ./cmd/switchboard -config config.json # open http://app.localhost:8888 · console on http://127.0.0.1:9090