Go from localhost to a public URL in one command.

Horizon gives your local server an HTTPS address anyone can open, and shows every request that reaches it. No deploys, no port forwarding.

Get started free
$npm install -g @hrzn/cli

How it works

Your server, reachable from anywhere

Horizon forwards each request from your public URL to the port on your machine, and sends the response back.

A request to https://my-app.hrzn.run reaches the Horizon edge, which forwards it to http://localhost:3000 on your machine and sends the response back.

Request log

See every request that reaches your machine

The dashboard keeps what your terminal prints, with headers, bodies and a Replay button.

Every request, ready to replay

Open a webhook to read its headers and body. Fix your handler, then send it again with Replay.

hrzn.run/dashboard/tunnels/my-app
my-app.hrzn.runLive for 2h 14m

Secrets stay masked

Authorization, cookies and token headers are masked before they are stored.

authorizationBearer sk_l…cdefmasked
x-api-keykey_…a91bmasked
cookiesess…7c1emasked
content-typeapplication/json
user-agentStripe/1.0 (+https://stripe.com/docs/webhooks)

A URL that stays

Reserve a subdomain, so webhook settings keep working after a restart.

24 hours of history

The log keeps the last day of requests, also after your CLI stops.

my-app.hrzn.runOffline

Workflows

Built for the jobs localhost can't do

Three reasons developers open a tunnel.

hrzn.run/dashboard/tunnels/my-app
my-app.hrzn.runLive for 2h 14m

POST/webhooks/stripe

Status
200
Duration
182 ms
Size
2.4 kB in
application/json
{
  "id": "evt_1QxY2Z",
  "type": "invoice.paid",
  "data": {
    "object": {
      "id": "in_1QxY2Z",
      "amount_paid": 1000,
      "currency": "eur"
    }
  }
}

Webhooks

Test your integrations locally

Point a webhook at your tunnel and debug it on your own machine. Choose a service to open its guide.

Pricing

Free until you want a URL that stays

Pay only for the subdomain slots you buy.

Billing interval

Free

For quick shares and one-off tests.

€0

per month.

No card needed.

  • Unlimited tunnels on a random subdomain
  • HTTPS on every tunnel
  • WebSocket support
  • The request log, with replay

Reserved subdomain

For URLs that other services depend on.

€0.83

per slot per month, billed yearly · or €1 monthly

€10 per slot, paid once a year.

  • Everything in Free
  • One subdomain that is yours alone
  • Webhooks, bookmarks and shared links keep working
  • Switch between monthly and yearly at renewal

1 slot holds 1 reserved name. Buy slots ahead and fill them later.

FAQ

Questions before you start

Something else? Email [email protected].

Is Horizon free?

Yes. Tunnels on a random subdomain are free, with HTTPS, WebSockets and the request log. No card is needed. You only pay for a reserved subdomain that stays the same.

What is a slot?

A slot is a paid place for one reserved subdomain. You can buy more slots than names, so a slot can stay empty until you need it. Each slot is billed monthly or yearly.

What happens when I release a subdomain?

The name is held for you for 7 days. After that, others can claim it. The slot stays yours, empty and ready for another subdomain.

Can I switch between monthly and yearly?

Yes, in Settings in the dashboard. The switch applies at your next renewal, and nothing is charged today. Your slots carry over.

What does the request log keep?

Each request through your tunnel for 24 hours, up to the last 500 per subdomain: method, path, status, headers and bodies. Secret headers, such as Authorization and cookies, are masked before they are stored. The log stays readable after your CLI stops.

Does it work with WebSockets?

Yes. WebSocket connections to your public URL pass through the tunnel to your local server.

Put localhost online.

Install the CLI, sign in and run one command.

Get started free
$npm install -g @hrzn/cli