0064: Hubs in the rail, features to turn off

On this page

Status: accepted

Context

The rail listed every screen: by 0.16 that was fifteen buttons plus Settings, and Tasks, Notes, Meetings and Chat would have made it twenty. It scrolled on a laptop, and each new feature made finding the others slower. Not everyone uses everything either: someone who only serves sites still saw Pair, Webhooks and Backups, and their background work (a webhook's tunnel, the nightly backup) ran whether they wanted it or not.

Decision

  • Hubs. The rail holds Home, Sites, Debug, Work, Pair and Machine, then Settings at the bottom (src/shell/hubs.ts).
    • Debug: Requests, Monitor, Dumps, Logs, Mail, Webhooks.
    • Work: Tasks, Notes, Meetings, Chat.
    • Pair has its own place, with who's in the call on its badge: a call isn't a document, and it's the one thing in the rail that's live with other people. (It started under Work; moved before release.)
    • Machine: Services, Runtimes, Backups, Tools.
    • A hub with more than one page lists them in a column beside the rail (HubNav), with the same look as a site's pages. A hub opens on the page last used there, remembered in the window's local storage. A hub's badge adds up what waits in its pages that show.
    • New features join a hub instead of the rail.
  • Settings follow the rail. Its sections are grouped the same way, general first, then Sites, Debug, Work, Pair and Machine, then Remove and About, with a hairline between groups and no group headings.
  • The column folds. Collapse at its foot, or ⌘\ (Ctrl+\ on Windows), folds the hub's or the site's column to its icons, with names as tooltips; the choice is kept in local storage. It doesn't animate: the motion list in CLAUDE.md stays as it is.
  • Settings › Features. [features] in config.toml has debug, webhooks, pair, tasks (tasks and notes), chat and backups, all on by default, and chosen, set once first run's What will you use Short Leash for? is answered (POST /v1/features).
    • Off hides the feature's pages from the rail and stops its background work: turning webhooks off closes their tunnels without changing each webhook's own setting, and turning them on again starts the ones that were enabled; the nightly backup is skipped while backups are off. The tray hides Pair's start row while Pair is off; a call that's still going stays.
    • Serving sites, services and runtimes is always on. Dictation and meeting notes keep their own switches ([ai], ADRs 0057 and 0059), shown in the same list, because turning them on needs permissions and a model.
    • First run starts webhooks, dictation and meeting notes off and the rest on. Existing installs keep everything on, since chosen is false and nothing changes until someone turns a feature off.
    • Pages stay reachable by link and by ⌘K while their feature is off: off hides, it doesn't lock.

Consequences

  • The rail fits on any window height and doesn't grow with new features. Reaching a page in Debug, Work or Machine takes two clicks the first time, and one after that, since a hub opens where you left it.
  • The hub column takes 228 px from Debug, Work and Machine screens. Screens with a list beside a detail had to fit in less room (Webhooks' rows did not, and were loosened); folding the column gives the room back.
  • A feature that's off still has its data: turning it back on shows everything as it was. Nothing is deleted by turning a feature off.
  • The canvas's boards draw the same rail and column, and the canvas is organized in pages by hub.