Truly self-hosted
Deploy the Server on any VPS, dedicated host, or your own datacenter. There is no STVC cloud — you are the cloud.
STVC Webhook is a distributed reverse-proxy system you run yourself. A central Server on your public infrastructure accepts persistent connections from one or many Clients behind NAT, firewalls, or private networks — and securely multiplexes real HTTP traffic to them in real time.
Every byte flows through infrastructure you own. No third-party traffic inspection, no quotas, no surprise pricing pages.
Deploy the Server on any VPS, dedicated host, or your own datacenter. There is no STVC cloud — you are the cloud.
End-to-end TLS on both legs, API-key auth, optional certificate pinning, and per-key mapping restrictions.
One persistent WebSocket carries many concurrent requests. Bodies stream in 64 KiB chunks up to 16 MiB per frame.
Choose HTTP/1.1, HTTP/2, or HTTP/3 (QUIC) for the tunnel. The public listener negotiates with ALPN.
Each client claims a unique mapping URI. Route /api, /dev, /iot — all from one server.
Drop the Server behind YARP (or any reverse proxy). Forwarded headers and known proxies are first-class.
Configuration lives in a single config.json. Boot fast, ship faster, audit easily.
All non-hop-by-hop headers pass through both ways. The gateway adds X-Forwarded-For, X-Real-IP, and friends.
The Client establishes an outbound WebSocket to the Server. From then on, every public request is framed, multiplexed, and answered — bidirectionally streamed — without opening a single inbound port on your network.
The Client opens GET /_stvc/tunnel to the Server with X-API-Key and X-Mapping-Uri. No inbound firewall rules required.
Key is checked against config.json. The mapping URI is reserved. A HelloAck frame confirms the session.
Anyone calls https://yourdomain/api/anything. The Server matches the prefix and converts it into a Request + BodyChunk frames.
The Client forwards to your real local endpoint, e.g. http://127.0.0.1:8080/api/anything, with all original headers.
ResponseHead + body chunks flow back over the same tunnel. The visitor receives a normal HTTP response — they never know there's a tunnel.
The Server is the public face. The Client is the bridge to your private services. They communicate over a single, authenticated, multiplexed tunnel.
GET /_stvc/status lists active tunnels.ClientId for observability.STVC Webhook is software you run on infrastructure you control. There is no managed offering, no shared tenancy, and no traffic ever transits a vendor's network. Run the Server on a $5 VPS, on a Raspberry Pi at the edge, in Kubernetes, or on bare metal — the project ships you the components and stays out of your way.
Point Stripe, GitHub, or any provider at a stable public URL while your handler runs on localhost.
Share work-in-progress with stakeholders without deploying. Each branch gets its own mapping URI.
Reach devices behind carrier-grade NAT. The client opens out, the server stays reachable in.
Expose internal services through a hardened public gateway you fully audit and control.
Issue per-tenant API keys, restrict each to its own mapping prefix, and rewrite public paths transparently.
Auto-reconnecting clients survive flaky uplinks. Configure retry intervals to match your SLOs.
Clone the solution, drop your settings into config.json, and run both projects with the .NET CLI.
# Restore + compile both Server and Client
dotnet build STVC-Webhook.sln
dotnet run --project src/STVC.Webhook.Server
# Listens on the public + tunnel ports from config.json
dotnet run --project src/STVC.Webhook.Client
# Forwards public traffic to your local service
# e.g. http://127.0.0.1:8080
curl https://your-public-host/my-app/anything
# → tunneled to http://127.0.0.1:8080/my-app/anything
# → response streamed back through the same WebSocket
Reach out directly — every message is read.