Open source · Self-hostable

Localhost,
publicly reachable.

OpenTunnel gives your local apps persistent public domains—perfect for webhooks, live demos, and mobile testing. No ports to open, no router to fight, no traffic left unseen.

$ curl -fsSL https://opts.ink/install.sh | sh
Terminal

$ opentunnel up 3000 --domain <your-domain>

✓ Authenticated as [email protected]

✓ Connected to OpenTunnel edge

Public URL

https://<your-domain>.opts.ink

Forwarding

http://127.0.0.1:3000

Watching for requests… press Ctrl+C to stop

1Single binary
0Config files
TLS domains
MITOpen source

Features

Everything you need to ship from localhost

A focused toolkit for getting local code onto the public internet—and understanding exactly what happens next.

Persistent domains

Reserve memorable URLs like my-app.opts.ink that stay yours across restarts and redeploys.

Request inspection

See every request and response in real time—headers, body, status, and latency—straight from the dashboard.

Webhook debugging

Point Stripe, GitHub, or any provider at your tunnel and replay deliveries until the integration is right.

One-command setup

A single static binary. No accounts to wire up, no router config, no ngrok-style session limits.

Secure by default

Automatic TLS on every domain, with token-based access controls so only the right people connect.

Instant replay

Resend any captured request with one click to reproduce bugs without triggering the source again.

How it works

Live in under a minute

Three commands from a fresh terminal to a live, inspectable public URL.

1

Install OpenTunnel

Run the installer on macOS or Linux.

$ curl -fsSL https://opts.ink/install.sh | sh
2

Authenticate the CLI

Sign in once and your machine is linked to your workspace.

$ opentunnel login
3

Go live

Point a persistent public domain at your local server.

$ opentunnel up 3000 --domain <your-domain>

Traffic inspector

Inspect every request as it happens

Every request through your tunnel is captured with full headers, payloads, status codes, and timing. Filter by method or status, dig into a single call, and replay it instantly to reproduce the exact conditions that broke your code.

  • Real-time streaming of requests and responses
  • One-click replay without hitting the source again
  • Works with any framework, port, or webhook provider
Try the dashboard
Live requestsstreaming
POST/webhooks/stripe20042ms
GET/api/session20011ms
POST/graphql40063ms
DELETE/api/cache500128ms

Bring localhost into the open

Spin up a persistent, inspectable public URL for your local app in seconds. Free, open source, and yours to self-host.