New — close your laptop, your app keeps running · deploy in preview

Ship the apps
your agent builds.

Apps are born in Claude Code and Cursor — and die on localhost. tunr is where they live on: deploy with one command (or one MCP call from your agent), sleep when idle, wake on request, and share with a link and roles. The 3‑second tunnel is still here — now it's the on‑ramp.

bash — tunr
~ tunr deploy --name sprint

▲ Packing… 214 files (node_modules skipped)
▲ Building (nixpacks · node 20 detected)
▲ Health check: OK

🚀 Live: https://sprint.tunr.sh (sleeps when idle, wakes on request)

# close your laptop — sprint.tunr.sh stays up.
~ tunr share-app sprint

Share “sprint” like a document:
Everyone at @acme.com — Editor
[email protected] — Viewer (read-only)

No auth code in your app.
Login, roles & comments run at the edge, not in your code.
~ claude "ship this to tunr and share it with my team"

deploy_app 200 https://sprint.tunr.sh
set_share_policy 200 @acme.com: editor
get_feedback 200 2 comments pulled

Everything the dashboard does, your agent does over MCP.
~ tunr share --port 3000

Connecting to edge relay...
Tunnel established

https://ax2b3.tunr.shlocalhost:3000

The 3-second tunnel that started it all — still free, still first-class.
HTTPS · WebSocket · TCP · UDP · TLS · multi-region.

More Superpowers for Vibecoders

We built tunr specifically for freelancers and AI-assisted developers demoing web apps to clients. Stop apologizing for crashes and database wipes.

❄️

Freeze Mode (Anti-Crash)

If your local server crashes mid-demo (Node exception, database drops), the tunnel serves the last successful HTML response from proxy memory. The client never sees an error page.

tunr share -p 3000 --freeze
🛡️

Read-Only Demos

Prevent destructive actions during client demos. The proxy blocks all state-mutating requests (POST, PUT, DELETE) from reaching your local server, returning simulated success codes instead.

tunr share -p 3000 --demo
🤖

AI Native (MCP Support)

Tunr fully supports the Model Context Protocol. Give Claude Desktop or Cursor direct agentic control to spin up tunnels, inspect traffic, and debug request payloads for you.

tunr mcp
🔒

Password Protected

Add Basic Authentication to your public URL instantly. Keep your development environments secure from unauthorized access while sharing with clients.

tunr share -p 3000 --password "secret"
🔑

Auto-Login Bypass

Inject an auth cookie or JWT header so your client lands on the demo account automatically. No signup flow, no password emails — just the dashboard.

tunr share -p 3000 --auto-login "Cookie: session=demo"
🌐

Custom Domains

Use your own domain instead of the default *.tunr.sh subdomain. Point your CNAME and share professional-looking URLs with clients.

tunr share -p 3000 --domain demo.myapp.com

Auto-Expiring Tunnels

Set a Time-To-Live (TTL) so your tunnels close automatically. Never worry about forgetting to shut down a tunnel exposing your local machine.

tunr share -p 3000 --ttl 2h30m
🔀

Path Routing

Route different URL paths to different upstream ports on your machine. Perfect for testing microservices or serving your frontend and API from a single tunnel.

tunr share --route /=3000 --route /api=8080
🔄

Request Replay

Captured an interesting request in the inspector? Replay it against your local server with one command. Debug webhooks, reproduce bugs, or test idempotency.

tunr replay abc-123-xyz
📋

Machine-Readable Output

Use the --json flag to get structured JSON output from any command. Perfect for CI/CD pipelines, scripting, and AI agent integrations.

tunr share -p 3000 --json
📱

QR Code for Mobile Testing

Generate a scannable QR code instantly so you can open the tunnel URL on mobile devices or share with clients without typing long URLs.

tunr share -p 3000 --qr
🔑

Bearer Token Access

Protect your tunnel with a simple API key. Every request must include Authorization: Bearer <token> or ?token=<value> in the query string.

tunr share -p 3000 --auth-token "my-secret"
🛡️

IP Whitelisting

Restrict tunnel access to specific CIDR ranges. Only whitelisted IP ranges can reach your local server — ideal for staging environments and team access.

tunr share -p 3000 --allow-ip "10.0.0.0/8"
🔧

Live Header Modification

Add, replace, or remove HTTP headers on the fly before they reach your local server. Perfect for debugging, internal routing, and stripping fingerprinting headers.

tunr share -p 3000 --header-add "X-Debug: 1"
🎮

UDP Tunnels

Expose DNS servers, game servers, and real-time audio/video services. Raw UDP datagram forwarding with minimal latency.

tunr udp --port 53 --region ams
🔐

TLS End-to-End Encryption

Zero-knowledge mode — the relay cannot read your traffic. TLS passthrough via SNI routing. Perfect for compliance (HIPAA, PCI-DSS).

tunr tls --port 8443
🐳

Docker & Self-Hosting

Run tunr from a ~15MB Docker image or self-host the full stack with Docker Compose. Relay + Caddy + Postgres in one command.

docker compose up -d
🚀

Multi-Tunnel Config

Define all your tunnels in .tunr.json and start them in one command. Mix HTTP, TCP, UDP, and TLS tunnels in a single project.

tunr up
📊

Prometheus Metrics

Built-in /metrics endpoint for Grafana dashboards. Track requests, bytes, errors, and tunnel uptime. K8s-ready /healthz and /readyz probes.

curl localhost:19842/metrics

Run on Startup

Install tunr as a system service. Auto-starts on boot with systemd (Linux) or launchd (macOS). Never forget to start your tunnel again.

tunr service install --port 3000
🌐

Corporate Proxy Support

Connect through corporate firewalls. Supports HTTP, HTTPS, and SOCKS5 proxies. Respects HTTP_PROXY and HTTPS_PROXY env vars automatically.

tunr share -p 3000 --proxy http://proxy:8080

Reference

Commands

Everything is one tunr command away.

tunr share <options>
Map a local port to a public URL with various parameters
# Start proxying a domain
$tunr share --subdomain myapp --port 3000
✓ https://myapp.tunr.sh → localhost:3000
# Use a custom domain
$tunr share -p 3000 --domain demo.client.com
✓ https://demo.client.com → localhost:3000
# Route different paths to different upstream ports
$tunr share --subdomain myapp --port 3000 --route /api=8080 --route /ws=9000
✓ https://myapp.tunr.sh → localhost:3000
  https://myapp.tunr.sh/api → localhost:8080
  https://myapp.tunr.sh/ws → localhost:9000
# Full vibecoder demo package
$tunr share -p 3000 --freeze --inject-widget --demo
✓ https://random.tunr.sh → localhost:3000
  anti-crash cache enabled · feedback widget active · read-only mode
# QR code + security
$tunr share -p 3000 --qr --allow-ip "10.0.0.0/8" --auth-token "key123"
✓ https://secure.tunr.sh → localhost:3000
  QR displayed · IP whitelisted · bearer token required
# Modify headers before forwarding
$tunr share -p 3000 --header-add "X-Env: staging" --header-remove "X-Powered-By"
✓ https://debug.tunr.sh → localhost:3000
  X-Env injected · X-Powered-By stripped
# Password protect and auto-expire
$tunr share -p 8080 --password "secret" --ttl 30m
✓ https://secure.tunr.sh → localhost:8080
  password protected · expires in 30m
# Start daemon in background
$tunr start -p 3000 --subdomain myapp
ℹ Running as daemon (PID 12345)
# Inspect running tunnels
$tunr status
● :3000 → https://myapp.tunr.sh
# Open visual dashboard & HTTP request logs
$tunr open
✓ Opening dashboard: http://localhost:19842
tunr login
Authenticate with tunr.sh
tunr open
Open local HTTP inspector
tunr mcp
Start AI Model Context Protocol
tunr doctor
Diagnose setup or proxy issues
tunr logs
Stream live request logs
tunr update
Self-update to latest version
tunr replay <id>
Re-send a captured HTTP request
tunr uninstall
Remove tunr from your system
--qr
Display QR code for scanning
--auth-token
Bearer token authentication
--allow-ip
CIDR-based IP whitelisting
--header-add / remove
Live header manipulation

Under the Hood

How it works

A single Go binary that handles everything under the hood.

  1. 1
    Requests a public HTTPS URL from the Relay server, backed by Cloudflare's global edge network. Your localhost becomes reachable from anywhere with automatic TLS — zero DNS config required.
  2. 2
    Spins up a local reverse proxy with a layered middleware stack — Demo Mode blocks destructive writes, Freeze Mode caches responses for crash protection, widget injection adds a feedback overlay, and Path Routing fans requests to multiple local ports.
  3. 3
    Transparently upgrades WebSocket connections end-to-end, so HMR (Next.js, Vite) and real-time features work completely out of the box without any configuration.
  4. 4
    The built-in HTTP Inspector captures every request and response with millisecond timing in an in-memory ring buffer. Browse them in the web dashboard, stream via tunr logs, or let AI agents query traffic through the Model Context Protocol.

Agent-native

Your agent's deploy button

tunr ships an MCP server, so Claude Code, Cursor and Windsurf can drive it directly. Everything you can do in the dashboard, your agent can do over MCP — deploy, share, read feedback, roll back. Docs are written for agents, not just humans.

deploy_app · set_share_policy · get_feedback · rollback  —  one control plane, three faces: dashboard, CLI, MCP.

Pricing

Simple, transparent pricing

Tunnels are free forever. Deploy, host & share small software — upgrade when you need more.

Save 18%
Free
$0 /mo
  • Deployed apps 3 · sleep when idle
  • Tunnels Unlimited
  • Concurrent tunnels 1
  • Subdomains Random only
  • Password protection Included
  • Custom domains
  • Reserved subdomains
Get started free
Most popular
Pro
$9 /mo
  • Deployed apps More · always-on option
  • Custom domains for apps Included
  • Reserved subdomains Custom (myapp.tunr.sh)
  • Password protection Included
  • Custom domains Included
  • Freeze & demo mode Included
Upgrade to Pro Monthly

Get started in seconds

Install Tunr and share your first localhost app in under a minute.

✦ Free Forever — Built with Go
macOS / Linux / Windows Shell
curl -sL https://tunr.sh/install.sh | sh