Getting Started
Install Proxer and expose a local HTTP service.
This walkthrough uses the common setup: a cheap public server receives traffic, while a laptop or private machine runs the actual app. The private machine only needs outbound access to the public server.
Prerequisites
Section titled “Prerequisites”- A public machine or reverse proxy that can receive HTTP/WebSocket traffic.
- A local HTTP service to expose.
- Node.js 24 or later if you install with npm.
Install
Section titled “Install”Download a standalone Windows executable from GitHub Releases.
proxer.exe --versionbrew install tinyrack-net/tap/proxernpm install -g @tinyrack/proxerdocker run --rm tinyrack/proxer --versionExpose one service
Section titled “Expose one service”The public wss:// and https:// examples assume TLS terminates in front of Proxer, usually at Caddy, Traefik, NGINX, or a load balancer. That proxy should forward HTTP and WebSocket traffic to Proxer over loopback or a private network.
-
Start the public server
Run this on the machine that receives public traffic:
proxer server --listen 0.0.0.0:8080 --domain your-server.example.com --token dev-tokenThe same port handles public requests and the tunnel control WebSocket.
-
Start a local app
On the client machine, start any HTTP service. Python is enough for a smoke test:
python3 -m http.server 3000 --bind 127.0.0.1 -
Register an auto-assigned route
Omit
--subdomainwhen you want Proxer to assign a random subdomain:proxer http 3000 \--server wss://your-server.example.com \--token dev-token -
Call the assigned host
The client prints a
subdomain: px-...line and the full public URL. Use that host:curl https://px-k7m3q9t2ab.your-server.example.com/ -
Register a subdomain route
Use
--subdomainwhen you want a named route:proxer http 3000 \--server wss://your-server.example.com \--subdomain demo \--token dev-token -
Call the subdomain host
curl https://demo.your-server.example.com/Use
--subdomain @only when you intentionally want the root host itself to reach the client. This is intended for servers started with--domain.
Local-only test
Section titled “Local-only test”If you do not have DNS ready yet, keep everything on one machine and pass the host header yourself:
python3 -m http.server 3000 --bind 127.0.0.1proxer server --listen 127.0.0.1:8080 --domain proxy.localhost --token dev-tokenproxer http 3000 --server ws://127.0.0.1:8080 --subdomain demo --token dev-tokencurl -H 'Host: demo.proxy.localhost' http://127.0.0.1:8080/Read How It Works for the request flow, or Routing and Trusted Proxies before putting Proxer behind Traefik, Caddy, NGINX, or a load balancer.