A public URL for your local site, in one click
PortBay bundles cloudflared and drives it for you: click Share publicly and the project gets an https://…trycloudflare.com URL in a few seconds. Click Stop sharing and it is gone.
How do I share my localhost with a public URL?
A tunnel client on your Mac opens an outbound connection to a hosted edge; the edge assigns a public hostname and forwards requests back down that connection to your local port, so nothing is opened on the router. cloudflared is the free route: cloudflared tunnel --url http://localhost:5173 returns a random https://….trycloudflare.com address, which you copy out of the log output and set up again tomorrow. PortBay ships cloudflared inside the app as a sidecar binary, so there is nothing to install and no Cloudflare account to create. Click Share publicly and it spawns one cloudflared process for the project, waits a few seconds for the edge to assign a URL, and shows it with a copy button; the upstream comes from the project's registry record, HTTPS included. Stop sharing or quit the app and the URL is gone. Pro adds a stable named tunnel.
Verified against the product, 2026-07-10.
From .test to the public internet
The local site gets a public HTTPS URL through Cloudflare's edge; visitors reach the same running project you see at its .test domain.
From local to shareable
- Open Tunnels and pick the project
- Click Share publicly
- Copy and send the URL
- Point a webhook at it
- Stop sharing
Open Tunnels and pick the project
Every registered project is listed with its resolved upstream URL next to it. The project does not have to be running to start a tunnel; visitors see a waking-up page until it is.
Click Share publicly
PortBay spawns a cloudflared child for the project and polls until Cloudflare's edge announces the assigned URL, a few seconds on a normal connection.
cloudflared tunnel --url https://blog.test --no-autoupdateCopy and send the URL
The https://…trycloudflare.com address appears under the project row with a copy button. Anyone with the link reaches your running local site over HTTPS.
https://sudden-otter-quay.trycloudflare.comPoint a webhook at it
Stripe, GitHub, Twilio: give the provider the public URL and the callbacks land on your local project while you watch them in the HTTP inspector.
Stop sharing
One click kills the cloudflared child and the public URL is immediately unreachable. Quitting PortBay does the same; nothing stays exposed by accident.
Tunnels, tier by tier
Attach a custom Cloudflare tunnel so Share stops rotating random subdomains.
Local mkcert certificates are accepted on the loopback leg; the public leg is TLS at Cloudflare's edge.
Showing a client your local build, the hard ways
The alternatives are a VPS you maintain, router surgery, or driving the tunnel CLI by hand for every project.
PortBay runs the same cloudflared underneath, with the spawn, the URL capture and the teardown handled for you.
# Option A: reverse-SSH through a VPS you now administer$ ssh -R 80:localhost:5173 user@your-vps # plus nginx, plus TLS # Option B: port-forward the router + dynamic DNS + hope # Option C: drive the tunnel CLI yourself, per project, per session$ brew install cloudflared$ cloudflared tunnel --url http://localhost:5173# copy the URL out of the log output; repeat tomorrow
One app, not a stack of tools
HTTPS + .test domains
https://name.test per project: mkcert certificates, managed local DNS and a bundled Caddy edge, with expiry and reissue in view.
Explore →SSH workspace
Save a host once: real terminal, SFTP browser with inline ⌘S editing, click-to-start tunnels, and host panels, on system OpenSSH.
Explore →Local email testing
A bundled Mailpit inbox on 127.0.0.1: outgoing mail is caught, readable and local, with MAIL_* vars injected at launch.
Explore →Asked before downloading
No. Quick tunnels use Cloudflare's free anonymous trycloudflare.com tier, and cloudflared ships inside PortBay as a sidecar binary. The only account-holding path is optional: Pro users can attach their own named Cloudflare tunnel to get a stable hostname.
Exactly as long as you share. The URL is valid only while the cloudflared process runs; it dies on Stop sharing, on app quit, or if PortBay crashes. Each new start gets a different random subdomain, unless you use a Pro named tunnel with a stable hostname.
Anyone with the link can reach the shared project while the tunnel is up, so treat the URL like a semi-public preview. Only that one project is exposed, TLS terminates at Cloudflare's edge, and teardown is immediate. Stop sharing when the demo ends.
Yes, that is one of the two main uses. Give Stripe, GitHub or Twilio the public URL as the callback endpoint; requests arrive at your local project and show up live in PortBay's HTTP inspector, where you can read method, status, latency and headers.
The tunnel still starts, and visitors see PortBay's waking-up page instead of an error. The Tunnels page warns you when a shared project is stopped. Start the project and the public URL serves it immediately.

Give your projects and your agents a real local home.
Download for macOSFree & open source · macOS 11+ on Apple Silicon · Pro from $10/mo