Skip to main content
Exposes local ports to QA.tech so the agent can reach your dev server during testing. Pair with --application-overrides on qatech run or qatech chat to point a test run at the tunnel URL.

Usage

qatech tunnel start [options]    # start a tunnel
qatech tunnel list               # list active tunnels for your project
qatech tunnel status <runner-id> # check tunnel health
qatech tunnel stop <runner-id>   # tear down a tunnel

Global flags

These work on every subcommand:
FlagShortDescription
--api-key <key>-kAPI key override (or QATECH_API_KEY)
--api-url <url>API base URL (or QATECH_API_URL)
--help-hShow subcommand help

qatech tunnel start

Starts a tunnel and prints a manifest of public URLs, one per port.
FlagShortDescription
--port <ports>-pPorts to expose, comma-separated, with optional labels
--httpsLocal services use HTTPS (default: HTTP)
--publicMake the tunnel publicly accessible (no authentication required)

Port syntax

FormExampleResult
Single port--port 3000One tunnel for port 3000
Multi-port--port 3000,8080One tunnel host per port
Labelled--port 3000:web,4000:apiHostnames keyed by label
A labelled multi-port tunnel returns a manifest with one URL per label:
web -> https://web-<id>.quack.run
api -> https://api-<id>.quack.run

Examples

# Single port
qatech tunnel start --port 3000

# Multiple ports with labels
qatech tunnel start --port 3000:web,4000:api

# Public tunnel (no auth wrapper)
qatech tunnel start --port 3000 --public

# Local server uses HTTPS
qatech tunnel start --port 8443 --https

# Use the tunnel URL in a run
qatech tunnel start --port 3000
qatech run -t pln_abc123 \
  --application-overrides '[{"applicationShortId":"app-myapp_Abc123","environment":{"url":"https://<tunnel-host>.quack.run"}}]' \
  --wait

qatech tunnel list

qatech tunnel list
Lists every active tunnel for the project - runner ID, port mapping, and public URLs.

qatech tunnel status

qatech tunnel status <runner-id>
Returns the live health status of a single tunnel.

qatech tunnel stop

qatech tunnel stop <runner-id>
Tears down a tunnel and cleans up its resources. If the tunnel process is still running in another terminal, it will exit on its own within ~30 seconds.