Files
Codeman/docs/wiki/The-Dashboard.md
T
Codeman maintainer e3dfbf6591 feat(tabs): Tab Layout setting with by case (A) and ledger (B), reversible state order, cleaner tiles (#426)
Tab Grouping becomes Tab Layout (tabArrangement: 'state' | 'case' |
'ledger' | 'classic', default 'state'), the first row of App Settings,
Appearance, Tabs, so the old and the new strip are one choice apart.

- By case (option A): each case's tabs sit in one .tab-cluster box in
  first-appearance order, labelled with the case and its count, coloured
  by a stable hash into the session palette. Membership is
  _mobileOverviewCaseFor(), the home screens' own match. Inside a box with
  company a generated w75-api-gateway reads w75; the -<case> stays in the
  DOM in a .tab-name-case span only .tabs-clusters hides. The incremental
  render path rebuilds only when the cluster structure key changes. The
  rail and the sidebar get a labelled section per case; phones dissolve
  the boxes into the chip row. Drag stays inside one box.
- Ledger (option B): CSS only on .tabs-ledger, desktop header strip: an
  auto-fill column grid of equal cells in mono type with a 3px status
  bar. Its markup is identical to classic's.
- State Order (tabStateOrder: 'urgent-first' | 'urgent-last'): flips the
  by-state groups so needs you can be the bottom row.
- By state: the label column is measured to the widest label on screen
  and the labels are right-aligned in it, instead of a fixed 92px gutter
  that left short labels far from their tabs.
- Tiles: a three-row grid (label, value, bar) with pixel line-heights in
  the bundled JetBrains Mono, 36px like the header. The bar used to lie
  over a fixed 28px tile, and a taller system mono (SF Mono) pushed the
  value into it. The WS tile's grid moved onto an inner .connection-tile
  span because JS writes the indicator's display inline. Compact uses the
  same font and a matched WS size.

Tests: test/tab-clusters.test.ts (new), plus the rename and the reversed
order in test/tab-triage.test.ts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-06 04:08:02 +02:00

20 KiB

The Dashboard

What the interface is telling you, and which parts of it are hidden until you turn them on.

Most of Codeman's UI is opt-in. A stock install shows a deliberately small header, and a feature you read about here may simply not be on screen yet. Where that is the case, this page says so and names the setting.

Codeman dashboard

Layout

Region What lives there
Header, left The "C" logo (goes home) and the session list, unless you moved it to the sidebar.
Header, right Status chips and panel buttons, most of them off by default.
Center The terminal for the active session, or the home screen when nothing is selected.
Bottom toolbar Run, Stop, Run Shell, the case picker, and the instance counters.
Overlays Panels and modals: Respawn, Cron, Subagents, File Viewer, Settings.

Session list layout

The session list lives in the header as a horizontal strip by default. With a lot of sessions open that strip stops being scannable, so App Settings → Appearance → Tabs → Session List Layout can move it into a vertical sidebar on the left instead, and Tab Orientation can turn the strip itself into a vertical rail.

Layout Behaviour
Header tab strip The default. On desktop it is one row per state by default (see Tab layouts); it scrolls sideways on a phone.
Left sidebar A vertical list with a filter box and a live session count. Alt+B collapses it to a narrow rail that keeps the status dots and task badges visible. On a phone it is an off-canvas drawer rather than a docked rail. A detailed variant adds the home screen's per-session line (created 3d ago · working 12m) and a status pill.
Vertical rail The strip turned vertical beside the terminal, resizable, with detailed rows by default. Vertical Rail Order sorts it by activity (blocked on you first, then longest running, then most recently quiet), the same order as the home screens; pick Manual to get your own order and drag-reordering back. Tab groups: pick Move to new group from a row's ⋯ menu (or Shift+F10 on it) to make the first one; a group header's menu (right-click, Shift+F10 or its ⋯ glyph) renames it (also F2), reorders or deletes it, rows move between groups from their own menu or by dragging with a mouse or pen, and a collapsed group stays collapsed on that device. Desktop and tablet only.

It is the same list either way, just re-hosted: tab order, drag-to-reorder, the Alt+1 to Alt+9 numbers and every status colour below behave identically in both. The setting is per device, so a sidebar on your desktop does not force one onto your phone.

Tab layouts

App Settings → Appearance → Tabs → Tab Layout picks how the tabs are arranged. Per device.

Layout What it does
By state (default) Groups the tabs by what each session needs from you (below).
By case One box per case, labelled with the case and its tab count. Inside a box, w75-api-gateway reads just w75. A case with one tab gets a box with a colour swatch.
Ledger The same list on an aligned column grid: equal cells, monospace names, a coloured bar on the left of each cell instead of the dot (yellow waiting, red needs you). Desktop header only.
Classic The single list in tab order, as before.

By state groups the tabs like this, most urgent on top:

Group Who is in it
Needs you Red: a question or permission prompt is blocking the agent. A failed session too.
Waiting Yellow: the agent finished its turn and is waiting for your next prompt.
Working A turn is running.
Idle Everything quiet, including ended sessions, agents that exited inside their pane, and web tabs.

In the header each group is a row with its name and count on the left; a group with more tabs than fit on one line continues under its own tabs. State Order → Needs you at the bottom turns the rows the other way up, so the needs-you row sits right above the terminal. Empty groups are not shown. These are the same states the phone overview and the desktop home rail use, and tabs move between groups on their own as their state changes.

Both groupings also apply to the vertical rail and the left sidebar, as labelled sections. Inside a group or a box tabs keep your tab order (on a rail sorted By activity, the activity order), and the Alt+1 to Alt+9 numbers never change. Dragging reorders tabs within a group or box. On a phone the strip stays a single scrolling row in group order, without labels or boxes. If you have named tab groups in the vertical rail, those take precedence there.

Session tabs

One tab per session, in your order, and that order syncs across your devices.

Status is carried by the dot and the tab's own styling:

Look Meaning
Green dot Alive, not currently working.
Pulsing green dot with a ring Working on a turn.
Yellow tab, blinking The agent is waiting for input from you.
Red tab, blinking A question or permission prompt is blocking the session.
No dot The session is not running.
Muted grey dot plus an exited (137) badge The agent inside the pane has exited, with that exit code (or exited (signal 9)). A bare exited means tmux saw the pane die but did not report how, which is not the same as a clean exited (0). Detailed sidebar and rail rows read exited in their pill.

Tab alerts

The alert states are steady colour with a pulse layered on top, not a blink between the alert colour and nothing, so a tab that needs you looks like it needs you at every point in the cycle. They survive a page reload: the state is re-seeded from the server on load, so reloading while a permission prompt is blocking does not lose the red tab.

Navigation:

Action Keys
Jump to tab N Alt+1 to Alt+9 (the number on the tab)
Next / previous Ctrl+Tab, Alt+[, Alt+]
Move the active tab Ctrl+Shift+{, Ctrl+Shift+}
Close Ctrl+W
Find any session, open or past Ctrl+K (also Cmd+K and Alt+K)

Tabs can also be dragged to reorder.

Automatic session names

Off by default. Turn on Auto-name Sessions (App Settings → Appearance → Tabs; synced across devices) and a tab that still carries its generated name, such as w3-myapp, takes a title from the first real prompt you submit, keeping the prefix: w3-myapp: fix the login redirect. The strip shows the title and keeps the prefix in the tooltip, and the next session in that case still counts up to w4-myapp. It happens once per session, only for prompts you type or send through the input API (never a Ralph, respawn, cron or approval answer), and never for shells. Slash commands such as /clear do not become titles; the next prompt gets its turn. A name you set yourself, before or after, is never touched. The title is derived locally from the prompt's first sentence; no text leaves the machine.

On phones the strip scrolls horizontally instead of wrapping, and the active tab is always scrolled into view. It is not reordered to the front, so the Alt+N numbering stays stable.

Lineage arcs

When one session spawns another (an agent starting a worker through the API), Codeman draws a coloured arc under the strip connecting parent to child, with one colour per child. It is how a fan-out of eight workers stays readable.

Desktop only, and on by default. Turn it off in App Settings → Appearance. Arcs are skipped for tabs scrolled out of the strip.

Header controls

The right side of the header. Almost all of these are off until you enable them in App Settings → Header & Panels.

Control Default What it does
Connection dot Always on SSE connection health. Green is connected.
Font size - / + Always on Ctrl + / Ctrl - do the same.
CPU / MEM On Server resource use. Drawn as tiles by default; see Header Stats Style below.
File Viewer On Toggles the file browser panel.
Settings gear Always on App Settings.
Plan usage chip On, desktop only Live Claude subscription usage. Claude-only, and needs its telemetry exporter, which the same setting installs.
Session Manager Off The full session list, live and historical.
Approvals bell Off Cross-session queue of prompts waiting on a human. Appears only when the count is above zero. Never shown on phones.
Read My Mind 🧠 Off Predicts your next prompt for this case. Claude-only.
Attachments Off Registered external files.
Away Digest Off What happened while you were gone.
Last Response Off Readable view of the agent's last answer, useful on phones.
Ultracode / Workflow Off Live workflow-run agents.
Notifications Off Notification history and settings.
Lifecycle Log Off Session start, exit, and kill audit trail.
Cron ⏰ Off Scheduled jobs.
Multi-monitor Off, macOS Opens a window spanning every display.
Split Off, desktop only View a second session beside the active one, with a draggable divider.
Tunnel indicator When a tunnel runs Cloudflare tunnel status.
Admin panel Multi-user only User administration.

Header Stats Style

The connection readout, CPU, MEM and the plan usage windows can be drawn three ways (App Settings → Header & Panels → Header Stats Style, per device, desktop only):

Style Look
Tiles The default. One small tile each (WS live, CPU 22%, MEM 14.4G, 5H 28%, 7D 35%): label over value, a thin bar underneath, no icons.
Compact One pill with WS · CPU · MEM and a tiny sparkline of the last few samples, then a pill with a ring per plan window. Hands the tabs back the most room.
As before The bars and the 5H · 7D chip, exactly as they were.

Hiding System Stats or Plan Usage still hides them in every style.

New header controls never appear on phones. Phone layout is deliberately minimal and is covered in Mobile Guide.

Bottom bar

Git status sits at the right of the bottom bar and shows the active session's uncommitted and unpushed work. It is off by default and per device: turn it on in App Settings → Header & Panels → Bottom bar. Click it for the Git window. See Working With Files.

Connection state

The dot in the header is the quick read. Two louder surfaces exist because a cached page with no server behind it used to look identical to a page with no sessions:

  • A full-screen overlay when the page has never loaded server state. There is nothing behind it worth preserving.
  • A banner when the connection drops after state had loaded, so your scrollback stays readable.

Both wait about 2.5 seconds before appearing, so a deploy that restarts the server does not flash a warning at you every time. If the browser reports itself offline, the grace period is skipped.

There is also a watchdog for the case where the connection stops delivering without erroring. If the server's heartbeat stops arriving, Codeman reconnects on its own rather than sitting on a green dot showing frozen data.

The terminal

A real terminal: xterm.js in the browser, a real PTY on the server, tmux in between. Full TUIs render correctly.

Worth knowing:

  • Scrollback. Agent/TUI sessions pull their entire tmux scrollback on first open. Shell sessions open from a bounded recent tail so a large transcript cannot stall tab switching. Scrolling to the top of a Shell pane pulls the most recent 1 MiB of its tmux history; press Load full history to pull the rest explicitly. Automatic output recovery stays within the bounded browser buffer.
  • Wheel and touch scrolling are forwarded into Claude's own transcript when a recent Claude runs fullscreen (CLAUDE_CODE_NO_FLICKER=1, or "tui": "fullscreen" in ~/.claude/settings.json), so the wheel scrolls the conversation rather than the terminal. Claude's default inline view keeps its history in the terminal and scrolls locally. Shift+Wheel is always local scrollback. Other CLIs scroll locally.
  • Selection copy. Ctrl+C copies when text is selected and interrupts when it is not. Ctrl+Shift+C always copies.
  • Selecting where the CLI owns the mouse. Shift+drag starts a selection even in a pane whose mouse events are forwarded to the CLI, and right-click copies the selection (with nothing selected the native menu is left alone). Auto Copy Selection in App Settings copies the moment you release.
  • Zero-lag input. On touch devices, keystrokes paint locally before the round trip. See Input And Voice.
  • Renderer. WebGL by default, with a watchdog that falls back to DOM rendering if the GPU stalls. ?nowebgl forces DOM rendering for one page load.

The home screen

With no session selected you get the welcome screen: run buttons for the CLIs Codeman found, a QR code when a password is set, cross-session search, and Resume Conversation, which lists past sessions including Claude conversations started outside Codeman entirely.

Two extras depending on the device:

  • Desktop, wide windows: your open tabs appear as a rail docked to the left edge, in overview order (blocked on you first, then longest running, then most recently quiet), with created and state-duration stamps. It needs at least 1180px of width; below that it is hidden so it cannot overlap the search panel.
  • Phones: tapping the "C" logo gives a session overview instead: NEEDS YOU first, then current sessions, then past ones. On by default.

Panels

Panel Opened from Covered in
Respawn Session Options Keeping Agents Running
Ralph Session Options Autonomous Loops
Orchestrator Toolbar Autonomous Loops
Cron Header ⏰ (opt-in) Cron Jobs
Subagents Automatic while agents run Watching Agents Work
Ultracode Header (opt-in) Watching Agents Work
File Viewer Header Working With Files
Attachments Header (opt-in) Working With Files
Approvals Header bell (opt-in) Notifications And Approvals
App Settings Header gear Settings Reference

Session-specific configuration lives in Session Options, reachable from the tab. App Settings is global; Session Options is per session.

Search and the session palette

Ctrl+K opens the session palette: every session, live or historical, filtered as you type. Picking a past one resumes its conversation.

The search box on the home screen is wider in scope. It federates over session metadata, run-summary events, and attachment history, filtered by type, case, status, and date. It does substring matching over data already in memory, with no regex and no filesystem reads, so it is fast and cannot be turned into a traversal.

Appearance

App Settings → Appearance carries the theme skins, including light ones. The choice is applied before the first paint, so there is no flash of the wrong theme on load. Terminal font family and weight are per device too: a normal and a bold weight, each from 100 to 900, and the bundled JetBrains Mono renders every step.

The same section has the entrance animations for tabs, terminals, agent windows, and lineage lines. All of them default to the legacy no-animation behaviour, so an untouched install animates nothing.