Quickstart
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).
- Free — tokens expire in 6 hours (too short for most workflows)
- Pro — tokens last 3 days
- Max — tokens never expire — recommended for always-on tunnels and CI
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 versionWindows: 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-hereTunnel
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 3000For 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:
- appPut the token in .env next to the compose file (gitignore it):
TEZTUN_TOKEN=tzt_your-token-hereRun it:
docker compose up -d
docker compose logs tunnelThe logs show https://<random>.ttn.uz. That's your URL.
Full walk-through with more examples: Docker Compose guide.
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 # DockerResult: 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.comFull walk-through: custom domain guide.
5 You're live
That's the onboarding. Next moves, depending on what you're doing:
- → Testing webhooks? Point Stripe / GitHub / Telegram at your tunnel URL and you're done.
- → Sharing a dev demo? The URL works over HTTPS from anywhere — no VPN, no port-forwarding.
- → Running an MCP server? See Using TezTun from Claude Code — the CLI includes an MCP server so you can also manage tunnels from your AI editor.
- → Exposing a database? TezTun is TCP-level — Postgres, Redis, Mongo all work. Just be careful who you share the URL with.
- → Automating from CI? Use
TEZTUN_TOKEN_FILE=/run/secrets/teztun_tokenwith Docker secrets.
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.