--- status: accepted (supersedes ADR 0002) --- # A tabbed command center with action chords, not a fixed set of direct keys ADR 0002's one Dashboard with direct keys grew, amendment by amendment, into five full-screen views, single keys that started, stopped or took down the Project, and a footer nobody read; it felt like a list of commands rather than a place to work. The Dashboard is now a command center in the spirit of Zellij: five tabs on `1`–`5` (Overview, Apps, Activity, Catalog, Settings), also cycled with `←`/`→`; `↑`/`↓` move within a list, `tab` moves focus between panes and `[`/`]` switch sub-tabs (App details' logs, setup, info, compose and containers; Settings' Host, Access, Appearance, Backups, Tools and About), so no key means two things. No single key changes an App or the Project: `a` opens the Action menu for the selected App and `A` for the whole Project, the menu lists only the Actions valid now, previews what the highlighted one will do, and runs it only on `enter` (destructive ones need a second `enter`). Only read-only actions keep direct keys: `o` opens the App, `c` picks a credential to copy, `/` searches, `enter` goes into the selected App, `?` shows help: the key reference, except where the focus has a help page of its own (the highlighted Access option, on Settings' Access sub-tab and in Onboarding's Access step), which `?` opens instead, because it is the more specific help, and which `esc` or `?` closes; the bar then lists `? more` instead of `? help`, and the key reference stays one move away. In a text input `?` types. Settings' Access sub-tab lists how the Apps are opened, each option with a plain explanation and a diagram: `↑`/`↓` move the highlight and `enter` takes a ready option as a pending change that `ctrl+s` applies, like the Host sub-tab's; an option not built yet is dimmed and marked coming soon, and `enter` on it only says so. Onboarding uses that Access list with separate focus and selection keys, as described below. Settings' About sub-tab reuses `c` and `s` to open the donation pages (Ko-fi, GitHub Sponsors); they exist only there and on the pre-boot screen and change nothing. The pre-boot screen, which Onboarding's approved Review shows while the first install pulls its images, takes every key, so `?` does nothing there: `enter` skips to Activity, `c` and `s` open the donation pages, `q` quits as on the Dashboard, and no other key does anything. Settings' Backups sub-tab is the one other place an Action starts: `b` backs up the Project after an optional passphrase (a non-empty one is typed twice, because the input shows dots only and an encrypted backup cannot be restored without it, so a typo would make the archive unusable; an empty one asks nothing more) and `enter` on an archive opens a restore preview, which runs only after `enter` is pressed twice; both take every key while open, like the Action menu, and no key deletes an archive. An always-visible bottom bar shows the global keys on the left and the focused pane's keys as chips on the right; there are no Zellij-style modes, because tabs plus a context bar keep the budget small without hidden state. ## Onboarding selection and pacing Welcome, Access and Look distinguish keyboard focus (`>`) from the selected answer (`●`, with a bold label). `↑`/`↓` focus an answer without choosing it; `space` selects it without leaving the step; `enter` continues with the selected answer, not the focused one. New, Home network and Simple are the visible defaults. Look names the symbol sets directly rather than claiming that the person's terminal showed boxes. On What, `space` toggles Apps or every App in a Recipe, `x` remains an alias, and `enter` continues the picked Apps. A Recipe's mark means `✓` all, `◐` some or `○` none of its Apps picked. Homarr starts picked as an App, not as its own Recipe, and its App row permits deliberate opt-out; the first Recipe gets initial focus. The old `homarr-control-plane` identifier remains a CLI compatibility alias. An Access answer is pending only. `space` on Bring your own or an unavailable option explains it without replacing the answer. Continuing Tailscale opens its required hidden key field; choosing Cloudflare defers to the separate publication review after install and grants no publication approval. Text fields, including hidden inputs and the What filter, still accept spaces. Nothing is written before Review approval. Initializing reveals Doctor results, leaves the last result visible briefly, then automatically continues once Host settings are ready and no check fails. Failure stays visible with `r` to recheck. After reaching Welcome, revisiting Initializing does not auto-continue, even after recheck; `enter` continues it. Initializing and Welcome center their content below the step indicator, leaving the header, status line and key hints in place. Doctor centers fixed container bounds, not the current text: its heading and check-title column do not move as results, warnings, hints or completion arrive, including rechecks and focus refreshes. Look previews the selected symbol set immediately, never the merely focused one, and persists it only at approval. Settings Access also exposes Space selection separately from focus. Space keeps the choice pending; Enter confirms it, while Enter without Space retains the legacy focused-choice shortcut. Home network/Easy names still require Ctrl+S. Space on Tailscale or Cloudflare never opens private input or publishes: Enter opens the separate review. The LAN address editor remains text input, with Tab to fill another detected address and Space to type. Onboarding rejects unsupported Easy names address eligibility before approval, without probing or writing from renders, Space or typing. It preserves answers and offers `a` Access and `w` LAN address recovery. The locked service preflight remains authoritative; retaining numbered Addresses is not proof of reachability. Review install failures and Activity failures expose `c` full masked error copy and `e` scrollable inspection, reusing the help-page viewport and clipboard path. The reader owns focus, `esc` closes it and Ctrl+C quits; input and credential-copy scopes stay separate. Known pending request secrets are registered with the event logger before a task runs, and returned errors are masked before display or copy. ## Considered options - **Keep direct keys per Action** (ADR 0002): fastest for experts, but a stray key started, stopped or took down Apps, and every new Action needed a new letter. - **Zellij-style modes** (`ctrl+p` pane mode and so on): powerful, but the mode a person is in is invisible state, and it is the part of Zellij people find hardest. ## Consequences Stack's `1`/`2`/`3` Project controls move into the `A` menu. Starting an Action focuses the Activity tab, and the Overview mirrors it in a small "Now" strip. The keybind audit test checks this ADR instead of ADR 0002.