HTTP Tunnels Core

Expose your local HTTP server to the internet with a single command. NFLTR creates a secure, encrypted tunnel from your localhost to a public HTTPS URL — no port forwarding, no DNS configuration, no firewall changes required.

Tutorials: Share a local web app · Share a log or command output


How It Works

When you run nfltr http 3000, the agent establishes an outbound gRPC connection to the NFLTR server. Incoming HTTPS requests to your public URL are relayed through this encrypted tunnel to your local service. The connection is always initiated from your machine — no inbound ports needed.

INTERNET Browser / API Client HTTPS Request NFLTR SERVER TLS Termination Route Matching gRPC Tunnel Relay YOUR MACHINE nfltr agent localhost:3000

Quick Start

1. Start your local server

# Any HTTP server on any port
node server.js          # Express on :3000
python -m http.server   # Python on :8000
go run main.go          # Go on :8080

2. Create the tunnel

nfltr http 3000

That's it. You'll see output like:

Agent ID:    alice.cranky-fox
Forwarding:  https://nfltr.xyz/browse/alice.cranky-fox/ → http://localhost:3000
Share URL:   https://k3vq7mzt2xw4hn5rbsd6jyfa2e.nfltr.xyz/

3. Access your service

Anyone on the internet can now reach your local server via the share URL or the stable browse URL. All traffic is encrypted with TLS end-to-end.

Multi-Route Support

Route different URL paths to different local ports. Perfect for microservice architectures where your frontend and API run on separate ports:

# Frontend on :5173, API on :8080, WebSocket on :4000
nfltr http 5173 \
  --route /api=8080 \
  --route /ws=4000
INCOMING REQUESTS GET / POST /api/users WS /ws/feed NFLTR ROUTER Path-based routing LOCAL SERVICES :5173 — Frontend :8080 — API :4000 — WebSocket

Named Endpoints

Give your tunnel a stable, human-readable name that persists across restarts:

nfltr http 3000 --name my-api

Your service is always available at https://nfltr.xyz/browse/alice.my-api/ — the URL never changes, even if you restart the agent. It is your own entry point: after dashboard sign-in it redirects to the agent's own origin, https://b-<hash>.nfltr.xyz/, so the agent's pages never run on the dashboard origin (scripts send their API key and follow the redirect, curl -L). If the agent is temporarily offline, the server returns 503 Service Unavailable with a Retry-After header instead of 404, so clients know the endpoint exists and will come back.

Streaming & SSE Support

NFLTR transparently proxies all HTTP response types:

AI chat interfaces, live log tails, real-time dashboards — they all work transparently through the tunnel.

Uploads and downloads

Request bodies stream to your local server as they arrive: your app gets the first bytes of an upload while the client is still sending the rest, and neither the relay nor nfltr holds the whole body in memory. A request body can be up to 1 GiB; a larger one is refused with 413 and the message request body too large: the relay accepts at most 1 GiB (http.server.max_request_body_size). Responses (downloads) have no size limit and support Range requests, so an interrupted download can resume.

Agents built before streaming uploads (and the sample agents) read each body whole; for them the limit stays at 10 MiB, and a larger body gets a 413 that says so. Update nfltr to lift it.

Security

🔒 TLS Everywhere

All public URLs use HTTPS. TLS termination happens at the server — your local service can run plain HTTP. Share and agent subdomains (https://<code>.nfltr.xyz/) are served by the nfltr server itself with a Let's Encrypt wildcard certificate; no CDN sits in between, so long requests and large uploads are not cut by an edge proxy.

🔑 Authentication

Tunnels require an API key. Incoming requests can be further protected with share URL auth, IP allowlists, or bearer tokens.

📋 Request Inspection

Every proxied request is logged with method, path, status code, and timing. View in the dashboard or via the API.

CLI Options

FlagDescriptionExample
--nameStable name for the agent (persistent URL)--name my-api
--routeMap a URL path to a different local port--route /api=8080
--no-shareDisable automatic share URL generation--no-share
--share-authPassword-protect the share URL--share-auth secret123
--share-ip-allowlistRestrict share URL by IP--share-ip-allowlist 1.2.3.4
--share-bearerRequire bearer token for share URL--share-bearer mytoken
--labelsMetadata labels for fleet management--labels env=prod,region=us

Use Cases

💡 Works behind CGNAT

The agent connects outbound over gRPC (port 443). No inbound ports, no static IP, no router configuration needed. Works behind CGNAT, hotel Wi-Fi, and corporate firewalls.

Ready to try HTTP tunnels?

Download the agent and expose your first service in under 30 seconds.

Install the CLI CLI Reference