The dashboard
The dashboard runs fullscreen in the terminal's alternate buffer, adapts its layout to the window (a third pane appears at 110 columns and up), and restores the terminal exactly on exit. It needs a real TTY — not piped, not backgrounded. Flags: CLI reference.
junco dashboard
Two modes
Swap modes any time with m / Shift+Tab, or click the header's tab pair.
- GITHUB — an interactive UI over the GitHub loop: watched repos, their trigger-labeled issues, and junco-authored PRs.
- LOCAL — the machine-local runtime under either mode: the local queue, the GitHub outbox backlog, watched repos on disk, ticket worktrees, and the daemon itself.
With github.enabled = false the dashboard opens into LOCAL — there is nothing for GITHUB mode to show. A shared header carries a live daemon pulse in both modes: issues awaiting review, PRs needing attention, the processed record, daemon up/down, queue depth, and unpushed outbox ops.
The panes and keys
GITHUB mode has three zones: the repos pane (pane 1, with the queue card at top), the issues pane (pane 2, the selected repo's trigger-labeled issues with state badges), and the PR monitor (pane 3, wide terminals only, the selected repo's junco-authored PRs). A persistent shortcut bar shows the keys for wherever focus is.
1/2/3— jump to pane (pane 3 in wide mode only)- arrow keys (or
j/k) — move selection;h/lortab— switch panes;g/G— first/last enter— fullscreen detail overlay: issue body plus posted plan comment, or a PR's fuller cardd— dispatch (adds the trigger label);D— dispatch as ask: read-only Q&A, no plan, no PRa— approve the posted plan (available once a plan is ready)R— re-plan or re-cycle, per the issue's current state/— filter issues (enterapplies,escclears)w— add a repo to the watchlist;x— unwatch (watchlist entries only)i— jump to the issues pane (alias of2);[/]— scroll detail, queue, and command-output viewsc— draft an analysis comment on the selected issue; parked for review, never posted directlys/S— assess the selected repo, or the selected issue when pane 2 is focused (Sadds--auto-plan); findings park for reviewv— review view: pending assess finding batches and analyze comment draftst— queue view;p— PRs view, cross-repo and attention-first;o— open the selection in the browserr— run the refresh cycle now,— config editor;:— command palette;?— full key reference;q— quit
LOCAL mode replaces the panes with a section rail (Queue, Outbox, Repos, Worktrees, Daemon) and a body:
- arrow keys (
j/k) — move the section on the rail or the cursor in the body;l/enterenters the body,h/escreturns;[/]scroll the daemon panel R— requeue a failed ticketx— remove under the cursor: delete a queued ticket, prune a stale worktree, or unwatch a repo (confirmed when destructive)f— flush the GitHub outbox;o— open a repo's origin/fork in the browserX— restart the daemon (confirmed; in-flight tickets soft-abort, committed work salvaged)r— full local refresh;g/G— first/last
Rows the daemon owns — running queue entries, live worktrees — render but are never selectable; the cursor skips them.
gh auth. Dispatch, approve, and re-plan run nothing themselves; they move labels the daemon's sweep acts on — see the GitHub loop.The command palette
: opens the palette: type to filter, enter to run. Commands that take arguments — list, retry, outbox, submit, logs, service — get an args field first. Each run spawns the actual junco CLI as a subprocess against the dashboard's own config — no reimplementation, no drift, no shell in the middle. The command's real output appears in a scrollable pane with its exit code; r re-runs, esc returns. logs runs bounded (-n 200); init, start, and dashboard are greyed out with the reason they can't run here (use restart for the daemon). LOCAL-mode mutations — requeue, delete, flush, restart, prune — use the same subprocess model.
Mouse support
In GITHUB mode the mouse works throughout: clicking a row focuses its pane and selects it; clicking the already-selected row opens it, exactly like enter. Clicking blank pane space focuses the pane without moving the selection. The wheel acts on whatever pane is under the cursor. Detail views carry a clickable owner/repo#n line (cmd+click in OSC 8 terminals, or o) to open the item on GitHub. Hold shift while dragging to select terminal text. In LOCAL mode only the header tab is clickable; local rows are keyboard-first in v1.
The first-run walkthrough
With no config yet, bare junco or junco dashboard opens a guided setup in chapters: workspace, model setup (an inference endpoint with live discovery, or a hosted provider from the built-in catalog), repo containment, the GitHub bridge, an Account chapter for the dedicated bot identity, and the recommended extras. It then creates the queue, verifies the result with a flight check, and lands in the dashboard. Re-run it anytime from the palette ("setup") — it only writes what changes. The headless equivalent is junco config init; the full key reference is Configuration.
Watching repos
w prompts for owner/repo or a github.com URL; an empty clone path clones into <dataDir>/clones/watched/<owner>/<repo>. It validates the clone's origin, confirms reachability via gh, and creates the trigger label if missing. Entries live in <dataDir>/watchlist.json, separate from github.repos in config.json; the daemon's bridge sweep re-reads the file every sweep, so watchlist changes apply without a restart. Where a repo appears in both, the config entry wins — config-sourced repos carry a (cfg) marker, are read-only in the dashboard, and x reports where they're defined instead of removing them.