Horizon vs ngrok
Horizon is an ngrok alternative for HTTP tunnels with a stable subdomain. See what each does, what ngrok adds, and how to switch.
Pick Horizon when you want an HTTPS URL for localhost, a subdomain that stays yours, and a request log in the dashboard. Pick ngrok when you need raw TCP, authentication at the edge, or custom domains.
Last checked: October 2026. The ngrok facts on this page come from ngrok's own pages on that date. ngrok changes its plans, so check ngrok pricing before you decide.
When to pick which
Horizon does one job. It puts a local HTTP server on a public HTTPS URL. You install one CLI, run one command and get a request log. A reserved subdomain keeps your webhook URL the same across restarts.
ngrok does more. It also tunnels raw TCP, and it can enforce basic auth, OAuth and IP restrictions before a request reaches your app. It supports custom domains on paid plans If you need any of those, use ngrok. Horizon has none of them.
Comparison
| Horizon | ngrok | |
|---|---|---|
| HTTPS tunnels | Yes | Yes |
| WebSockets | Yes | Yes |
| Streaming (Server-Sent Events, chunked bodies) | Yes, streamed unbuffered | Yes, no limit on data sent by clients or upstream services |
| Stable subdomain | Paid. Random subdomains are free. | Free plan: one assigned dev domain. Paid plans: more branded domains. |
| Custom domains | No | Yes, listed on Pay-as-you-go ($0.01 per active hour) |
| Raw TCP | No | Yes. Free plan needs a payment method on file. |
| Edge auth: basic auth | No | Yes (basic-auth action). Plan: See ngrok pricing |
| Edge auth: OAuth | No | Yes (oauth action). Free plan: 3 monthly active users. |
| IP restrictions | No | Yes (restrict-ips action). Plan: See ngrok pricing |
| Request inspection | Request log in the dashboard, kept 24 hours | Traffic Inspector |
| Request replay | Yes, from the request log | Yes, on the free plan |
| Browser warning page on free tunnels | Yes, once every 7 days per IP address | Yes, for 7 days after a visitor continues |
| CLI install | npm install -g @hrzn/cli | See the ngrok download page |
| Pricing | See Horizon pricing | Free $0, Hobbyist $10 per month, Pay-as-you-go $20 per month plus usage (checked October 2026) |
Switching from ngrok
Install the CLI and sign in. Then swap the command.
| ngrok | Horizon |
|---|---|
ngrok http 3000 | hrzn tunnel http://localhost:3000 |
ngrok http 3000 --url https://my-app.ngrok.dev | hrzn tunnel http://localhost:3000 -s my-app |
ngrok-skip-browser-warning header | x-hrzn-skip-warning header |
ngrok's --url takes a full URL. Horizon's -s takes the subdomain name only, and the name must be one you reserved on the Subdomains page. Your URL becomes https://my-app.hrzn.run.
Both headers take any value. Set the Horizon one on requests you send yourself, so a browser visitor skips the Before you continue page. Webhook senders and curl never see it.
Update the URL in every webhook and OAuth redirect setting that pointed at ngrok. The guides below walk through the common cases:
- Webhook guides for Stripe, GitHub, Shopify and more
- Sign-in guides for OAuth providers and redirect URLs
- Framework guides for Next.js, Vite, Rails, Django and more