amux vs ngrok
ngrok is the industry-standard localhost tunnel — a dedicated tool, free tier, full-featured, excellent for debugging. amux tunnel is built into the amux agent orchestrator and gives you a stable public URL without paying for ngrok Pro. Here is the honest comparison. Updated July 2026.
ngrok is the most widely used tool for exposing a local port to the internet over a secure tunnel. Install the CLI, run ngrok http 3000, and you get a public HTTPS URL in seconds. The free tier works immediately — no account required for basic use — though the URL changes on every restart. Paid plans add stable subdomains, custom domains, request inspection UI, TCP tunneling, and multiple concurrent tunnels. ngrok is a mature, purpose-built product with excellent documentation, an inspection dashboard, and broad ecosystem integrations.
amux tunnel is a built-in feature of amux — an open-source control plane for running a fleet of AI coding agents. Your machine dials out to the amux cloud gateway over a persistent long-poll connection; the gateway forwards incoming HTTP requests to your local server. No inbound port needs to be open. The public URL is derived from a SHA-256 hash of your token, so it is stable across restarts. The tunnel client is part of amux-server.py — no separate binary to install or maintain. The hosted gateway requires an active amux cloud subscription.
At a Glance
| Feature | amux tunnel | ngrok |
|---|---|---|
| Free tier | No — requires amux cloud subscription | Yes — ephemeral URL, no account needed |
| Stable URL (same on every restart) | Yes — always https://<id>.t.amux.io/ |
Paid plan only (static subdomain) |
| Custom domains | Not available | Yes (paid plans) |
| TCP / non-HTTP tunneling | Not available (HTTP/HTTPS only) | Yes (TCP, TLS, SSH) |
| Server-Sent Events & WebSockets | Not supported — buffered responses only | Yes (raw stream passthrough) |
| Request inspection & replay UI | Not available | Yes — excellent (killer feature) |
| Multiple concurrent tunnels | Not available (one per token) | Yes (paid plans) |
| HTTP/HTTPS support | Yes | Yes |
| Relays method, headers, body, status | Yes (including HEAD, non-2xx) | Yes |
| Self-hosting the gateway | Not supported | Not supported (ngrok-agent is OSS; server is not) |
| Included in product | Yes — zero extra installs, built into amux | Separate binary / daemon |
| Agent orchestration | Full (kanban, sessions, CRM, email, scheduler) | None — tunnel only |
| Installation | amux tunnel start 3000 (built-in) |
brew install ngrok + auth token setup |
How Each Tunnel Works
ngrok
ngrok runs a local agent that connects to ngrok's cloud edge. The edge terminates TLS for your public URL and proxies requests back to your local agent, which forwards them to your service. The free tier assigns a random subdomain on each startup. Paid plans lock in a static subdomain. The ngrok dashboard (web UI or localhost:4040) shows every request in real time — headers, body, timing, status — and lets you replay any request with one click. This inspection UI is ngrok's single most valuable feature for webhook development.
amux tunnel
The amux tunnel client is built into amux-server.py. When you run amux tunnel start 3000, the amux process dials out to the cloud gateway and opens a persistent HTTP long-poll connection. No inbound port needs to be open on your machine or firewall. The gateway routes incoming requests to that connection and returns the buffered response. Because the public URL (https://<id>.t.amux.io/) is derived from a deterministic hash of your token, it never changes — you register it once (in a webhook provider, a calendar app, a third-party API) and it keeps working across every restart and network change.
Caveat: amux tunnel relays one buffered response per request. Server-Sent Events and WebSockets do not pass through — the gateway does not hold open a streaming connection. Normal HTTP request/response apps, static file servers, REST APIs, webhooks, and the amux calendar feed (/api/calendar.ics) all work fine. If your app uses SSE or WebSockets, use ngrok instead.
# amux tunnel — three commands
amux tunnel start 3000 # expose local port 3000
amux tunnel url # print the stable public URL
amux tunnel stop # stop tunneling
The Stable URL Advantage — Why It Matters
This is the most concrete differentiator between amux tunnel and ngrok's free tier. When you register a webhook URL with Stripe, GitHub, or Slack — or subscribe Google Calendar to an iCal feed — you need that URL to stay alive across restarts. With ngrok free tier, it changes every time. With ngrok paid, you unlock a static subdomain for $8–$20/month. With amux tunnel, the URL is stable as long as your amux cloud subscription is active.
A concrete example: amux exports your scheduled tasks as an RFC 5545 iCal feed (GET /api/calendar.ics). Subscribe Google Calendar to your tunnel URL — https://<id>.t.amux.io/api/calendar.ics — and Google polls it periodically, keeping your calendar in sync with your local agent schedules. Register the URL once and it keeps working across every restart, because the <id> never changes. See the AI agent + Google Calendar use case for the full setup.
When to Use ngrok
ngrok is the right tool in these situations:
- You need a free tier. ngrok works immediately with no cost. amux tunnel requires an amux cloud subscription.
- You need request inspection and replay. ngrok's web UI at
localhost:4040shows every incoming request with headers, body, and timing, and lets you replay with one click. This is invaluable for webhook debugging. amux tunnel has nothing comparable. - You need TCP tunneling. Databases, SSH, raw sockets — ngrok supports all of these. amux tunnel is HTTP/HTTPS only.
- You need streaming responses. amux tunnel relays one buffered response per request — Server-Sent Events and WebSockets do not pass through. ngrok tunnels raw TCP streams, so SSE and WebSocket apps work.
- You need custom domains. ngrok lets you point your own domain at a tunnel on paid plans. amux tunnel URLs are always under
*.t.amux.io. - You need multiple concurrent tunnels. ngrok supports multiple simultaneous tunnels per account on paid plans. amux supports one tunnel per token.
- You are not running amux. If you do not use amux for agent orchestration, installing ngrok is much simpler than adopting amux just for a tunnel.
When to Use amux tunnel
amux tunnel makes sense in these situations:
- You already run amux. If you are using amux for AI agent orchestration, the tunnel is built in — no extra binary, no extra auth token, no separate process to manage.
- You need a stable URL without paying for ngrok Pro. The amux tunnel URL does not change between restarts. This matters for webhooks, calendar feeds, OAuth redirect URIs, and any URL registered with an external service.
- You are exposing the amux dashboard itself. Run
amux tunnel start 8822to make your dashboard reachable from your phone or a collaborator — the same URL every time, no reconfiguration. - You want zero extra tooling. One command and the tunnel is live. No daemon, no config file, no separate terminal window running ngrok.
Use Both — They Are Not Mutually Exclusive
Nothing stops you from running both. A practical split: use amux tunnel for services that need a stable registered URL (calendar feeds, persistent webhooks, the amux dashboard) and use ngrok when you need to debug a webhook interactively with the inspection UI, or when you need to tunnel a TCP service. The two tools solve different problems and operate on different ports — they coexist without conflict.
Frequently Asked Questions
What is the main difference between amux tunnel and ngrok?
ngrok is a dedicated, full-featured localhost tunnel tool with a generous free tier, request inspection UI, TCP support, and custom domains on paid plans. amux tunnel is built into the amux agent orchestrator — if you already run amux, you get a stable public HTTPS URL without installing a separate tool. ngrok has far more features; amux tunnel wins on simplicity when you are already in the amux ecosystem.
Does amux tunnel give you a stable URL for free?
The URL is stable, but "free" depends on your definition. The tunnel URL does not change between restarts and is included with an active amux cloud subscription. You do not pay extra beyond the amux cloud plan. With ngrok's free tier the URL changes on every restart — stable subdomains require a paid ngrok plan.
Does amux tunnel support TCP, Server-Sent Events, or WebSockets?
No to all three. amux tunnel is HTTP/HTTPS request-response only — it relays one buffered response per request. Server-Sent Events and WebSockets require a persistent streaming connection that the long-poll relay does not support. For TCP tunneling (databases, SSH, raw sockets) or SSE/WebSocket apps, ngrok is the right tool. Standard HTTP apps — REST APIs, static files, webhooks, iCal feeds — all work fine.
Does amux tunnel have a request inspection UI like ngrok?
No. ngrok's request inspection and replay UI is one of its best features — you can see every request that came in, inspect headers and bodies, and replay them. amux tunnel has no equivalent. For active webhook debugging sessions, ngrok's inspection UI is a significant advantage over amux tunnel.
Can I use both amux tunnel and ngrok at the same time?
Yes. They operate on different ports and do not conflict. A common pattern: use amux tunnel for services that need a stable registered URL (iCal feeds, persistent webhooks), and use ngrok when you need the inspection UI for debugging a specific integration. Both can be running simultaneously.
Is the amux tunnel client open source?
Yes. The tunnel client lives inside amux-server.py, which is open source (MIT + Commons Clause). The amux cloud gateway that terminates the tunnel is the paid piece — it requires an active amux cloud subscription. The client code is auditable and ships with the rest of amux.
What is a real use case where amux tunnel is better than ngrok free tier?
Subscribing Google Calendar to the amux iCal feed, which exports your scheduled tasks as RFC 5545 events (GET /api/calendar.ics). Google Calendar polls the URL periodically, so it must survive restarts. With ngrok free tier the URL changes on every restart, breaking the subscription. With amux tunnel the URL is always https://<id>.t.amux.io/api/calendar.ics — register it once and it keeps working indefinitely. See the AI agent + Google Calendar use case for setup details.
How amux Tunnel Fits Into the Bigger Picture
amux is not just a tunnel. It is an open-source control plane for running an AI engineering team from a single dashboard or your phone — launching, monitoring, and self-healing dozens of parallel Claude Code, Codex, or Gemini CLI sessions, with built-in kanban, notes, CRM, Gmail API, browser automation, and scheduler. The tunnel exists because agent workflows naturally produce HTTP services that need to be reachable from the outside world: webhook receivers, OAuth redirect endpoints, calendar feeds, API mocks.
If you are searching for an ngrok alternative because you want a tunnel, amux tunnel is an option but ngrok is probably a better standalone tunnel. If you are searching for an ngrok alternative because you want a stable URL and you are building AI agent workflows, amux gives you both the orchestration platform and the tunnel in one tool. Get started at the getting-started guide or browse the changelog to see what has shipped recently.
Stable tunnel URL — built into your agent control plane
amux is an open-source control plane for AI agent teams. Tunnel, kanban, CRM, email, and browser automation — all in a single Python file. amux cloud adds a stable public URL that never changes between restarts.
git clone https://github.com/mixpeek/amux && cd amux && ./install.sh
amux serve # → https://localhost:8822
# Start tunnel (requires amux cloud subscription)
export AMUX_TUNNEL_TOKEN=your_token # ~/.amux/server.env
amux tunnel start 8822 # expose the dashboard
amux tunnel url # → https://<id>.t.amux.io/
View on GitHub
amux cloud pricing →
Related: AI agent + Google Calendar (iCal via tunnel) · amux vs Devin · Getting started · Changelog · All comparisons →