@wishtunnel/cli
v1.0.13
Published
Wishtunnel CLI: expose your local server to the internet with one command.
Maintainers
Readme
@wishtunnel/cli
Expose your local server to the public internet in one command.
npm install -g @wishtunnel/cli
wishtunnel http 3000 wishtunnel — secure tunnels to localhost
Status: ● Online
Version: v1.0.0
Forwarding: https://swift-otter-3fa1.wishtunnel.com -> http://127.0.0.1:3000
Connections (last 10)
┌─────────┬──────────────────────────┬────────┬──────────┐
│ Method │ Path │ Status │ Latency │
├─────────┼──────────────────────────┼────────┼──────────┤
│ GET │ /api/users │ 200 │ 12 ms │
│ POST │ /api/login │ 401 │ 48 ms │
└─────────┴──────────────────────────┴────────┴──────────┘Commands
| Command | Description |
| --- | --- |
| wishtunnel http <port> | Expose a local HTTP server (alias: wishtunnel host) |
| wishtunnel host 4040 backend | Request backend.<domain> for local port 4040 |
| wishtunnel http 3000 --subdomain my-app | Same via flag |
| wishtunnel http 3000 --host 0.0.0.0 | Forward to a non-loopback local host |
| wishtunnel http 3000 --server wss://tunnel.example.com/_tunnel | Use a self-hosted server |
| wishtunnel tcp <port> | TCP tunnels (coming soon) |
| wishtunnel auth <token> | Save an auth token |
Configuration
Config lives at ~/.wishtunnel/config.json:
{
"token": "eyJhbGciOi...",
"serverUrl": "wss://tunnel.example.com/_tunnel"
}The WISHTUNNEL_SERVER environment variable overrides the default server URL.
Tokens are short-lived (~6h). The CLI checks the saved token's expiry before
connecting and asks for a fresh one when it has run out; wishtunnel auth
refuses to save an already-expired token and prints how long a new one lasts.
Resilience
If the connection drops, the CLI pauses in-flight streams, shows a reconnecting state, and retries with exponential backoff (1s → 30s). On reconnect it presents its previous tunnel ID, and the server restores the same subdomain if reclaimed within the 60-second grace window.
Programmatic use
import { TunnelClient } from "@wishtunnel/cli";
const client = new TunnelClient({
serverUrl: "wss://wishtunnel.com/_tunnel",
localPort: 3000,
});
client.on("connected", (info) => console.log(info.url));
client.start();