Integrations

Ways to use viaduct

Reach for viaduct from the terminal, from your own code, from your tests, or from Node. Four ways to give a local port a public URL.

Command line

Share a running app

Point viaduct at any local port and hand the URL to a client, a teammate, or your phone. Automatic HTTPS, no accounts, nothing to deploy.

bash
$ viaduct http 8080

  ✓ tunnel live
  https://funny-otter.viaduct.sh
  → http://localhost:8080
  press q to stop
Read the docs →

Python

Open a tunnel from your code

pip install viaduct-sh and open a tunnel with a context manager, no CLI. Async, with a sync version for scripts and notebooks.

demo.py
import viaduct

async with viaduct.tunnel(8080) as t:
    print(t.url)   # https://funny-otter.viaduct.sh
Read the docs →

pytest

A public URL in your tests

The viaduct_tunnel fixture gives a test a real public URL, and tears it down after. Ideal for exercising inbound webhooks (Stripe, GitHub) in CI.

test_webhooks.py
def test_stripe(viaduct_tunnel):
    url = viaduct_tunnel(8000)
    stripe.WebhookEndpoint.create(url=url + "/hook")
    # ... assert your handler ran; tunnel closed automatically
Read the docs →

Node.js

Native in Node

npm install viaduct-sh (or npx viaduct-sh 3000) and open a tunnel with an import. Zero dependencies, built on net/tls.

app.mjs
import { tunnel } from "viaduct-sh";

const t = await tunnel(3000);
console.log(t.url);   // https://funny-otter.viaduct.sh
Node client on GitHub →

Got a workflow you'd want viaduct to slot into? Open an issue.