Quickstart

TL;DR

Create an account → verify your email → mint a token → run the binary (or Docker sidecar) → you get a public HTTPS URL that points at your local service. That's it.

1 Create an account

Register at app.teztun.uz/register. Passwords must be at least 10 characters and mix two of letters / digits / symbols.

A verification email lands in your inbox — click the link and the account is live. No admin approval, no waiting.

2 Mint a service token

Once verified, go to app.teztun.uz/tokens and click Create token. Give it a name ("laptop-dev", "staging-docker", whatever — it's just a label).

TezTun is free through December 31, 2027. New accounts receive Max access automatically, including tokens that never expire.

The plaintext token is shown once. Copy it now.

3 Pick your path

There are two equally supported ways to run TezTun — pick whichever fits your stack.

A Path A: CLI binary

Download

Grab the binary for your platform at teztun.uz/download. Or on Linux / macOS:

# macOS (Apple Silicon)
curl -LO https://teztun.uz/releases/teztun-darwin-arm64
chmod +x teztun-darwin-arm64 && mv teztun-darwin-arm64 /usr/local/bin/teztun

# Linux amd64
curl -LO https://teztun.uz/releases/teztun-linux-amd64
chmod +x teztun-linux-amd64 && mv teztun-linux-amd64 /usr/local/bin/teztun

# Verify
teztun version

Windows: download teztun-windows-amd64.exe from the download page. Rename to teztun.exe, double-click or run from PowerShell.

Optional: verify the checksum at https://teztun.uz/releases/SHA256SUMS.

Authenticate

Two options:

# Option 1 — browser login (stores session to ~/.teztun/session)
teztun login

# Option 2 — paste the service token into the env (best for scripts)
export TEZTUN_TOKEN=tzt_your-token-here

Tunnel

Start any local service first — a Next.js dev server, a Python HTTP server, a database, anything that speaks TCP. Then, for a web app:

teztun http 3000

For a database, Redis, or any non-HTTP service, use teztun tcp 5432 instead — HTTP mode is for HTTP-shaped traffic only.

Output:

Your tunnel is active!

  Your link: https://a3f8k2x9.ttn.uz
  Local:     localhost:3000

  Press Ctrl+C to stop.

Open the URL in any browser. Traffic routes into localhost:3000. Done.

B Path B: Docker sidecar

Add one service to your docker-compose.yml:

services:
  app:
    image: acme/myapp
    # Notice: no "ports:" here. Only the sidecar reaches it.

  tunnel:
    image: asadullokhn/teztun:latest
    environment:
      TEZTUN_TOKEN: ${TEZTUN_TOKEN}
    command: http app:3000
    restart: unless-stopped
    depends_on:
      - app

Put the token in .env next to the compose file (gitignore it):

TEZTUN_TOKEN=tzt_your-token-here

Run it:

docker compose up -d
docker compose logs tunnel

The logs show https://<random>.ttn.uz. That's your URL.

Full walk-through with more examples: Docker Compose guide.

Behind a reverse proxy?

If your local service sits behind nginx (or another reverse proxy) and your app gets stuck in an HTTPS redirect loop, that proxy is probably overwriting our X-Forwarded-Proto header with $scheme. Two-line fixes for nginx, Rails, Django, Express, downstream Caddy / Traefik are at /docs/behind-a-proxy.

4 Make the URL stable (optional)

Random subdomains change on every restart. To pin one, reserve it first at app.teztun.uz/domains, then pass it:

teztun http 3000 --subdomain myapp          # CLI
command: http app:3000 --subdomain myapp    # Docker

Result: https://myapp.ttn.uz stays the same while your reservation remains active. See the subdomain reservation policy.

Max users can also use their own domain:

teztun http 3000 --domain myapp.com

Full walk-through: custom domain guide.

5 You're live

That's the onboarding. Next moves, depending on what you're doing:

Troubleshooting

Verification email never arrived — check spam first. The link expires after 24 hours; resend from the verification page or by signing in. Still nothing? Email [email protected] with the address you signed up with.

"Authentication failed" in the logs — the token is invalid, expired, or revoked. Mint a fresh one at app.teztun.uz/tokens.

Container keeps restarting — docker compose logs tunnel will show the error. Most commonly a bad TEZTUN_TOKEN.

Tunnel is live but the URL shows "offline" — your local service isn't responding on the port the tunnel points at. Restart it; the tunnel auto-recovers.

Need request-level logs — use HTTP mode for structured access logs. Add --inspector for a local UI containing the last 100 requests, headers, and captured bodies. Raw tcp tunnels do not parse HTTP requests.