Make localhost public with one ssh command.

tunl is a reverse tunnel built on the OpenSSH you already have. There is no binary to download, and basic tunnels need no account.

ssh -R 80:localhost:3000 -p 2222 tunl.online

Works with the OpenSSH on macOS, Linux, and Windows 10 and 11. Change 3000 to your local port.

The request log as it prints in your terminal.

Standard SSH port forwarding, with HTTPS at the other end.

Your local server connects to tunl over SSH. Public HTTPS traffic travels back down the same connection.

1Local machine

localhost:3000

Any HTTP server on any local TCP port: Next.js, FastAPI, Express or Django.

2SSH transport

tunl.online:2222

A standard OpenSSH reverse forward, encrypted end to end with Ed25519 key pairs.

3Public endpoint

https://my-app.tunl.online

A public HTTPS URL with a valid certificate, for webhooks, teammates and phones.

Nothing to install.

Most tunneling tools ask you to add a custom agent. tunl uses the OpenSSH client already on your machine.

What you skip

  • A CLI binary to download
  • A background daemon process
  • API tokens for basic tunneling
  • Local configuration files
  • Custom package manager updates

What you already have

  • OpenSSH on macOS, Linux and Windows 10 and 11
  • Ed25519 and RSA key authentication
  • An encrypted SSH transport
  • Standard port forwarding syntax
  • Outbound access to TCP port 2222, the only network requirement

For when a local server has to be reachable.

Test webhooks without deploying

Receive Stripe, GitHub or Shopify callbacks on localhost while you build the integration. Paste your tunnel URL into the provider's dashboard and watch each delivery arrive in the inspector.

$ ssh -R 80:localhost:3000 -p 2222 tunl.online

Webhook endpoint:

https://my-app.tunl.online/api/webhooks/stripe

Share work in progress

Send teammates or clients a live HTTPS link straight from your local build.

Test on real phones

Point physical devices at the API server running on your workstation.

Build OAuth sign-in locally

Register a tunl HTTPS address as the redirect URI while you develop.

Demo without a cloud server

Show prototypes and live UI state without standing up a temporary deployment.

Reach your laptop from IoT hardware

Send webhooks and HTTP requests from embedded devices to localhost.

What every tunnel includes.

See each request as it arrives, in your terminal and in the web inspector, with the headers, payloads and status codes.

Tunnel infrastructure

Automatic HTTPS and TLS

Every tunnel gets an HTTPS domain with a valid certificate, terminated for you.

WebSocket and SSE upgrades

Full HTTP/1.1 upgrades for WebSockets, Server-Sent Events and Vite or Next.js hot reloading.

Request inspection

Read incoming headers, payloads, methods and status codes in real time from the dashboard.

Persistent subdomains

Reserve a fixed name such as my-app.tunl.online, linked to your SSH key.

Security and access control

OpenSSH key authentication

Sign in with an Ed25519 or RSA key. No API tokens and no static passwords.

IP allowlisting

Limit who can reach a tunnel with CIDR blocks or client IP ranges set in your dashboard.

Scoped forwarding

Only the port you choose is forwarded. No local files or network are exposed.

Key revocation

Register keys, verify fingerprints and revoke access instantly from the web console.

In development: custom domains (.yourdomain.com), TCP port forwarding and team workspaces.

tunl next to the tools you may use now.

A side by side with ngrok and Cloudflare Tunnel, including where tunl is still catching up.

FeaturetunlngrokCloudflare Tunnel
Runs on the OpenSSH you already haveNo agent or binary to installYesVia SSH mode*Needs cloudflared
No account for a first tunnelRun a tunnel before signing upYesAccount requiredQuick Tunnels only
SSH key authenticationEd25519 and RSA public keysYesIn SSH mode*Login or token
Automatic HTTPS and TLSYesYesYes
Persistent subdomainA fixed name that survives restartsFree in preview, tied to your SSH key1 free dev domain with an accountNeeds a domain on Cloudflare DNS
WebSocket and SSE upgradesYesYesYes
Request inspection in a web UIHeaders, payloads, status and latencyYesYesAudit logs
Custom domainsIn developmentPaid plansVia Cloudflare DNS
TCP forwardingIn developmentYesYes

* ngrok's SSH mode needs an ngrok account and an uploaded public key, and has limitations compared with the ngrok agent. Based on each project's public documentation, October 2026.

Free to start. Free to reserve a name.

Tunnel straight away without an account. Register an SSH key when you want a subdomain that stays yours.

Ephemeral

Free forever

$0 / month

One-command tunnels for quick debugging, testing and webhook inspection.

  • Random subdomain per SSH connection
  • Automatic HTTPS and TLS termination
  • WebSocket and SSE protocol upgrades
  • No account or registration required
Open dashboard

Reserved

Developer preview

$0 / preview access

A persistent subdomain linked to your registered OpenSSH public key.

  • Everything in Ephemeral
  • Persistent static subdomain, name.tunl.online
  • OpenSSH Ed25519 key authentication
  • Traffic inspector and web dashboard
Claim reserved subdomain

Questions before the first tunnel.

What is tunl?

tunl is a zero-install reverse tunneling platform powered by standard OpenSSH. It exposes local development servers, APIs, WebSockets and webhooks to the public internet over HTTPS, with no proprietary CLI binary or background daemon.

How do I create a tunnel without installing anything?

Run ssh -R 80:localhost:3000 -p 2222 tunl.online in your terminal, changing 3000 to your local port. You get an HTTPS endpoint straight away, and no signup is needed.

What if my network blocks port 2222?

tunl connects outbound over TCP port 2222. If the command hangs or times out, your network or firewall may be blocking that port. Try another network, or ask your network admin to allow outbound connections to tunl.online on port 2222.

How do I keep a tunnel alive?

A tunnel is a standard SSH session, so it ends when the connection drops. Add -o ServerAliveInterval=30 so OpenSSH sends keepalives, or wrap the command in a loop or a tool such as autossh to reconnect automatically.

How does tunl compare to ngrok and Cloudflare Tunnel?

tunl needs no account for a basic tunnel and nothing to set up: no agent, no auth token, no key upload. ngrok also has an SSH mode, but it needs an account and a registered public key. Cloudflare's Quick Tunnels need no account but do need cloudflared installed. The comparison table above has the details, including features tunl does not have yet.

Is tunl free to use?

Yes. The Ephemeral tier is free forever, and the Reserved tier is $0 during developer preview.

Can I reserve a persistent subdomain?

Yes. Register an SSH key and claim a fixed name such as name.tunl.online, linked to that key.

Does it support WebSockets, Next.js HMR and webhooks?

Yes. tunl supports full HTTP/1.1 upgrades for WebSockets, Server-Sent Events and hot module replacement, and it receives webhook callbacks from services like Stripe, GitHub and Shopify.

Is it secure?

Authentication uses Ed25519 or RSA public keys over an encrypted SSH transport. Forwarding is scoped to the single local port you choose, and you can allowlist IP ranges and revoke keys from the dashboard.

Start your first tunnel.

No signup required. Run standard SSH and get an HTTPS endpoint.

ssh -R 80:localhost:3000 -p 2222 tunl.online