Appearance
Regenerate the Launchpad Page
The Launchpad is a single static HTML page listing every managed project with its dev / docs / prod / GitHub links and port band — built to be the browser's default localhost site. The page is derived state with a single owner (the links index): it is never hand-edited, only regenerated.
Schema and derivation rules live in the Launchpad Links Index reference. Always-on serving is #1245; liveness badges are #1246.
TL;DR
bash
node ~/.claude/scripts/launchpad/render-page.js --out ~/.claude/launchpad/index.htmlThat one command derives the links index from declared state (ports ledger, projects.json, each project's dev.json / wrangler config / git remote) and renders the page. Re-running is always safe: unchanged inputs produce a byte-identical page.
When to regenerate
Whenever declared state changes — a project gains a port band, a dev.json, a wrangler route, or a new repo remote:
- after
cdiprovisions a new project (port band allocated) - after adding or editing a project's
dev.json - after a wrangler route / custom domain change
- after registering a project in
~/.claude/projects.json
Two-step variant (inspect the index first)
bash
node ~/.claude/scripts/launchpad/links-index.js --out /tmp/links.json # 1. generate
jq '.projects[] | select(.name=="tct")' /tmp/links.json # 2. inspect
node ~/.claude/scripts/launchpad/render-page.js --index /tmp/links.json --out ~/.claude/launchpad/index.htmlrender-page.js with --index renders a prebuilt index verbatim — useful for diffing what changed before republishing, or for rendering a snapshot from another machine.
Verify
bash
open ~/.claude/launchpad/index.html # macOS; or use the always-on server (runbooks/launchpad-serving.md)
make test-launchpad-links test-launchpad-pageIn the page: / focuses the filter, typing narrows by project name or stack term, Enter opens the first match's dev server, Escape clears. Light/dark follows the browser theme.
Dev/docs pills carry a liveness dot — filled = up, red = down, hollow = unknown — painted per page load from the server's /liveness.json probe. Opened as a plain file (no server), the dots simply stay hollow; see the probe semantics.
Rules
- Never edit the generated HTML. Fix the declared source (dev.json, wrangler config, ports ledger, projects.json) and regenerate.
- Nothing is guessed. A project missing a prod URL or docs link means no route / docs block is declared — declare it, then regenerate.
- The renderer adds no state of its own: no timestamps, no counters. Diffs of the output always reflect a diff of declared inputs.