Reach your app where it runs — on a customer's laptop, a workshop machine, a field device — without asking them to open ports, run a VPN, or install anything extra. One ~7 MB self-hosted relay in the cloud, an SDK inside the apps you already ship.
Go SDK returns a net.Conn that drops straight into grpc.WithContextDialer, http.Transport, crypto/tls. TypeScript SDK works in browser and Node 22+ with zero runtime deps. No separate CLI to ship to your users, no "first install our tunnel utility" step in your instructions.
Built for live customer sessions
Tune, configure, install, support, diagnose — any live workflow where your operator-side software needs to reach an instance of your customer-side software, on a network you don't control. Customer runs the app, opens a session, hands you a token; you connect.
Two-plane auth
Admin API gated by OIDC + scopes. Data plane gated by opaque per-slot tokens minted at session creation. The party that creates sessions needs an IdP identity; the connecting peers don't. Fits the operator-to-customer-machine pattern exactly.
Protocol-agnostic relay
Forwards opaque WebSocket binary frames. TCP, UDP, gRPC, SSH, raw bytes — all handled by the SDK or CLI adapters. The server stays auditable and unchanged when you add new protocols.
Tiny by design
A static Go binary, about 7 MB on linux/arm64. Designed to run happily on a $3/month t4g.nano. Multi-stage distroless Docker image too.
Zero IdP coordinates on clients
/.well-known/swsrs-config publishes the IdP endpoints so the CLI runs OAuth 2.0 device flow without anyone configuring issuer URLs, client IDs, or scopes manually.
You sell software that needs to reach instances of itself running on customers' machines. You don't control their network. They can't (or shouldn't have to) expose ports. The usual answers all push the cost onto the customer:
VPN / port-forwarding: asks customers to configure networking they shouldn't have to think about.
"Install our agent": another binary to ship, sign, update, and explain.
SaaS tunnel like ngrok: routes your customers' data through someone else's infrastructure.
swsrs sits in the gap. Your customer-side app already has the relay client linked in — it's the same SDK you'd link in for any other library. When you need to reach an instance, the customer's app opens a session and hands you a token; your operator-side software connects. Nothing new on the customer's machine, no firewall changes, no VPN, no third-party data path.
You sell BMW diagnostic and coding software. Picture the flow:
An owner wants help reading fault codes or applying coding changes. They run the diagnostic app you provided — a small Go binary that talks to the ECU over OBD-II. The app calls into the swsrs SDK and creates a session. Your backend pushes the responder token to a more experienced specialist via your existing UX. The specialist opens your operator UI in the browser. It uses the swsrs SDK to connect as the initiator. The UI is now talking live to the ECU on the owner's actual car. The specialist reads adaptation values, writes coding changes, validates against real-time telemetry. Done, hang up, session closes.
This isn't hypothetical — it's the real shape of Bimmerz Connect, the production swsrs deployment that powers the bimmerz.app suite of BMW apps.
What this is NOT:
It is not "the customer installs our tunneling utility." They installed your tuning client. The relay is just a library inside it.
It is not "we VPN into their network." There's no network access at all — only one specific WebSocket session, gated by a one-time token.
It is not "our data goes through a SaaS." The relay is yours; the data path is yours.
Live diagnostics / support — pulling logs, profiling, attaching a debugger to a deployed service.
Remote pair-operation — two operators acting on the same instance.
Field-engineer-to-deployed-device — IoT or industrial gear in a customer site.
Same shape every time: a piece of your software on the customer side, a piece of your software on the operator side, a private rendezvous between them.
Most NAT-traversal tools either (a) skip auth or use a shared secret, (b) bundle a heavyweight gateway you can't fit on a t4g.nano, or (c) require a separate tunnel binary on every user's machine. swsrs sits in the intersection:
The party who can mint sessions is gated by your IdP (OIDC, scope-claim).
The parties who actually use the tunnel are gated by short-lived per-slot tokens — they need no IdP identity.
The server never inspects payloads — it forwards opaque frames. Your app decides the protocol.
The peer logic is library code, not a separate process. Link it into the app you're already shipping.
# Run the relay locally with auth disabled (dev only)go run github.com/emdzej/swsrs/cmd/swsrs@latest serve --no-auth --addr :8080# In another terminal — end-to-end chat over the relaybash scripts/smoke-chat.sh# [smoke] PASS
Bimmerz Connect — the relay behind bimmerz.app's BMW diagnostic and coding suite. Owners run a diagnostic app at home plugged into their car; experienced users connect remotely from a web UI and work on the live ECU.