The clutchcall CLI and its QUIC data-plane engine drive the tunnel modality. There is no typed Tunnel SDK class today.
A programmatic client, which embeds a tunnel in your own process, is Preview. See Programmatic API (Preview) at the bottom. For shipping work, use the CLI documented here.

Install

The CLI is a pure-static binary for Windows, macOS, and Linux (amd64 / arm64). It starts a separate QUIC engine for the data path. The engine ships next to the CLI, or you point at it with an env var (see Config).

Sign in

The CLI stores no credentials. It persists only a short-lived session JWT and a device id under your user config dir (0600). Sign out with clutchcall logout.

Command surface


http — expose a local service

The command dials the nearest edge PoP over QUIC. It forwards inbound public traffic to localhost:<local-port>. It prints the public URL and runs until you interrupt it.
int
required
The local TCP port to expose (e.g. 3000).
string
A label that the CLI appends to your reserved subdomain. With handle alice, --name apihttps://alice-api.clutchcall.dev. It requires a claimed handle.
string
Set the slug explicitly (for power users). The edge still enforces your namespace from the session token, so a stale slug cannot escape it.
WebSocket upgrades, server-sent events, and chunked/streaming responses pass through unchanged. Each public connection is its own QUIC stream.

p2p — direct peer-to-peer

Two peers run with the same pair-id. They discover each other through the control-plane rendezvous and connect directly. The edge brokers candidates but never carries bytes. Across NATs, set the <P>_STUN env var to a reflector, so each side can gather its public candidate. <P> is your CLI’s brand prefix in uppercase.
string
required
A shared secret that both peers know. It gates the direct tunnel and keys the rendezvous.
int
(share) The local service port to expose to the peer.
int
(connect) A local port to listen on. The CLI pipes connections to it through to the peer’s shared service.
string
default:"tcp"
(share) tcp, udp, or http.
string
The STUN reflector host:port for reflexive candidate gathering. You can set <P>_STUN instead.
Endpoint-independent (cone) NATs punch through directly. Symmetric NATs fall back to the relayed path.

status & devices

The free plan permits a maximum of 5 devices. Each install gets a stable device id. devices shows it, and the session token’s device claim enforces it.

Config

CLI state lives in your user config dir, for example ~/.config/clutchcall/config.json (mode 0600). It stores only non-secret session state:

Environment variables

Env vars use your CLI’s brand prefix, shown below as <P>. The prefix is the binary name in uppercase, for example clutchcall → its uppercase form.

Data-plane engine flags

clutchcall http execs the QUIC engine (clutchcall-engine) with the resolved arguments. You rarely call the engine directly, but the surface is:

Remote desktop on the same transport

A remote-desktop client (a fork of an open-source remote-desktop project) runs its network transport over this same raw-QUIC relay instead of its own rendezvous/relay. To enable it, point the client’s quic-relay-server option at a host:port that runs the tunnel module:
  • The controlled box registers its device id as a slug ("proto":"quick") and parks bidi work streams.
  • The controller dials the box by slug. The edge splices the two QUIC streams.
  • The remote-desktop client’s own message framing and end-to-end encryption ride unchanged on top. The edge only secures the QUIC hop to the PoP. It never sees cleartext.
This is the remote-desktop tunnel type in the details page. You need no extra CLI beyond the relay endpoint.

Programmatic API (Preview)

Preview / forward-looking. The shipping SDK does not contain a typed Tunnel client that embeds a tunnel inside your own process. Ship with the CLI today. The shape below is an illustration, and it can change.