$ npm start
Error: listen EADDRINUSE: address already in use :::3000

Eliminate port conflicts in your dev environment.

Port Zero lets the OS pick random available ports, then forwards them to virtual domains on a virtual NIC. Run multiple branches simultaneously without clashing.

Download How It Works

Up in seconds

Pick your platform. The daemon starts automatically on login.

$ brew install PortZeroNetwork/portzero/port-zero

Configure ports to 0. Set one env var.

Port Zero's daemon watches for processes with PZ_TUNNEL and routes traffic automatically. The domain you choose determines the scope.

Local — free
# resolves on your machine and LAN
PZ_TUNNEL=main.myapp.portzero.local:80 npm start
# http://main.myapp.portzero.local:80 is now live
Cloud — subscription
# reachable anywhere on the internet
PZ_TUNNEL=main.myapp.portzero.cloud:80 npm start
# https://main.myapp.portzero.cloud is now live
1

Set ports to 0

Configure every service to bind on port 0. The OS picks a free port at random — conflicts are structurally impossible.

2

Set PZ_TUNNEL

Use portzero.local for on-machine routing or portzero.cloud for internet tunnels. Same syntax either way.

3

Start your app

The daemon finds the process, assigns it a stable address, and starts routing. Your app code doesn't change at all.

Built for real development workflows

Every feature follows from one idea: ports should never be your problem.

Multiple branches simultaneously

Running main and feature-auth in separate worktrees? Each gets its own address. Both live at once — no restarts, no juggling.

http://main.myapp.portzero.local:80
http://feature-auth.myapp.portzero.local:80

Any TCP protocol

Not just HTTP. WebSockets, gRPC, raw TCP, database connections — Port Zero routes it all. If it runs over TCP, it works.

Internet tunnels, no config

Switch portzero.local to portzero.cloud and your service is on a public HTTPS URL. No firewall rules, no reverse proxy setup.

Stable, predictable addresses

Every service gets the same address every run. Share a URL with a teammate — it still works tomorrow. No random subdomains, no re-auth.

What actually happens

A daemon runs on your machine and watches for PZ_TUNNEL. The domain determines which path it takes.

Local path (portzero.local)

  1. 1 Creates a virtual NIC on your machine (once, on first run).
  2. 2 Assigns the service a unique virtual IP on that NIC.
  3. 3 Creates a DNS record for that IP using the PZ_TUNNEL template.
  4. 4 Forwards the virtual IP's port to the actual (random) port your process bound to.

Cloud path (portzero.cloud)

  1. 1 Daemon detects portzero.cloud in PZ_TUNNEL.
  2. 2 Opens an outbound tunnel to our edge servers — no inbound ports needed.
  3. 3 Traffic to your subdomain is proxied back through the tunnel to your local service over TLS.

Simple, transparent pricing

Local routing is always free. Pay only for cloud tunnels.

Free
$0/mo

Local routing + one cloud tunnel to try it

  • Unlimited local routing
  • 1 cloud tunnel
  • 50 requests/day
  • 50 MB/day
  • Community support
Get Started Free

Send us a message

Questions, bug reports, partnership notes, or anything else.

Tell us what you need

Include context, links, or a tunnel domain if that helps. We reply by email.

  • Product questions and feature requests
  • Billing, account, and login issues
  • Partnerships, press, and general support

Prefer email? Write to support@portzero.net.