Skip to main content

Toolbar, Dock and Windows

The application chrome around the panel grid: toolbar customization and groups, the searchable launcher, overflow behavior, the dock and how panels move in and out of it, and what happens when you open a second window.

Reviewed

Toolbar

The toolbar has three fixed anchors that never move and never overflow: the sidebar toggle on the far left, and the assistant toggle and portal toggle on the far right. The project switcher pill sits in the center. Everything else is a left group and a right group filling the space between, and both groups are yours to arrange.

AnchorShortcutWhat it does
Sidebar toggleCommand-B Control-B Control-B Shows or hides the worktree sidebar.
Assistant toggleCommand-L Control-L Control-L Opens the Daintree Assistant.
Portal toggleCommand-\ Control-\ Control-\ Shows or hides the Portal.

Focus Mode is a separate action on Command-K, then Command-F Control-K, then Control-F Control-K, then Control-F . It hides the sidebar and the assistant, where Command-B Control-B Control-B only hides the sidebar.

The launcher

The launcher is the + button at the head of the left group, and it is the one searchable surface for starting anything. It replaced the separate agent tray and panel tray that used to live on the toolbar, along with the dock's own +. The same component serves both positions with the same inventory: only the trigger and the direction it opens differ.

Open it and you get a search field ("Search agents, panels, and recipes") over rows grouped into named bands:

BandWhat it holds
Recently launchedUp to three of your most recent launches, so the common case is one keystroke away. Absent until you have launched something.
Pinned + OtherAgents, split by whether you have pinned them to the toolbar. With nothing pinned the split would say nothing, so the two collapse into one Launch agent band instead. See Agents.
Open in dock / Open in gridPanel kinds, split by where selecting one actually lands the panel. When every kind in the list shares one destination the split is noise, so they collapse into a single Launch panel band.
Launch recipeSaved recipes, plus a Create a recipe row when you have none.
Needs setupAgents Daintree can see but that are not installed or configured yet, each with the reason inline.
PresetsAn agent's named presets, expanded inline as sibling rows.

Type a query and the bands collapse into a single ranked Search results list, capped at 30. With an empty query the browse list renders in full: the point of browsing is to see the whole inventory.

Four things happen on the rows themselves:

  • Alt+P pins the selected row to the toolbar, or unpins it if it is already there. It has to be a modified key because the field is a type-ahead search. A pinned agent or panel gets its own toolbar button; unpinning puts it back to being "listed in the launcher".
  • A pencil captures a keyboard shortcut inline. Press it on an agent row, then press the combination you want, and that agent's launch action is bound to it without a trip to Settings.
  • An agent with something running shows a state pip in its own state color, so you can see at a glance whether launching would be your first Codex session or your fourth.
  • A newly detected agent raises a "New" badge. Install a CLI and the launcher tells you it found it, rather than waiting for you to go looking.

An agent with presets expands with ArrowRight (at the end of the query) and collapses with ArrowLeft. Preset rows appear as siblings under the agent, grouped by where they came from (CCR routes, project-shared, custom) with a synthetic Default choice that launches the agent with no preset at all.

Note

On a fresh profile the toolbar ships with just Launcher, Terminal and Browse files on the left. Agent buttons are no longer defaults: an unpinned agent means "listed in the launcher", not "hidden". A profile created before this change keeps every agent button it already had, which is why two machines can show different toolbars.

The launcher: one searchable inventory of agents, panels and recipes, pinned ones first

What else is on the toolbar

The rest of the row is a per-profile inventory rather than a fixed set, so this is what each button is rather than a claim about what you will see:

ButtonWhat it doesWhen it renders
TerminalOpens a new terminal panel.Always
Browse filesOpens the File Browser for the active worktree, or for the project or scratch root when no worktree is selected (Option-Command-F Control-Alt-F Control-Alt-F ).Always; disabled with no workspace open
BrowserOpens a browser panel.Always
Dev previewStarts the dev server and opens a Dev Preview.Placeholder until a project is open
Agent buttonsOne-click launch for a specific agent.Only when pinned and the agent is available
Plugin trayA dropdown collecting every plugin's toolbar contributions, grouped by plugin.Only when a plugin contributes a button
Voice recordingThe dictation indicator. See Voice Input.Occupies a fixed slot; visible only while recording
Repository statsCommits, issues and pull requests for the project. See Code Forge.Only for a git-backed project
NotificationsNotification history dropdown.Only when notifications are enabled
Copy contextOpens the copy-context recents dropdown. See CopyTree.Always; disabled with no active worktree
Command paletteOpens the action palette (Shift-Command-P Control-Shift-P Control-Shift-P ).Always
Resume sessionBrowses closed agent sessions. See Session Management.Always
SettingsOpens Settings (Command-, Control-, Control-, ).Always
ProblemsOpens the Problems panel.Only with Developer Tools enabled

Repository stats renders as a three-segment pill (commits, issues, pull requests) when a forge provider is resolved, and collapses to commits only when there is none, since a commit count is local git data and needs no provider. A workspace with no repository gets a same-sized placeholder rather than an empty gap, which also keeps its polling from ever starting.

Copy context is a dropdown, not a one-shot button. It opens on a primary Copy full context action with your five most recent copies underneath, each showing file count, size and when it last ran. History is per project. When a copy finishes, the button's own tooltip reports it in place rather than firing a toast.

Groups and dividers

Every toolbar button declares a group (launcher, agents, panels, utilities) and buttons are partitioned into that order at render time, keeping your relative order inside each group. A divider is drawn wherever the group changes, so on a normal layout the left side reads launcher, divider, agents, divider, panels.

Dividers count only visible buttons. A button evicted into the overflow leaves no divider behind, and when a whole group overflows the boundary collapses to a single divider between the groups that remain. That is the difference between a separator that marks a real boundary and one that lands wherever the last drag left it.

Group dividers mark real boundaries: launcher, agents, panels

Overflow

Every button has a priority tier from 1 to 5. When the window narrows, tier 5 goes into the ... overflow dropdown first and tier 1 never overflows at all. Widen the window and they come back; a hysteresis buffer keeps them from flickering at boundary widths.

TierButtons
1 (never overflows)Sidebar toggle, assistant toggle, portal toggle, repository stats, voice recording
2Launcher, plugin tray, every agent button
3Terminal, browse files, browser, dev preview
4Command palette, resume session
5 (overflows first)Settings, notifications, copy context, problems

The launcher sits at tier 2, ahead of the individual panel buttons at tier 3, deliberately: on a fresh profile it is the only toolbar route to the agents, so evicting it before them would strand everything whose own button is not there to fall back on.

Two buttons rewrite themselves inside the overflow menu rather than becoming a row that opens nothing. Repository stats splits into Issues, Pull Requests and Commits entries under the forge provider's name, each with its count, or just Commits under "Git" when no provider is resolved. The plugin tray inlines its grouped contributions directly, since an unpinned plugin button has no other toolbar route.

The project switcher pill never overflows, but it does adapt: a scratch workspace or a folder opened without git shows no branch chip at all, while a project whose branch has not resolved yet (a detached HEAD, or a view that painted before the project bound) keeps the chip's width as an invisible placeholder rather than letting the pill jump.

Pinning, unpinning, and plugin buttons

Right-click any toolbar button, built-in or plugin-contributed, for Pin to toolbar / Unpin from toolbar and Customize toolbar…. The same pin state is what Alt+P in the launcher writes, and what Settings edits: three surfaces onto one preference.

Plugin buttons collect under the plugin tray, grouped by their owning plugin and sorted by the manifest's declared priority. Pin one out of the tray and it becomes its own toolbar button. See Plugin System.

Customizing the toolbar

Open Settings > Toolbar for the full editor. The left-side and right-side groups each get their own list.

  • Reorder by dragging within a list. Settings shows the grouped projection, so a drag lands relative to the button's own group peers.
  • Show or hide with the checkbox on each row. Hidden buttons appear dimmed and cannot be dragged until you re-enable them.
  • The three fixed anchors do not appear in the lists.
  • Reset toolbar, at the bottom, restores the factory order and visibility.

Preferences persist across restarts. New buttons added in a future release are merged into your layout at their default position, leaving your order intact.

Launcher palette settings

The Launcher palette section on the same tab has two settings:

  • Always show dev server in launcher keeps the dev server row present even when no dev command is configured in project settings.
  • Default selection picks which row is highlighted when the palette opens: None (first available), Terminal, any launchable agent, Browser, or Dev Preview. The agent list is generated from the roster rather than hard-coded, so an agent you install shows up here.

Project switcher pill

The pill in the center shows the current project name and branch. Click it for the project switcher; right-click it for project-level actions:

  • Pin project / Unpin project: pins the project to the top of the switcher.
  • Copy path: the absolute project path.
  • Project settings: opens the project-scoped settings tab.
  • Stop all agents: ends every running agent across every worktree in the project. Shown only when at least one is running.
  • Close project: closes it in the current window.

Picking the project you are already in from the switcher closes the palette and does nothing else. Nothing reloads, because nothing needs to.

Dock

The dock is a bar along the bottom holding panels you have moved out of the grid. Docking does not close anything: the session keeps running, and you can preview or restore it whenever. The bar appears once at least one panel is docked, and shows the panels for the active worktree. Its leading + is the same launcher the toolbar carries.

Not every kind can be docked. Terminal, Browser and File Viewer can; Dev Preview, Review, File Browser and Diff Viewer opt out, because none of them has a meaningful compact form. See Three Presentations.

Dock pills

Each docked panel is a compact pill carrying its icon in the agent's brand color, a truncated title, and optionally the current command or activity in a monospace span. A state icon (a spinner while an agent is working) sits alongside. Idle and completed panels render at reduced opacity so the live ones stand out.

ActionBehavior
Single-clickOpens a floating popover preview above the pill
Double-clickMoves the panel back to the grid
DragReorders pills within the dock

Popover preview

The popover is a live, resizable view of the panel: you get full access to it while it stays docked. Restore it to the grid with the Restore button in the popover header or by double-clicking the panel header inside it. Escape or a click outside closes the popover without restoring.

The dock: panel pills on the left, action containers on the right

Moving panels to and from the dock

Drag a panel header into the dock bar, use the dock button in the panel header, or use the keyboard. Option-Shift-Command-D Control-Alt-Shift-D Control-Alt-Shift-D sends the focused panel to the dock and Option-Shift-Command-G Control-Alt-Shift-G Control-Alt-Shift-G brings it back; Option-Command-M Control-Alt-M Control-Alt-M toggles it and moves keyboard focus onto the resulting pill, from which Enter or Space opens the popover. The full list, including the chords that act on every panel at once, is on Keyboard Shortcuts.

While a drag hovers the dock, the bar lights up with a drop-armed ring and the cursor switches to a copy cursor, or a no-drop cursor over anything that cannot take the panel. When the dock is empty and you start dragging, a ghost Trash pill appears at the right end so you can discard a panel in one motion. It disappears the moment the drag ends.

Keyboard navigation

Control-Tab Control-Tab Control-Tab and Control-Shift-Tab Control-Shift-Tab Control-Shift-Tab cycle every panel in the active worktree, grid panels first and dock panels after. When the cycle reaches a docked panel its popover opens automatically, so you can see the content without leaving the keyboard.

The dock bar itself is a single tab stop. Once focused, ArrowLeft / ArrowRight move between pills, Home / End jump to the ends, and Enter or Space activates the focused pill. If the dock overflows horizontally the focused chip scrolls into view. While a pill is being dragged the drag handler owns the arrow keys, so they move the pill rather than the focus.

Tip
Shift-Command-/ Control-Shift-/ Control-Shift-/ jumps straight to the next docked agent that is waiting on you. With a row of docked agents running in parallel, that is usually the one you actually want.

Action containers

Set apart on the right of the dock bar are four containers, each a grouped destination rather than another pill:

  • Background: panels you deliberately backgrounded. Click for the list and restore individually.
  • Waiting: panels whose agent is blocked on you, collected so you can clear them in one pass.
  • Errors: panels whose agent session errored, so failures triage in one place instead of hiding among the rest.
  • Trash: soft-closed panels awaiting permanent removal, each with a Restore action, listed most-recently-trashed first.

In compact density these show an icon and a count badge; in normal and comfortable they show a full label like "Background (3)".

Dock density

Density controls the height and spacing of dock pills. Set it in Settings > Appearance > App under Dock Density, or right-click empty dock space and pick Dock density: the submenu carries a radio mark on the current value and writes the same setting.

OptionDescription
CompactSmaller items, tighter spacing, icon-only action containers
Normal (default)The standard dock
ComfortableLarger items, more spacing

The change applies immediately; no restart.

Window behavior

Cold-start animation

On launch, Daintree swaps its loading skeleton for the live workspace in one coordinated fade rather than piecemeal pop-in. The toolbar, sidebar, grid and dock settle together. On reduced-motion systems the animation is skipped and the workspace simply appears.

macOS

Daintree uses a hidden inset title bar on macOS: the traffic lights are inset and content runs to the top edge. It also uses simple fullscreen, which extends into the notch area on newer MacBooks.

Window close protection

Daintree intercepts Command-W Control-W Control-W . Rather than closing the window and killing every terminal in it, it closes the focused panel. Where that lands depends on focus: the assistant closes itself, an open dialog or palette dismisses its topmost layer, and a focused grid or dock panel closes that panel.

Window state

Size, position, and whether the window was maximized or fullscreen are remembered per project path, so each project reopens with its own geometry. With no saved state for a project, the new window cascades 30px from the most recently used one.

Window titles

Each window's native title names the project it is currently showing, prefixed with a count of agents waiting on you, so (2) payments-api in Mission Control, the Dock menu, or the Windows taskbar tells you both which window it is and whether it wants attention. A window sitting on the project picker falls back to Daintree.

The name is resolved from that window's own view, never from a process-global "current project" pointer, which is what makes two open windows stay distinct. The app name is deliberately not appended after the project name: the Dock already groups every window under one icon, so repeating it would cost the space that tells the windows apart.

Multiple windows

You can open several Daintree windows at once, each on a different project, and work across them side by side. Three in-app routes open one.

  1. Keyboard: Option-Shift-Command-N Control-Alt-Shift-N Control-Alt-Shift-N opens a new window and prompts for a project.
  2. Project switcher context menu: open the switcher (Option-Command-P Control-Alt-P Control-Alt-P ), right-click a project, and choose Open in new window.
  3. Project switcher modifier: highlight a project and press Command-Enter Control-Enter Control-Enter . The palette footer shows the hint while you hold the modifier.

Alt+Enter in the switcher opens a project in the background instead, loading it so it is ready without interrupting what you are doing. Opening a path from the command line (daintree /path/to/repo) while Daintree is running creates a new window for that path.

Note
Each window runs in its own isolated context. Terminals, agent sessions and worktrees in one window are fully independent of another. Concurrent writes from two windows on the same project merge rather than clobbering each other.

Relaunch restores your windows

Daintree records which project each window was showing when the app last ran, and a relaunch rebuilds the whole set, not just one window. Windows come back most-recently-focused first, and a window that was sitting on the project picker restores as a picker window rather than being dropped.

The restore is capped at eight windows. The cap is applied after the focus ordering, so what gets dropped is whatever you had focused longest ago, and a corrupt or hand-edited manifest cannot launch an unbounded fleet of renderers at startup.