Lab

Dev hub

Small tool

Every local dev tool behind one port, in a tabbed shell.

Dashboard/dashboard/
Open items12
Due this week3
Done27
Review board/review/
Open reviews4
Waiting on me2
Merged18
Docs/docs/
Pages38
Drafts2
Broken links0
The shell: one tab per tool, each in a frame on the same origin, with a dot for health that updates every 10 seconds. Mockup with sample data.
$ hub routes --print
# Caddy: copy into the Caddyfile, then reload
hub.example.invalid {
handle /dashboard/* { reverse_proxy localhost:5101 }
handle /review/* { reverse_proxy localhost:5102 }
handle /docs/* { reverse_proxy localhost:5103 }
handle { reverse_proxy localhost:5100 }
}
# Tailscale: run these yourself
tailscale serve --bg --set-path /dashboard http://localhost:5101
tailscale serve --bg --set-path /review http://localhost:5102
printed, not run
The generated commands, printed from the config and never executed. Mockup with sample data.

How it works

Browserone tab Hubone port hub.json Dashboardby path Review boardby path Docsby hostname
  1. One config file lists the tools. Each entry has a name, a local address and a route, by hostname or by path.
  2. The hub serves a tabbed shell on one port. Each tab frames one tool, so I switch between them without remembering addresses.
  3. Edits go through an atomic write API. It writes to a temporary file and renames it, and only accepts loopback and same-site requests.
  4. A poll marks each tool up or down. Every 10 seconds the hub checks each address and the tab dot changes color.
  5. Proxy commands are printed, not run. The hub generates the Caddy and Tailscale serve commands from the config and leaves running them to me.

Built with

Decisions