Terminals & Panels
Panel types, grid layout, terminal features, search, hibernation, and QuickRun in Daintree.
Panel Types
Daintree has five panel types. Each carries its own accent color, so you can tell them apart at a glance:
| Type | Accent | Description |
|---|---|---|
| Terminal | Gray | A standard PTY terminal session. Runs any shell command. |
| Agent | Per-agent color | An agent terminal with state tracking and activity headlines. |
| Browser | Blue | An embedded Chromium browser for viewing web content. |
| Dev Preview | Teal | A dev server paired with an embedded browser preview. |
| Review | Violet | The 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
| Action | Shortcut |
|---|---|
| Close panel | Cmd+W |
| Reopen last closed | Cmd+Shift+T |
| Maximize / restore panel within grid | Ctrl+Shift+F |
| Find in panel | Cmd+F |
| Focus panel 1–9 | Cmd+1 through 9 |
| Next / previous panel (includes docked panels) | Ctrl+Tab / Ctrl+Shift+Tab |
| Close all panels | Cmd+K, Cmd+W |
| Kill all panels | Cmd+K, Cmd+K |
| Restart all panels | Cmd+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
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
| Action | Shortcut |
|---|---|
| Next tab | Cmd+Shift+] |
| Previous tab | Cmd+Shift+[ |
| Action | Shortcut |
|---|---|
| Next tab | Ctrl+Shift+] |
| Previous tab | Ctrl+Shift+[ |
| Action | Shortcut |
|---|---|
| Next tab | Ctrl+Shift+] |
| Previous tab | Ctrl+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.
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:
| Strategy | Behavior |
|---|---|
| Automatic | The grid sizes itself to the number of open panels. |
| Fixed Columns | Lock to N columns (1–10). |
| Fixed Rows | Lock 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.
| Category | Executables | Icon |
|---|---|---|
| Package Managers | npm, npx | npm |
| Package Managers | yarn | Yarn |
| Package Managers | pnpm | pnpm |
| Package Managers | bun | Bun |
| Package Managers | composer | Composer |
| Language Runtimes | python, python3 | Python |
| Language Runtimes | node | Node.js |
| Language Runtimes | deno | Deno |
| Language Runtimes | ruby, rails, bundle | Ruby |
| Language Runtimes | go | Go |
| Language Runtimes | cargo, rustc | Rust |
| Language Runtimes | php | PHP |
| Language Runtimes | kotlin, kotlinc | Kotlin |
| Language Runtimes | swift, swiftc | Swift |
| Language Runtimes | elixir, mix, iex | Elixir |
| Build Tools | gradle, gradlew | Gradle |
| Build Tools | webpack | webpack |
| Build Tools | vite | Vite |
| Infrastructure | docker | Docker |
| Infrastructure | terraform, tofu | Terraform |
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.
Adaptive Refresh Rates
Terminal rendering adapts its refresh rate to visibility and focus. With many panels open, that saves real resources:
| Tier | Interval | FPS | When |
|---|---|---|---|
| Burst | 16ms | ~60 | Active output streaming |
| Focused | 100ms | ~10 | Currently focused panel |
| Visible | 200ms | ~5 | On-screen but not focused |
| Background | 1000ms | ~1 | Off-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.
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.
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:
| Badge | What it means |
|---|---|
| Paused | Output 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. |
| Suspended | Streaming 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.
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
| Action | Shortcut |
|---|---|
| Copy selected text | Cmd+C |
| Paste | Cmd+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.
| Action | Shortcut |
|---|---|
| Copy selected text | Right-click > Copy |
| Paste | Ctrl+Shift+V |
On Windows, Ctrl+C sends an interrupt signal (SIGINT) to the running process, so use the right-click context menu to copy terminal text. Paste is Ctrl+Shift+V, matching the VS Code terminal convention.
On Windows, Daintree picks the best available shell. It tries pwsh.exe first, then powershell.exe, then falls back to cmd.exe. Each one launches in UTF-8: PowerShell starts with -NoLogo and a UTF-8 bootstrap, and cmd.exe runs chcp 65001 >NUL so the code-page switch is silent. That keeps box-drawing characters, emoji, and other non-ASCII output rendering correctly, with no startup banner.
| Action | Shortcut |
|---|---|
| Copy selected text | Right-click > Copy |
| Paste | Ctrl+Shift+V |
| Copy on select | Select text (writes to PRIMARY) |
| Paste from selection | Middle-click |
On Linux, Ctrl+C sends an interrupt signal (SIGINT) to the running process, so use the right-click context menu to copy terminal text. Paste is Ctrl+Shift+V, matching the VS Code terminal convention.
Daintree also follows the standard X11 and Wayland selection conventions. Selecting text in a terminal copies it to the PRIMARY selection the moment you release the mouse button, and middle-clicking pastes from PRIMARY straight into the PTY, bracketed-paste wrapped where the shell supports it. Middle-click paste is disabled when the panel's input is locked. Copy-on-select fails silently on minimal Wayland compositors that don't implement the primary-selection protocol; the keyboard and context-menu paths still work there.
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.
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.
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.
Search
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.
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.
| Action | Shortcut |
|---|---|
| Scroll to last activity | Cmd+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.
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.
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).
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.
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.