Skip to main content

Terminals & Panels

Panel types, grid layout, terminal features, search, hibernation, and QuickRun in Daintree.

Updated
Reviewed

Panel Types

Daintree has five panel types. Each carries its own accent color, so you can tell them apart at a glance:

TypeAccentDescription
TerminalGrayA standard PTY terminal session. Runs any shell command.
AgentPer-agent colorAn agent terminal with state tracking and activity headlines.
BrowserBlueAn embedded Chromium browser for viewing web content.
Dev PreviewTealA dev server paired with an embedded browser preview.
ReviewVioletThe Review Hub docked into the panel grid, bound to a worktree.

The Review panel docks the Review Hub into the panel grid, so a diff sits next to the agent producing it. It carries a git-pull-request icon and has no PTY behind it, which means it can't be restarted or converted to another panel type. It binds to the worktree it was opened on. Find it in the panel palette under Review, or search for diff, commit, stage, or git.

Creating Panels

  • New terminal: Cmd+Alt+T (or Cmd+T to duplicate the focused panel; seeds from the last-closed config when no panels are open; see Keyboard Shortcuts for details)
  • New agent: Cmd+Alt+C/G by default (Codex/OpenCode can be bound in Keyboard settings)
  • Panel palette: Cmd+N, or run "Open panel palette" from the Action Palette (Cmd+Shift+P). Opens a picker for any panel type.

Managing Panels

ActionShortcut
Close panelCmd+W
Reopen last closedCmd+Shift+T
Maximize / restore panel within gridCtrl+Shift+F
Find in panelCmd+F
Focus panel 1–9Cmd+1 through 9
Next / previous panel (includes docked panels)Ctrl+Tab / Ctrl+Shift+Tab
Close all panelsCmd+K, Cmd+W
Kill all panelsCmd+K, Cmd+K
Restart all panelsCmd+K, Cmd+R

Maximize & Focus Mode

There are two ways to clear the space around a single panel, and they're easy to confuse. Maximize expands one panel to fill the grid while the sidebar stays put. Focus Mode goes further and hides the sidebar entirely. Use maximize when you want one panel large but still want the worktree list in reach. Use Focus Mode when you want nothing but the panel.

Maximize a Panel

Maximizing expands the focused panel to fill the grid. The other panels stay open behind it, and the sidebar stays visible.

  • Double-click the panel header: click the header's drag area (the icon or the empty space beside the title, not the title text, a tab, a button, or an input)
  • Keyboard: Ctrl+Shift+F

Both routes toggle. Trigger the same action again to restore the grid. The double-click target matters here. Double-clicking the header's drag area maximizes, but double-clicking a single panel's title text or a tab starts an inline rename instead.

Focus Mode

Focus Mode gives a single panel the entire window. The sidebar disappears completely, and the focused panel fills all the available space. Use it when you want to concentrate on one agent's output with no other panels or navigation in view.

Entering Focus Mode

  • Keyboard: Cmd+K then Z (a two-key chord)
  • View menu: choose Toggle Focus Mode
  • Action Palette: Cmd+Shift+P, then search for "Toggle Focus Mode"

What changes while in Focus Mode

The sidebar is fully hidden, not just collapsed, and the panel header updates to reflect the new state. An Exit Focus button appears in the header controls as the way back. If you have other panels open in the grid, a background indicator appears in the center of the header showing how many panels are still running. Panels that are actively working show an animated pulse alongside their count.

Exiting Focus Mode

  • Click the Exit Focus button in the header
  • Press Cmd+K then Z again
  • Choose Toggle Focus Mode from the View menu or Action Palette
Note
Maximize and Focus Mode are separate. Ctrl+Shift+F (and double-clicking the header) maximizes a panel within the grid while the sidebar stays visible. Cmd+K Z enters Focus Mode, which hides the sidebar entirely.

Focus Mode state is saved per project. When you reopen a project, Daintree restores whichever mode you were last in, including your original sidebar width and diagnostics panel state.

Panel Tabs

Once a panel holds two or more sessions, the header switches from a single title to a tab bar. Each tab shows the panel's icon, a truncated title, and a close button that appears on hover. Single-tab panels keep the standard header, with a + button that appears on hover for adding tabs.

Creating Tabs

Cmd+T (Ctrl+T on Windows/Linux) pulls double duty. When a panel is focused, it duplicates that panel as a new tab alongside it. You can also click the + button in the panel header. It appears on hover for single-tab panels, and at the right end of the tab bar once multiple tabs are showing.

Both methods create a new session of the same panel type. Agent panels show a state badge next to the title, a spinner for working and a pause icon for waiting, so you can track progress across tabs without switching.

Navigating Tabs

ActionShortcut
Next tabCmd+Shift+]
Previous tabCmd+Shift+[

These shortcuts work from anywhere in the panel and wrap around at the edges: the last tab jumps to the first, and the first jumps to the last. When the tab bar itself has keyboard focus, ArrowLeft and ArrowRight move between tabs, and Home and End jump to the first or last tab.

Tip
Use the global shortcuts for everyday tab switching. Arrow key navigation only works when the tab bar has keyboard focus. It's there for accessibility, not as the fastest way to move between tabs.

Tab Overflow

When tabs exceed the visible width of the panel header, scroll arrows appear at the edges of the tab bar. A right-facing chevron shows up when tabs are hidden to the right, and a left-facing chevron appears once you've scrolled away from the start. Each arrow sits on a gradient fade that blends the cut-off edge into the panel background.

Clicking an arrow scrolls the tab bar by roughly 80% of its visible width, so it pages through rather than nudges. Switching to any tab, by click or by keyboard shortcut, scrolls it into view, so the active tab is never lost behind the edge even with many tabs open.

Managing Tabs

  • Rename: double-click a tab title to edit it inline. Press Enter or click away to confirm, Escape to cancel.
  • Reorder: drag a tab left or right within the bar.
  • Close: hover any tab to reveal its × button, then click. If you close the active tab, focus switches to the nearest neighbor first.

Quick Switcher

Press Cmd+P to open the Quick Switcher. It lets you jump to any open terminal or worktree by name.

Panel Grid Layout

The main content area arranges panels in a configurable grid. Pick a layout strategy in Settings > Panel Grid:

StrategyBehavior
AutomaticThe grid sizes itself to the number of open panels.
Fixed ColumnsLock to N columns (1–10).
Fixed RowsLock to N rows (1–10).

Two-Pane Split Layout

Enable a side-by-side split in Settings > Panel Grid. Panels arrange into a two-pane view with a configurable ratio, anywhere from 20% to 80%. A "prefer preview" option places browser and dev preview panels in the secondary pane automatically.

Moving Panels

Directional shortcuts move focus between panels:

  • Cmd+Alt+Arrow: move focus left, right, up, or down

You can also drag terminals between worktrees using the sidebar's drag-and-drop targets.

Panel Restore Order

When you reopen a project, Daintree doesn't bring every panel back at once. The active worktree's panels load first. Within each other worktree, the panel you most recently focused is restored ahead of the rest, and the remaining panels fill in behind them on a staggered schedule. It works the way a browser restores tabs: the thing you were last looking at is ready first, and the rest catch up. Daintree tracks this by stamping each panel with the time you last focused it. See Session Management for more on how sessions are saved and restored.

Terminal Features

PTY Emulation

Daintree uses node-pty for native PTY processes and xterm.js for rendering. You get full terminal emulation: colors, cursor positioning, alternate screen buffers, and the sixel and iTerm2 image protocols.

Process Icons

Terminal tabs show an icon for the process running inside them. Start node, and the tab switches from the generic terminal icon to a Node.js icon. Run python, and you get a Python icon. This works on every surface where terminal tabs appear: the panel header, the tab bar, the dock, the worktree sidebar, and the Quick Switcher.

The process detector scans the child process tree of each terminal's PTY and matches running executables against a built-in set of recognized processes. The table below lists every recognized non-agent process, grouped by category. Agent processes are covered separately below.

CategoryExecutablesIcon
Package Managersnpm, npxnpm
Package ManagersyarnYarn
Package Managerspnpmpnpm
Package ManagersbunBun
Package ManagerscomposerComposer
Language Runtimespython, python3Python
Language RuntimesnodeNode.js
Language RuntimesdenoDeno
Language Runtimesruby, rails, bundleRuby
Language RuntimesgoGo
Language Runtimescargo, rustcRust
Language RuntimesphpPHP
Language Runtimeskotlin, kotlincKotlin
Language Runtimesswift, swiftcSwift
Language Runtimeselixir, mix, iexElixir
Build Toolsgradle, gradlewGradle
Build Toolswebpackwebpack
Build ToolsviteVite
InfrastructuredockerDocker
Infrastructureterraform, tofuTerraform

When several recognized processes run in the same terminal, the detector picks the highest-priority one. Agent processes (Claude Code, Gemini CLI, Codex CLI, OpenCode, Cursor) always win, then package managers, then language runtimes, build tools, and infrastructure. Once the process exits, the icon reverts to the generic terminal icon. Run an agent CLI like claude in a plain terminal, and the tab picks up that agent's brand icon.

Dedicated agent panels are the exception. They always display their own brand icon, whatever is running inside them. Run npm install inside a Claude Code agent panel, and the tab still shows the Claude icon, not the npm icon.

Note
Process detection is automatic, with nothing to configure. The detector polls every few seconds, so there's a brief delay before an icon appears or reverts. Icons are transient and not persisted across app restarts. On Windows, the detector checks one level deeper in the process tree to handle common shell wrapper patterns.

Adaptive Refresh Rates

Terminal rendering adapts its refresh rate to visibility and focus. With many panels open, that saves real resources:

TierIntervalFPSWhen
Burst16ms~60Active output streaming
Focused100ms~10Currently focused panel
Visible200ms~5On-screen but not focused
Background1000ms~1Off-screen or inactive worktree

High-Performance Data Flow

Terminal data flows through SharedArrayBuffer ring buffers for zero-copy, low-latency transfer between the main process and the renderer. That skips IPC serialization overhead, which matters when agents are producing a lot of output.

Hibernation

When a terminal sits in the background, Daintree can put it to sleep to reclaim memory. Hibernation tears down the renderer (the xterm.js instance, its WebGL context, addons, and DOM) and leaves the underlying process running. The PTY keeps going. A dev server stays up, an SSH session stays connected, a long build keeps building. Focus the panel again, and Daintree rebuilds a fresh terminal view and reattaches it to the still-live process.

Tip
Hibernation never touches the process behind a terminal. Sleeping a panel running npm run dev, a watcher, or an SSH session leaves it running. Waking the panel rebuilds the view on top of it.

A sleeping terminal shows a Moon icon and a "Hibernated" badge in its header, in the same muted gray as an idle terminal. The tooltip reads "Renderer asleep. PTY preserved. Wakes on focus." There's no toast and no interruption. The badge is the only cue, and clicking into the panel clears it.

Sleeping a terminal yourself. Right-click a terminal and choose Sleep Terminal, or run "Sleep Terminal" from the Action Palette. A "Sleep All Idle Terminals" action sweeps every idle terminal at once. Sleep is disabled for a terminal that's already hibernated, or one with an agent session actively working, so you can't pause an agent mid-task by accident.

Automatic hibernation. Only background terminals are eligible: off-screen, or in an inactive worktree. A focused or visible panel never auto-hibernates. By default, an eligible terminal sleeps about 30 seconds after it moves to the background:

  • Idle, completed, or exited agents qualify right away.
  • Actively working agents qualify only after five minutes of output silence with nothing pending to write, so a busy agent stays awake.
  • Under memory pressure, Daintree shortens the delay so background terminals sleep faster: about five seconds at the first pressure tier, and immediately at the second.

Hibernation also refuses to fire if a terminal has pending writes or just produced output, so it never cuts off mid-burst. See Session Management for how sleep and wake interact with saved sessions.

Note
Terminal hibernation isn't the same as project hibernation. Sleeping a terminal keeps its process running and only tears down the view. Project hibernation, covered in Session Management, shuts down a whole project's processes to free resources, so its terminals start fresh when you reopen the project.

Runtime State Badges

When Daintree throttles a terminal to protect the app, the panel header shows a small badge explaining why. These are automatic and temporary. Each one recovers on its own:

BadgeWhat it means
PausedOutput is arriving faster than it can be drained. Streaming pauses to prevent data loss, then resumes once the buffer clears.
Paused (memory)The app is under memory pressure. The terminal is paused to ease it, and recovers on its own.
SuspendedStreaming stalled. It recovers when you focus the panel.

If you'd rather not wait, the right-click menu offers Force Resume while a terminal is paused. A terminal you've paused yourself doesn't get a badge. It surfaces through the same Force Resume menu item instead.

Note
These pauses are protective, not failures. The memory governor watches heap usage and starts pausing terminals as it climbs, and the thresholds tighten under the efficiency performance profile. It pauses idle terminals first and terminals running active agents last, then resumes them in the opposite order. Your working agents are the last to slow down and the first to come back.

Scrollback

Configure scrollback history in Settings > Terminal:

  • 500 lines: minimal memory footprint
  • 1,000 lines (default): good balance
  • 2,500 lines: moderate buffer
  • 5,000 lines: full history

The settings panel shows an estimated memory usage for the size you pick.

Scrollback Restore

When a terminal wakes from hibernation, or a session is restored, Daintree replays its saved scrollback. If that replay can't finish, an inline banner appears at the top of the terminal explaining what happened, with a Reset terminal button to clear the buffer and start fresh. You can also dismiss the banner and keep working.

The message depends on what went wrong:

  • Scrollback restore timed out: the replay didn't finish in time.
  • Scrollback contents couldn't be replayed: the saved buffer couldn't be parsed.
  • Scrollback restore failed: a general fallback with the underlying error.

In every case the terminal itself is fine and the live process is untouched. The only thing missing is the earlier output that couldn't be replayed.

Performance Mode

Enable Performance Mode in Settings > Panel Grid to cut resource usage on lower-end hardware. It shrinks scrollback buffers and turns off visual animations.

Hybrid Input Bar

An optional text field above each terminal. It gives you normal editing (selection, cursor movement, clipboard) before the input reaches the PTY. Toggle it in Settings > Panel Grid, with an optional auto-focus setting.

Clipboard

All PTY-backed panels, terminal and agent panels alike, support VS Code-style copy and paste. Keyboard shortcuts, right-click context menu items, and clipboard image handling all work the way a modern terminal should.

Keyboard shortcuts

ActionShortcut
Copy selected textCmd+C
PasteCmd+V

Cmd+C copies the current terminal selection to your system clipboard. It works even when the Hybrid Input Bar has focus, so you don't have to click into the terminal output first.

Pasted text is wrapped for shells that support bracketed paste mode, so multi-line content won't execute before you press Enter.

Right-click context menu

Right-clicking anywhere in a terminal or agent panel opens a context menu with Copy, Paste, and Send to Agent at the top. Copy and Send to Agent are disabled when no text is selected. Every item shows the platform-appropriate keyboard shortcut inline. Shift+F10 opens the menu from the keyboard.

Right-click over a detected URL, and Open Link and Copy Link Address items appear. The menu also carries layout controls, terminal management actions, and panel-type-specific options. For the full context menu reference across all panel types, see UI Layout: Context Menus.

When text is selected in a PTY panel, the context menu includes a Send to Agent item. It routes the selection as typed input into another panel's input buffer, without touching the clipboard. See Send Selection to Agent on the Agents page for the full details.

Clipboard image paste

Paste a screenshot or image from your clipboard into any terminal panel, and Daintree saves it as a PNG file in a temporary directory. It then inserts the shell-escaped absolute path at the cursor, ready to pass straight to CLI tools or agent commands.

Pasting an image in the Hybrid Input Bar works the same way, with one addition: a thumbnail preview chip shows up inline alongside the path.

Tip
Clipboard images live in a temporary directory and are cleaned up after 24 hours. The inserted path is shell-escaped, so it drops straight into commands like cat, cp, or agent input flags with no extra quoting.

Gemini clipboard image access

Gemini CLI sandboxes file access to the current workspace by default. The Share Clipboard Directory setting (in Settings > CLI Agents > Gemini) adds the clipboard temp directory to Gemini's allowed paths so it can read pasted images. It's on by default.

Tip
Turn off Share Clipboard Directory in Settings > CLI Agents > Gemini, and pasted image paths still get inserted, but Gemini won't be able to read those files.

File drag-and-drop

You can also drag files from Finder or your file manager onto a terminal panel. Daintree inserts the shell-escaped absolute paths at the cursor, the same way clipboard image paste does.

Press Cmd+F to open the search bar and find text anywhere in a terminal's scrollback. The bar opens at the top of the focused panel with a "Find in terminal" input. Matches highlight as you type, debounced so a fast typist doesn't fire a search on every keystroke. The counter to the right shows where you are: "3 of 12" when a match is active, "12 matches" before you've stepped into one, or "No matches".

Toggles. Three buttons sit in the search bar. They combine freely:

  • Aa: case sensitive
  • .*: treat the query as a regular expression
  • ab (underlined): whole word only

The case-sensitive and regex toggles persist across searches. Whole word resets each time you reopen the bar.

Overview ruler. A thin strip beside the scrollbar acts as a search overview ruler. It drops a marker at every match across the whole scrollback, so you can see how matches are distributed without scrolling. The active match gets its own brighter tick, so you always know where you are in the buffer.

Navigation. Press Enter or the down chevron to jump to the next match, Shift+Enter or the up chevron for the previous one. Navigation wraps at the ends of the buffer. Escape closes the bar.

Search history. With the input focused, press ArrowUp and ArrowDown to cycle through recent searches. Anything you've typed but not yet recalled is held as a draft, so stepping back to it loses nothing. A search joins the history when you confirm it.

Note
Two limits to know about. An invalid regular expression surfaces the engine's own error message inline, and the input turns red, rather than failing silently. And highlighting plus navigation are capped at the first 1,000 matches. Past that the counter reads "1000+" and the rest of the buffer isn't marked.

Scroll Navigation

When you scroll up in a terminal or agent panel to read earlier output, Daintree tracks whether new content has arrived since you left the bottom. Two features get you back to where the output is.

"New output below" indicator. A floating pill appears at the bottom of the panel whenever you're scrolled back and new output arrives. The pill reads "New output below" with a down arrow. Click it to jump to the bottom and restore keyboard focus to the panel. The indicator keeps clear of normal mouse interactions like drag-to-select and right-click menus, and animates in smoothly, respecting reduced motion preferences.

The indicator only appears when both things are true: you've scrolled away from the bottom, and new output has actually arrived. Scrolling up on its own won't trigger it. It also stays hidden during full-screen programs like vim, less, or htop, since those take over the entire terminal buffer.

Scroll to Last Activity. This keyboard shortcut jumps the focused panel to the line where output was most recently written. It isn't the same as scrolling to the very bottom. If your agent produced output 500 lines up and the prompt sits at the end of the buffer, the shortcut takes you to the output, not the prompt.

ActionShortcut
Scroll to last activityCmd+Alt+L

You can also run this from the Command Palette (Cmd+Shift+P) by searching for "Scroll to Last Activity". Press the shortcut twice in a row to land at the absolute bottom of the buffer, handy when the last activity position and the end of the buffer are close together. During full-screen programs (vim, less, htop), the shortcut falls back to a plain scroll-to-bottom, since last-activity tracking pauses in alternate screen mode.

Terminal Info

Every terminal and agent panel has a diagnostic dialog. It covers the shell command that spawned the panel, its PTY internals, runtime statistics, and activity metrics. Use it when you want to check which flags an agent launched with, confirm a TTY device path, or grab a full dump to paste into a bug report.

Opening the dialog

  • Right-click the panel header and choose View Terminal Info.
  • Open the Action Palette (Cmd+Shift+P) and search for "View Terminal Info".

The dialog is only offered for PTY-backed panels (terminals and agents). Browser, Dev Preview, and Review panels don't expose it. While Daintree loads the data from the main process, the dialog shows a "Loading terminal info…" placeholder. If the fetch fails, a red error banner replaces the data and the Copy button is hidden.

Tip
The Terminal Info dialog has no dedicated keyboard shortcut. The Action Palette is the fastest keyboard route.

Session Metadata

The identifiers Daintree tracks for the panel: Terminal ID, Kind, Type, Title, Project ID, Worktree ID, and Current Directory.

Spawn Command

The shell path Daintree executed, followed by every argument as its own selectable code chip. Empty args render as (none), and missing data renders as N/A. This is the easiest place to confirm that an agent was launched with the flags you expected.

Note
The Agent section below only appears for agent panels (Claude Code, Gemini CLI, Codex CLI, OpenCode, Cursor, Kiro CLI, and GitHub Copilot CLI). Plain terminal panels skip from Spawn Command straight to Terminal Classification.

Agent

For agent panels, Daintree surfaces the agent's identifiers and launch context: Agent ID, the detected agent type, launch flags shown as individual chips, and the model ID. Fields only render when data is present, so a partial match, say an agent detected without an explicit model override, doesn't pad the section with blank rows.

Terminal Classification

Flags covering how Daintree treats the panel: whether it's an agent terminal, whether a PTY is currently active, whether activity analysis is enabled, and which resize strategy is in use (default or settled).

PTY Diagnostics

Runtime details from the underlying pseudo-terminal: Dimensions (cols × rows, shown only when both are available), Shell PID, TTY Device, Foreground Process, and Exit Code (shown only once the terminal has exited).

Note
The TTY Device field is resolved via lsof on macOS and Linux. Windows doesn't expose a matching device path, so the field is omitted there.

Runtime Statistics

How long the session has been running (formatted as 2h 15m 30s), the local timestamp it was spawned at, and the restart count. The restart count is useful when auto-restart or crash loops are in play.

Activity Metrics

When the panel last received input and last emitted output (both shown as relative time plus absolute timestamp), the current agent state (N/A for plain terminals), the last state change, and the current steady-state activity tier (focused, visible, or background) that drives the adaptive refresh rate described above. The transient Burst tier is a short-lived rendering state during active output streaming, not a persisted classification, so it doesn't show up in this field.

Performance & Diagnostics

The current size of the output buffer and the semantic buffer (both in lines), plus whether Synchronized Output (DEC 2026) is active. A useful sanity check when you're investigating memory use or slow rendering in a long-running session.

Note
PTY heartbeat round-trip times aren't shown in this dialog. Daintree logs them to the console (the developer tools) at the p50, p95, and p99 percentiles for diagnosing latency between the app and the PTY host. It also warns there when a single round-trip spikes past five seconds.

Copy to Clipboard. The footer has a Close button and a Copy to Clipboard button. Copy produces a structured plain-text dump of every section in the dialog, ready to paste into a bug report or hand to a teammate debugging a process issue. The Copy button is hidden while the dialog is in its loading or error state.

File Viewer

The File Viewer is a read-only modal overlay for inspecting any file without leaving Daintree. It has syntax highlighting, diff mode, and inline image preview. Click a file path in terminal output or a changed file in the Review Hub to open it. See File Viewer for the full reference.

QuickRun

QuickRun runs detected scripts and ad-hoc commands in a managed panel from the bottom of the project sidebar, with command history, pinning, and auto-restart for dev servers and watchers. See QuickRun for the full reference.

Recipes

Save terminal configurations you use often as recipes for one-click launching. See the Recipes page for the details.