Skip to content

Terminal and Activity tab

Every agent session in Kangentic has a dedicated terminal powered by xterm.js. You can watch agents work in real-time, review their output, and interact when needed.

The Kangentic board for contoso-web: columns from To Do to Testing, each card showing its agent, latest message, and context use, three projects in the sidebar, and the terminal panel along the bottom on the working auth-middleware agent. v0.46.0 The real app on a sample install. The projects and terminals are recordings, connected to nothing, so click anything.

The bottom panel is your primary monitoring interface for the current project’s sessions; for every project’s agents at once, open the Agent Monitor. It has two types of tabs:

Each running agent gets its own terminal tab. Click a tab to switch between sessions; double-click one to open the task’s detail window. The active tab is highlighted, and each tab carries a state indicator:

  • Green spinner - the agent is actively working
  • Amber dot - the agent is idle or waiting for input; it pulses on tabs you have not viewed since the agent went idle
  • Green dot - the session is running but has no activity data yet
  • Gray dot - the session is not running

A task’s terminal is only ever in one place. While its detail window is open - on the board, inside the Agent Monitor, or in a detached pop-out - the session’s tab leaves the panel and returns when that window closes. Once no tabs remain, the panel collapses.

Where a session's terminal lives Each running session has one PTY in the main process, which keeps a scrollback ring. Its output reaches exactly one terminal, an xterm.js instance mounted in one host at a time: the bottom panel's session tab, the task detail window (on the board, inside the Agent Monitor, or in a detached pop-out), or a paired phone streaming the terminal. The bottom panel shows a tab for every running session in the current project minus the sessions a detail window owns or a phone streams. When a detail window opens, the session's tab leaves the panel and the window's terminal replays the scrollback. When the window closes, the tab returns and the panel's terminal replays the scrollback. The agent keeps running through both handoffs. When every running session is owned elsewhere, the panel has no tabs and collapses. MAIN PTY one per session keeps scrollback Terminal xterm.js mounted once live bytes replay HOSTS Bottom panel session tab Detail window board or pop-out Phone terminal stream open: tab leaves close: tab returns
A task's terminal is in exactly one place. The bottom panel shows a tab for every running session in the project minus the ones a detail window owns or a phone streams. Opening the detail window (on the board, inside the Agent Monitor, or popped out) takes the tab out of the panel; closing it hands the tab back, scrollback replayed both ways. When every running session is owned elsewhere the panel has no tabs and collapses, with nothing lost.

The leftmost tab is the Activity tab - a structured list of events from all sessions. Unlike the terminal tabs which show raw PTY output, the Activity tab shows clean, readable entries:

  • Tool calls (which tool, which file)
  • Idle events (agent stopped or is waiting)
  • Session state changes (spawned, suspended, resumed)

The Activity tab is a plain DOM list (not a terminal emulator), so it’s lightweight and easy to scan. It’s the best way to get an overview of what all your agents are doing without switching between individual terminal tabs.

The terminal panel on its Activity tab: a timeline of tool calls across every running session, each line stamped with its time, its session, and the tool, with a filter above it. v0.46.0 The real app on a sample install. The projects and terminals are recordings, connected to nothing, so click anything.

Drag the panel divider to resize the bottom panel. The terminal resizes to match.

Each running agent gets its own terminal tab showing:

  • The agent’s conversation output
  • Any commands the agent runs
  • File modifications and tool usage
  • Agent thinking and decision-making

You can have multiple terminal tabs open simultaneously and switch between them to monitor different agents.

While a session’s CLI boots - a fresh spawn, a resume after a restart, or a move that restarts the session - a shimmer overlay covers the terminal with a context-aware label saying what is happening, then lifts the moment real output arrives. The Command Terminal shows the same overlay while its CLI initializes.

Click a task card to open its detail window, which takes ownership of the session’s terminal from the bottom panel while it is open. The same handoff happens when a detail window opens inside the Agent Monitor: wherever the detail is, that is where the terminal lives. When you close the window, the bottom panel reclaims the terminal and the agent keeps running.

Terminal sessions maintain a full scrollback buffer. Scroll up to review earlier agent output without losing your place. The buffer persists for the lifetime of the session.

Terminal rendering uses WebGL for hardware-accelerated text drawing. If WebGL is unavailable (e.g., in some VM environments) or the GPU drops the WebGL context, xterm.js falls back to its DOM renderer while Kangentic keeps retrying WebGL on a slowing schedule - since v0.41.0 there is no permanent fallback, because Chromium refuses WebGL for up to two minutes after a GPU-process crash, and the old couple-of-retries gave up inside exactly that window. A terminal that lost its context comes back to WebGL on its own once the GPU allows it.

One launch does not retry at all: the one that came up with graphics acceleration off after a graphics failure killed the previous run. There is no graphics process to come back to, so every terminal reports the DOM renderer and arms nothing.

Drag files from your file manager onto the terminal to insert their file paths into the active session. Since v0.42.0 every dropped path is delivered as a paste, the same way a native terminal delivers a drop, which is what lets an agent TUI attach an image from its path. With Claude Code in the foreground, a PNG, JPEG, GIF, or WebP file becomes an [Image #N] chip, one per file, and the images land in your next message directly. Gemini CLI and OpenCode attach PNG, JPEG, and GIF drops the same way. An image in a format the agent does not attach from a path (a BMP, an ICO) is converted to a PNG copy first, saved next to the clipboard captures, and that copy is what gets pasted, so it attaches too. An SVG, or a file whose bytes are not an image, gets an explicit “Read this image: …” instruction under Claude Code (Claude reads SVG markup with its Read tool) and the bare path under other agents. Any other file is inserted as its bare path. Paths containing spaces are automatically quoted. Dropping several files inserts them separated by spaces. A visual overlay appears when files are dragged over the terminal area.

Select text in the terminal to copy it. Copying is routed through the main process, so it works reliably regardless of window focus, and soft-wrapped lines are rejoined so long paths and commands copy cleanly. On all platforms, you can also right-click in the terminal to paste from the clipboard. TUI agents that emit OSC 52 clipboard sequences (for example, copying a mouse selection inside Claude Code’s TUI) can set your system clipboard directly; for safety, Kangentic honors these writes but never lets a TUI read your clipboard back.

Ctrl+V / Cmd+V pastes clipboard text directly. If the clipboard holds an image instead - a screenshot, say - Kangentic saves it to a temporary PNG and pastes the file’s path into the terminal the way a native terminal delivers a dropped file: as a bracketed paste when the program in the terminal asked for one, as plain text otherwise. With Claude Code in the foreground, the pasted path becomes an [Image #1] chip and the image lands in your next message directly, with no Read tool call and no extra model round trip; Claude still knows the file’s path on disk. Kangentic’s own capture is more reliable than the CLI’s clipboard reader, which can silently miss a Windows Snipping Tool image. Gemini CLI and OpenCode attach the pasted capture the same way. Agents that do not attach from a pasted path receive the quoted path as text. At a plain shell prompt the quoted path is inserted as text and nothing runs. Paths are quoted for the active shell.

Two shell-specific limits apply to a dropped or pasted image on Windows. Under Git Bash the path is converted to /c/..., which Claude Code (a Windows process) cannot open, so the image arrives as text; WSL’s /mnt/c/... form reads fine. Under a Unix-style shell a file name containing an apostrophe is quoted with '\'', which the path scan cannot undo, so that file also arrives as text.

The saved image gets the same 2000 px long-edge cap as a pasted attachment. The temp directory is pruned on each paste: files older than 24 hours go, and only the 40 most recent are kept regardless of age. Pruning is best-effort, so a file another process is holding open is retried on the next paste rather than turning into a failed paste.

Per-message and per-tool-output copy buttons live in the read-only conversation viewer - opened from a task detail window’s View conversation pill or a Conversation Memory search hit: hover a turn to reveal a copy button that grabs that block’s clean content. In the live terminal, use plain selection copy (above).

Kangentic can transcribe speech into the terminal input with local push-to-talk voice-to-text. Enable it in Settings > Dictation, then hold the push-to-talk key (bound under Hotkeys) and speak; on release the transcription is inserted and, by default, submitted to the agent. Transcription runs on-device (a live preview model, and in some modes a refinement pass on release), with the mode, language, and a trailing-capture buffer all configurable, and an optional Cloud endpoint for the final pass.

A terminal is one of several destinations. Since v0.36.0 a focused text field anywhere in the app outranks every terminal, so dictation also fills a task title, a search box, or a field on a page loaded in the Browser pane. See Where the text goes for the full resolution order, and Dictation for the feature.

The Terminal settings tab (Settings > Terminal) styles every terminal surface at once - the bottom panel, the task-detail terminal, and the Command Terminal window. These are global, machine-level cosmetics, not per-project.

Settings on the Terminal tab: the shell, the font size and family, the cursor style, backspace behavior, and the terminal colors. v0.46.0 The real app on a sample install. The projects and terminals are recordings, connected to nothing, so click anything.

Set the terminal background, foreground, and cursor color with individual color swatches. Any slot you leave alone falls back to the built-in default: a near-black #0c0c0c background with #e4e4e7 foreground and cursor. Reset to default clears every customization at once.

A preset grid seeds the swatches in one click. The built-in default comes first, followed by a theme-match preset that mirrors your current app theme (skipped when it would just duplicate the default), then a set of curated schemes. Picking a preset fills the swatches, which you can then fine-tune.

The 16-color ANSI palette agents use for colored output (git diff, ls --color, and TUI chrome) is a fixed built-in based on Windows Terminal’s Campbell scheme. It is not individually editable - only background, foreground, and cursor are user-set - so colored CLI output stays legible against whatever background you choose.

Font family is a system-font picker: start typing and choose from the fonts installed on your machine via an autocomplete field. Font size (8 to 32 pixels) and Cursor style (block, underline, or bar) sit alongside it, and a Word delete on Backspace toggle makes plain Backspace delete the previous whole word. Like colors, these apply to every terminal surface.

An info strip sits beneath the terminal, in the bottom panel and in the task detail window, showing live session telemetry:

  • Shell and agent version the session was launched with
  • Elapsed time - a ticking wall-clock timer since the session started
  • Model, session cost, and token usage (input + output)
  • Tool calls - a live count of completed tool calls. Click the pill to open the per-tool table (calls, time, average, and, for Claude, the tokens each tool’s output took up), the same one each run on a completed task’s Usage tab opens. The count covers every run of the session, so it does not drop to 0 when the session resumes after an app restart or a pause. A column that runs in its own isolated session, such as a Code Review column, keeps its own count.
  • Context window fraction (e.g. 28k / 200k) with a progress bar. The tooltip breaks this down into cache vs. conversation tokens.
  • Rate-limit bars (Claude only) - two bars show your current 5-hour session window and weekly plan-usage quota, with a reset-time hint on hover. These only appear when Claude reports quota usage in its status.json.

Most pills are individually toggleable under Settings > Task (the Context bar card) or the contextBar.* keys - see Configuration reference. The model and effort pills always show when the adapter reports them and double as click-targets for the per-task model/effort picker, so they have no show/hide toggles.

The model dropdown (in the context bar picker and in per-task and per-column override dialogs) is fed by two sources: the models the agent CLI advertises, plus a persistent cache of every model ID Kangentic has seen you actually use. New models are discovered automatically - switch to one via the CLI’s /model command and it appears in the dropdowns from then on, surviving restarts, with no app update needed.

No adapter ships a list of model names (since v0.41.0). Every list is either asked of the CLI - Cursor through cursor-agent --list-models, Antigravity through agy models, Ollama through ollama list, Grok from the models cache the CLI maintains itself, Claude from its own /model picker - or scanned out of the agent’s own session history, which is how Codex, Copilot, Gemini, Qwen, and Kimi report what they can run. Either way the answer is read fresh rather than accumulated, so a model your CLI stops serving leaves the dropdown instead of lingering. The half that does persist is narrower than it sounds: it holds only models you have actually run, learned from a live session’s usage report.

The reason for the change is that a list kept in Kangentic is stale the day a vendor ships. Cursor’s was still offering GPT-4o and Claude 3.5 Sonnet while the CLI served 223 models, none of them those. Deleting it was not enough on its own, because the stale names had already been written into every config on disk, so upgrading to v0.41.0 clears the remembered-models cache once. Nothing is lost that the CLI still reports, and a model you run again is remembered again on its first usage tick.

When a CLI cannot be asked - an auth failure, a listing command that errors - the dropdown reports no models rather than a guess, and the picker falls back to a free-form text field so you can still type an exact model ID.

To keep the list readable, near-duplicate IDs are grouped and given friendly, humanized labels. Each base model gets one row; a 1M chip on the row selects its [1m] long-context variant; and a small context-window badge (like 200K or 1M) shows the model’s context size, learned from real usage rather than hardcoded.

Since v0.44.0, when the agent offers floating aliases, the dropdown leads with a Latest group: one row per model family, each with the version it runs today beside it. Pick one and the task or column follows each new release of that family, with no edit when a vendor ships. Today Claude is the agent that offers them, read from its own /model picker. The versions those aliases run, older generations, and dated pins then sit in one collapsed Specific versions section, grouped by model with the newest first. A current version with no alias stays in the main list. For an agent without aliases, whole superseded generations and dated snapshot builds (like claude-haiku-4-5-20251001) collapse into an Older versions section instead. Either section auto-expands when your search only matches inside it. A pinned version that a newer one has superseded says so in the picker (“Sonnet 5.5 available”). Opening the dropdown also rescans for newly installed models, so a model you just gained access to shows up without a restart. Every exact model string stays selectable - grouping is display-only and the chosen ID is passed verbatim at spawn time.

A running agent’s newest message also shows on its task card, in place of the description. The message trail under Card indicators describes it and the Card preview setting that picks what the card shows.

The terminal state is tied to the agent session:

  • Running sessions - Terminal is live, showing real-time output
  • Suspended sessions - Terminal shows the last output before suspension. When resumed, new output continues from where it left off.
  • Completed sessions - Terminal is read-only, showing the full session history

Standard terminal keyboard shortcuts work within Kangentic’s terminal:

ShortcutAction
Ctrl+CSend interrupt to the agent process (Ctrl on every platform)
Ctrl+C / Cmd+C (also Ctrl+Shift+C / Cmd+Shift+C)Copy selected text - on Windows and Linux, plain Ctrl+C copies only while text is selected, so Ctrl+Shift+C always copies
Ctrl+V / Cmd+V (also Ctrl+Shift+V / Cmd+Shift+V)Paste from clipboard
Right-clickPaste from clipboard

Kangentic is free and open source. A star helps other people find it.

Star on GitHub