Skip to main content

QuickRun

Run detected scripts and ad-hoc commands in a managed QuickRun panel, with history, pinning, and auto-restart.

Reviewed

QuickRun

QuickRun sits at the bottom of the project sidebar, just below the worktree list. It's the fast way to fire off a command or start a long-running process without setting up a full Recipe. The header reads "Run on {worktree-name}", reflecting whichever worktree is currently selected, and doubles as a disclosure button: click it to fold QuickRun away when you want the sidebar back.

Note
Three surfaces run things for you and they divide cleanly. QuickRun is for a single command against the selected worktree, typed or picked from history. Recipes are for a saved multi-panel setup you want back. The empty-grid launcher is where recipes and closed sessions surface when a worktree has no panels open. See The Empty Grid.

Running a Command

The input bar shows a $ prompt on the left. Type a command and press Enter to run it. The input clears, and the command is saved to your history.

While the suggestion dropdown is open, Arrow Down and Arrow Up move through suggestions, and Escape closes it.

Note
QuickRun needs a worktree selected. With no worktree active, the input is replaced by the line "Select a worktree above to enable Quick Run".

Output Location

A toggle button next to the input controls where the terminal panel appears:

  • Grid (default): opens in the main panel grid as an interactive terminal.
  • Dock: runs in the dock, the minimized strip for background terminals, as a background task.

The button's tooltip shows the current mode, so you always know where the next command will land.

Command Suggestions

Focusing the input, or typing into it, opens a suggestion dropdown with three kinds of entry:

  • Pinned commands: saved commands, shown with a green pin icon and a bold label. Hover to reveal the unpin button.
  • Detected scripts: the project's detected runners, shown with a terminal icon and kept in the order the source file declares them.
  • History: your last 10 commands, most recent first, with a clock icon. Duplicates are filtered out. History is stored per project, so switching projects gives you that project's commands rather than a shared list.

Filtering is plain substring matching as you type.

Detected Runners

Runner detection reads more than package.json. Daintree scans a worktree for package.json scripts, Makefile targets, justfile recipes, Taskfile tasks, Procfile processes, mise tasks, Django's manage.py, composer.json scripts, and dev container commands. On a JavaScript project it also works out which script is the canonical dev command from the framework in your dependencies, so a Next.js or SvelteKit repo surfaces the right one first instead of whichever script sorts earliest.

The same detected runners back project.runCheck, the MCP tool an agent uses to run a project's own check. It names a runner rather than a command (an agent can only run something the project already declares) and it reports the process's real exit code rather than guessing from scrollback text. It runs in the main process specifically so a long test suite isn't cut off by the renderer's dispatch timeout and can still be cancelled.

A QuickRun task's icon follows whatever ends up running inside it, so npm run dev on a Vite project shows a Vite icon rather than an npm one. See Process Icons for how that resolves and how plugins add their own detections.

Pinning Commands

Hover over any suggestion and click the pin icon to save it. At pin time, the current auto-restart toggle state and output location are captured as the command's preferred settings.

Run a pinned command, and those saved preferences override the current toggle states. Both toggle buttons update to reflect the pinned command's settings.

Note
Running a pinned command can change the toggle states in the input bar. That's intentional. Each pinned command carries its own auto-restart and output location preferences.

Auto-Restart

The auto-restart toggle is the circular arrow button in the input bar. When it's on, it lights up in accent green with the tooltip "Auto-restart: On". The setting persists per-project, so you can leave it on for projects where you always want dev servers to come back after a crash.

If the toggle is on at the moment you launch a command, the spawned terminal restarts whenever its process exits. Here's the sequence:

  1. The process exits, and Daintree checks the exit code and panel state.
  2. An exponential backoff delay kicks in: 250ms to start, doubling each attempt (500ms, 1s, 2s, 4s), capped at 5 seconds.
  3. During the delay, a green spinner banner reading "Auto-restarting…" appears inside the terminal.
  4. Once the delay passes, the command restarts. The usual "Session exited" banner is suppressed.

If the process ran for more than 10 seconds before exiting, the backoff resets to zero. A stable run followed by a crash counts as a fresh event, not the continuation of a crash loop.

Tip
Auto-restart is built for dev servers and file watchers like npm run dev or npm run test:watch. Pressing Ctrl+C (exit code 130) won't trigger a restart, so stopping a process on purpose always works.
Note
If a process keeps crashing quickly, the backoff compounds up to the 5-second cap. Close or trash the terminal panel to stop the restart cycle for good.

Active Tasks

Above the input bar, a task list shows up to 5 QuickRun-spawned panels for the active worktree. Each row shows a status indicator, the command (truncated to 28 characters), and elapsed time for running processes.

  • Running: pulsing green dot. Hover for stop and focus actions.
  • Restarting: pulsing amber dot, shown during the auto-restart backoff delay.
  • Success: green dot. The row dismisses itself after 3 seconds.
  • Failed: red dot with a left border accent. Hover for restart (hidden when auto-restart is active), dismiss, and focus actions.

Click any row to focus that terminal panel. Past 5 tasks, a "+ N more" label appears below the list.