Tunnel URLs that
stay put

Named, persistent tunnel URLs defined in code, so webhooks survive restarts and your team shares one config, not a Slack thread of changing URLs.

zsh

Quick install

curl -sSL https://frank-chris.github.io/burrow/install.sh | sh

macOS and Linux. Windows? Use Scoop.

The problem

Every restart breaks something

Random tunnel URLs mean reconfiguring webhooks, resending links to teammates, and losing the session state you had in your browser tab.

ngrok / random tunnels

New URL on every restart

Your payment webhook points to abc-xyz.trycloudflare.com. It changes. You update it. It changes again tomorrow. Persistent URLs on ngrok start at $8-20/month per user - 10-20x the cost of a domain.

raw cloudflared

Right infrastructure, rough setup

7 manual steps, credentials files that can't be committed, no process management, and each teammate configures their own setup from scratch.

With burrow

One committed file, same URLs for everyone

Define tunnels in .burrow.yaml and commit it. DNS is created automatically. Every credentialed teammate runs burrow up and gets the exact same domains, every time. ~$10/yr for a domain, shared across the whole team - no per-seat fees.

Features

Stop chasing URLs

Tunnels

Persistent named URLs

Domains defined in .burrow.yaml stay the same across restarts. Commit the file, share with the team.

Multi-tunnel

Frontend, API, docs: start all of them in parallel with a single burrow up. Each gets its own URL.

No account needed

Quick tunnels via trycloudflare.com work instantly. No signup, no config. Just run burrow share 3000.

Security & access

Automatic HTTPS

Every tunnel URL is HTTPS. Trusted certificates, green lock, no warnings - for both quick tunnels and named domains.

Password protection

Lock a shared URL behind a password with --password. Basic auth, no extra setup required.

Auto-expiry

Set a TTL on any share tunnel. It shuts itself down after the duration with no dangling processes.

Developer tools

WebSocket and HMR

Vite, Next.js, webpack-dev-server all work without extra config. cloudflared proxies WebSocket connections natively.

Diagnostics

Warns before starting if nothing is listening on the target port. Tail live request logs with burrow logs -f, or run burrow doctor to check your setup.

QR code & clipboard

The tunnel URL is copied to your clipboard automatically on start. Add --qr to also print a QR code for testing on a real device.

Reference

Commands

Everything burrow can do. First time? See the Cloudflare setup.

burrow up +

Start all tunnels defined in .burrow.yaml. Tunnels with a domain get persistent URLs; tunnels without one get a free temporary trycloudflare.com URL.

# start all tunnels
$ burrow up

# start a single tunnel by name
$ burrow up api
burrow share +

Share a local port instantly with a public URL. No account or config needed. Runs in the foreground; press Ctrl+C to stop.

# share port 3000
$ burrow share 3000

# password-protect the URL
$ burrow share 3000 --password secret

# auto-expire after 2 hours and show a QR code
$ burrow share 3000 --ttl 2h --qr
burrow down +

Stop all running tunnels, or a single one by name.

$ burrow down
$ burrow down api
burrow status +

Show the name, PID, and URL of every tunnel currently running.

$ burrow status
burrow logs +

Show tunnel request logs. Only available for named tunnels with a domain in .burrow.yaml.

$ burrow logs
$ burrow logs api
$ burrow logs api -f
burrow init +

Store Cloudflare API credentials. Only needed once, and only if you want persistent named URLs on your own domain.

$ burrow init
burrow doctor +

Diagnose setup issues - checks that cloudflared is installed, credentials are present, and config is valid.

$ burrow doctor
burrow uninstall +

Remove burrow's config directory, credentials, and PID files from your system.

$ burrow uninstall

Install

Up in under a minute

cloudflared downloads automatically on first use. No manual setup needed for quick tunnels.

$ curl -sSL https://frank-chris.github.io/burrow/install.sh | sh

macOS and Linux. Windows? Use Scoop.

Other options

# Scoop
$ scoop bucket add frank-chris https://github.com/frank-chris/scoop-burrow
$ scoop install burrow
# Homebrew
$ brew tap frank-chris/tap
$ brew install burrow