PRODUCT · CLI & SDKs

One binary. Every workflow.

The tGate CLI runs tunnels, deploys policies, tails logs, replays requests and diffs config — across every environment your team uses. Plus typed SDKs in five languages.

Live in 38 regions · 99.99% uptime · SOC 2 Type II
~/work — tgate
12MB
Single binary
Static, no runtime deps
5
First-class SDKs
TS, Go, Python, Rust, Java
850ms
Cold tunnel
From command to live URL
100%
Offline auth
Cached creds, no daemon
ONE BINARY

Install once. Use everywhere.

No package managers. No node_modules. No Docker. The tGate CLI is a static Go binary. It runs the same on your laptop, in CI, on a 3-year-old EC2 instance, and inside your cluster as a sidecar.

  • Cross-platformLinux x86 + arm64, macOS Intel + Apple Silicon, Windows.
  • Auto-updateSelf-updating with signed releases. Pin versions in CI.
  • Shell completionBash, zsh, fish, PowerShell — all bundled.
# macOS / Linux
$ curl -fsSL t.gate/install | sh
# Homebrew
$ brew install tgate
# Windows
$ winget install tgate
# Docker
$ docker run tgate/cli run :3000
TYPED SDKs

Library calls instead of subprocess invocations.

The CLI is great for humans. The SDKs are great for code. Programmatic tunnel lifecycle, request inspection, policy deploys — fully typed, fully tested, embedded directly in your stack.

  • Five languages, one shapeIdentical method names and types across TS, Go, Python, Rust, Java.
  • Streaming & async-firstTail logs as iterators. Subscribe to deploys. Cancel cleanly.
  • Typed errorsTunnelLimitExceeded, InvalidPolicy — actionable, not strings.
TypeScript
import { tg } from "@tgate/sdk";
const tunnel = await tg.run({ port: 3000 });
Go
import "github.com/tgate/sdk-go"
tunnel, _ := tg.Run(tg.Port(3000))
Python
from tgate import run
tunnel = run(port=3000)
Rust
use tgate::Tunnel;
let tunnel = Tunnel::run(3000).await?;
VS curl + jq

Real workflows, not bash spaghetti.

Replay every failed request from the last 10 minutes against staging.

BEFOREscripts/replay-failed.sh
#!/usr/bin/env bash
START=$(date -u -d '10 min ago' +%s)
curl -s "$API/logs?status=5xx&from=$START" \
  -H "Authorization: Bearer $TOK" \
  | jq -r '.[].id' \
  | while read ID; do
    curl -s -X POST "$API/replay/$ID" \
      -H "Authorization: Bearer $TOK" \
      -d '{"target":"staging"}' \
      | jq '{id, status, ms}'
  done
Plus pagination, retries, error handling. Multiply per script.
AFTERterminal
$ tgate logs query \
    --status=5xx --since=10m \
  | tgate replay --to=staging
Pipes through. Errors typed. Resumable.
COMMANDS

Eighteen verbs cover the whole product.

Run, deploy, query, debug, share — all from the same prompt.

▶️

tgate run

Start a tunnel from a port, container or compose file.

tgate run :3000
📜

tgate logs

Tail, query, export structured logs from any tunnel.

tgate logs tail
🔁

tgate replay

Replay a request against any environment.

tgate replay rq_...
📦

tgate policy

Validate, diff, deploy and roll back routing policies.

tgate policy apply
👥

tgate share

Generate a shareable preview link with optional auth.

tgate share :3000
🔧

tgate doctor

Diagnose CLI, network, auth and tunnel health.

tgate doctor
"
The CLI replaced a Makefile, four bash scripts, and our internal Python wrapper around Kong. Onboarding for a new engineer is now: brew install tgate, log in, you're done.
Wei Lin
Senior DX Engineer · Pebblework
30s
TIME TO FIRST TUNNEL

Install in ten seconds. Live in thirty.

Single binary. No daemon. No config dance. The shortest path from idea to live URL.

No card required · Free for 7 days · Cancel anytime