When dsh web starts it prints one line to the terminal that looks like this:
dsh web: http://127.0.0.1:3080/?token=cp0HyI6s8-uj9B-Meq2Kvmsq1BveDyX5FgAgAD09mP0 dsh web: opening the default browser; pass --no-open to disable
The part after ?token= is not decoration. Opening plain http://127.0.0.1:3080/ returns HTTP 401 with a body saying authentication required / reopen the URL printed by dsh web. That is not a dead port and not a crashed service — it is the browser-trust fence.
curl -sI http://127.0.0.1:3080/. A 401 means the process is alive and simply missing the token. Connection refused means the process really is gone.Steps
- Check the node version against engines first. The source checkout wants
^22.19.0 || >=24.0.0; the 0.2.2 line on npm wants>=24.9.0. Different thresholds. - Start it. A source checkout runs the TS entry and needs tsx preloaded; a global install is just
dsh web. - Copy the whole printed address, token included, into the browser. Do not retype it — the token mixes case and hyphens.
- It counts as working only when the UI opens, you send a message, and a reply comes back.
- Store the token in your own password manager. Never paste it into a public page or a chat log.
Start command for a source checkout (measured on this machine):
node --max-old-space-size=8192 --import tsx/esm apps/cli/src/bin.ts web
Start command after a global install:
dsh web
The token changes
Restart the process and you get a new token; the old URL dies immediately. So 'it opened yesterday and 401s today' is expected, not a broken config. Autostart scripts often pass --no-open, which means no browser window and the URL only lands in the log — look at the last line there.
tail -1 ~/.dsh/logs/dsh-web-autostart.log
The default port is 3080. If something else holds it, startup fails; either free it (netstat -ano | findstr :3080) or pass --port.