One shell command and your
localhost:3000is a real HTTPS URL anyone can visit.
Level: 1 · Reading time: 5 min
asd installed: curl -fsSL https://asd.host/install.sh | bash (full install instructions on the landing page).asd auth status returns ✓ Authenticated. If it doesn't: asd login.python3 -m http.server 3000.Already know this rung? Skip to Level 2 — your first service where you'll give the service a stable subdomain, a real upstream URL, and put it in version control.
We're going to take any process bound to localhost:3000 and expose
it as a public HTTPS URL. No asd.yaml, no net.manifest.yaml, no
edits to anything — one command. This is the shortest path from
"running on my laptop" to "anyone with the URL can hit it".
The trade-off: the URL only lives as long as the asd expose process
runs. For something you want to keep up across restarts, you'll graduate
to Level 2 and write a manifest.
Open two terminals.
Terminal A — the thing you want to share:
mkdir -p /tmp/hello && cd /tmp/hello
echo '<h1>Hello, world.</h1>' > index.html
python3 -m http.server 3000
Terminal B — expose it:
asd expose 3000
You'll see something like:
✓ Exposed http://localhost:3000 → https://3000-xyz1.eu2.tn.example.com
Leave both terminals running. The expose process holds the tunnel up;
killing it (Ctrl-C) takes the URL down.
Open the URL asd printed in a browser — on your phone, on a
different machine, anywhere with internet — and you'll see "Hello,
world."
Or verify from the command line:
$ curl -s https://3000-xyz1.eu2.tn.example.com/ | head -1
<h1>Hello, world.</h1>
Sanity check from the asd side:
$ asd expose list
NAME PORT URL STATUS
3000 3000 https://3000-xyz1.eu2.tn.example.com ✅ healthy
asd expose 3000 does three things in one shot:
3000) pointing at 127.0.0.1:3000.<subdomain>-<your-client-id>.<tunnel-host> and forwards it downasd expose list, asd services, and asd urls know about it.The HTTPS termination happens at the tunnel server; Caddy on your
machine sees plain HTTP. That's why every route uses
X-Forwarded-Proto: "https" — see reference/net-manifest § Rules for the gory detail.
When you Ctrl-C the expose process, the registry entry and Caddy
route are torn down. No leftover state — try asd expose list after
exiting and it's gone.
net.manifest.yaml so it survives restarts and lives in version control.cookbook/tunnel-a-dev-server.asd expose running until the call ends.