Skip to content

Reviewing Changes

The Changes panel is a built-in git diff reviewer. It shows exactly what an agent changed - file by file, line by line - without leaving Kangentic or switching to an external diff tool.

Open it from any of these places:

  • Task context menu - right-click a task card and choose Changes
  • Task detail window - press Ctrl+Shift+G / Cmd+Shift+G, or open it from the kebab menu
  • Command Terminal - review the diff against the base branch while you work an ad-hoc session. This one is the Uncommitted view only: with no task behind it, the rail has no History section

The panel is a read-only review surface split horizontally: a rail on the left and the diff viewer on the right, divided by a resizable divider.

The rail holds the changed-file list, with a collapsible History section pinned at its bottom (see Commit History). Uncommitted changes is selected by default and shows the branch-wide working diff described below. Selecting a commit from History instead scopes the diff to that commit alone, and a back control at the top of the rail returns you to Uncommitted changes.

The rail sizes itself proportionally, so widening the panel widens filenames rather than stranding a narrow rail in a wide window. Drag the divider to override that for a task, and double-click the divider to go back to the proportional default. Dragging is bounded, so the rail never collapses to nothing or swallows the diff.

The top of the rail shows live branch context, refreshed automatically as work lands:

  • The current branch name (or Detached HEAD)
  • A base-branch pill next to the branch name, naming the branch this one is diffed against. It reads in a subtle tone when the branch was cut from the default base and switches to an accent tone when it was cut from a custom base, so a non-default base stands out at a glance
  • Ahead / behind counts versus the base branch - how many commits this branch has that the base doesn’t, and vice versa. The panel refreshes the base from the remote once when it opens, so the behind count reflects origin rather than your last pull; it does not re-fetch as files change
  • The last commit on the branch: short hash, subject, and relative time

While Uncommitted changes is selected, a segmented control at the top of the rail switches which set of changes the diff shows (selecting a specific commit in History shows that commit’s own diff instead, with no scope selector):

ScopeWhat it shows
WorkingUncommitted working-tree edits (git diff) - the active subset you are editing right now
StagedChanges added to the index (git diff --staged)
BranchEverything this branch has accumulated versus its base - the full pull request. Uses git merge-base, so upstream commits are excluded

A freshly opened panel starts on the scope set by Default Diff Scope (Settings > Changes, default Working). Switching scope is per-task, is remembered when you reopen the task, and re-reads the file list, since each scope surfaces a different set of files.

When a scope has nothing in it, the diff pane says which scope it searched rather than a bare “no changes” - an empty Working view reads “No uncommitted changes”, Staged reads “No staged changes”, and Branch names the base branch it compared against. A commit that touched no files says so too. Naming the scope is what keeps an empty pane from looking broken next to a History section full of commits.

The file list fills the rail: every changed file with a status icon, its path, and per-file insertion/deletion counts in an aligned right-hand column. The header above it reports the total file count and aggregate +/- lines.

Status icons: Added, Modified, Deleted, Renamed, Copied, and Untracked (new, uncommitted) files each get a distinct colored icon.

Controls above the list let you shape the view:

  • Filter files - type to narrow the list to matching paths
  • Sort - a menu with four orderings: Name, Status (additions first, deletions last), Size (most-changed first), and Extension. The current one is checked, so you can see what you are sorting by without clicking through a cycle
  • Tree / flat toggle - switch between a nested directory tree (single-child folders are compacted, VS Code style) and a flat list of full repo-relative paths. Sorting a flat list by status groups it under status headings, each with its own count
  • Collapse all / expand all - fold or unfold every directory at once (tree view only)

Each file row has a viewed checkbox. Check it to mark a file as reviewed and its row dims. The header keeps a running N/M count - grey before you start, accented while you work, green once every file is checked - with a thin progress fill riding its bottom edge. Stepping forward past a file’s last change with keyboard navigation marks it viewed automatically.

Viewed marks are per task and survive reopening the task, so a review you break off mid-way resumes where you left it.

Right-click any file for a context menu:

  • Open in editor - open the file in your OS default application
  • Reveal in file manager - show the file in your file browser
  • Copy path - copy the repo-relative path to the clipboard
  • View history - open the file’s commit history (git log --follow) in a popover; pick a commit to jump the diff to that commit
  • Open in new window - detach that one file’s diff into its own OS window (see Single-File Diff Windows)

Click a file to view its diff on the right. The first file is auto-selected when you open the panel, with the view centered on its first change.

Toggle between split (side by side) and inline (unified) layouts from the toolbar. This Git Diff View preference is saved globally and applies to every task and project - set it here or in Settings > Changes.

For Markdown files, a preview toggle (the eye icon) in the toolbar swaps the diff for a rendered view of the file’s new content (the old content for a deleted file), so you can read a doc as it will look instead of as a diff. The toggle resets per file.

The toolbar’s View options menu collects the rendering choices as named, checkable items rather than icons you have to hover to identify:

OptionDefaultWhat it does
Ignore whitespaceOffHide whitespace-only changes, so reformatting noise stops burying real edits
Collapse unchangedOffFold away large unchanged regions, leaving the changed hunks and a little surrounding context
Wrap long linesOffSoft-wrap long lines onto the next row instead of scrolling the diff horizontally. Applies to both split and inline mode
Inline when narrowOnRender a narrow diff pane inline (unified) even when Side by side is selected, instead of squeezing two columns. Turn it off to force side by side at any pane width

All four are app-wide preferences, shared with Settings > Changes - the menu’s Open settings item jumps straight to that tab. The menu stays reachable when no file is selected, so you can set up how diffs render before there is anything to review.

The same menu carries the blame toggle: a per-line gutter showing the short commit hash, author, and date that last touched each line, useful for telling agent-written lines apart from pre-existing code. Blame is the one item here that is not a preference - it is off by default, applies per file, and is never remembered. Because it annotates the file’s current working-tree content, it is unavailable in the Staged scope, while you browse a selected commit, and for binary or deleted files, which have no current content to annotate.

History is a collapsible section pinned to the bottom of the rail, and it starts collapsed. Its header row stays visible with a live commit count, so history is one click away without spending vertical space on it before you want it. Expanding it opens a browsable log of the branch, always led by a pinned Uncommitted changes row.

Below that row, the branch’s commits are drawn as a visual DAG: each commit is a node on a colored lane, with branch and merge lines between them. Each row shows the short hash, subject, author, and relative time. HEAD keeps a labelled badge - it is the one ref worth the ink at rail width - while the base branch and a linked PR’s head commit are marked with tone dots, their labels on hover, so the subject keeps the space. The graph is live - it redraws as commits land - and is capped at the most recent 200 commits to stay responsive on long histories, with a note when older commits are trimmed.

Drag the handle above the section to give the graph more of the rail; the height is remembered per task, and so is whether the section was open.

Selecting a commit scopes the diff to that commit alone (<commit>^..<commit>): the file list and diff show exactly what that commit changed, and a compact header at the top of the rail identifies it with a back control to return to Uncommitted changes. Collapse the section with a commit still selected and its short hash rides the header as a chip, so the selection stays legible with the list hidden. The working/staged/branch scope selector and the blame gutter apply only to Uncommitted changes, so both step aside while a historical commit is selected.

When a task window is focused, review the diff from the keyboard. Every binding is rebindable in Settings > Hotkeys (the Git Changes group).

ActionDefaultBehavior
Next ChangeAlt+Down / Option+Down (or F7)Jump to the next change. Past a file’s last change, continue into the next file
Previous ChangeAlt+Up / Option+Up (or Shift+F7)Jump to the previous change. Before a file’s first change, continue into the previous file
Next Changed FileAlt+Shift+Down / Option+Shift+DownSelect the next file in the tree
Previous Changed FileAlt+Shift+Up / Option+Shift+UpSelect the previous file in the tree

Since v0.30.0 the Changes panel is a detachable surface: a pop-out button in its header moves it into its own OS-level window, so you can put a task’s diff on a second monitor while the terminal stays in the main window. Each task gets its own pop-out window, and the window remembers its size, position, and monitor between openings. The same engine detaches the Browser pane, the Usage Stats Dashboard, and the Agent Monitor.

Closing the popped-out window leaves the panel closed, rather than reclaiming its share of the task window. While the window is open the header pill still reads Hide changes; once you close the window, click Show changes to bring the panel back inline. This is deliberately unlike the Browser pane, which does reclaim its split when its pop-out closes: a diff you sent to a second monitor and then finished with should not shove the terminal aside on its way out.

Since v0.37.0 a single file can leave the panel too. Double-click a file row - or pick Open in new window from its right-click menu - and that one file’s diff opens in its own OS window, so you can read it full-screen, or compare two files side by side.

  • One window per file. Double-clicking the same file again focuses the window it already has rather than opening a second. Each window is titled with the file’s name and the task it belongs to, so several stay tellable apart in the taskbar.
  • It opens maximized until you resize, move, or maximize one. From then on your own geometry is what later diff windows use.
  • Up to eight at once. Opening a ninth raises a toast asking you to close one first.
  • Read-only and live. It follows the split/inline layout and every one of your view options - whitespace, collapsed unchanged regions, wrapped long lines, inline-when-narrow - and updates as the file changes. Revert the change while the window is open and it shows an empty state rather than closing. A window scoped to a commit never refetches, since a commit’s diff cannot change.
  • Close it with its own window controls or Escape.

This works from every file list - the task detail embed, the standalone Changes dialog, and the detached Changes window - except the Command Terminal’s Changes view, which has no task to scope a window to.

The panel watches the working tree and git metadata, so it stays current on its own. As an agent edits files or you commit, stage, or switch branches, the file list, branch header, and the open diff refresh automatically - there is no manual refresh button. Updates are served from cache while a background re-read runs, so the view never flashes a loading spinner.

Remembered per taskApp-wide preferences
Diff scope, selected commit, selected file, which files you marked viewed, diff scroll position, rail width, whether History is expanded and its heightGit Diff View (split/inline), Default Diff Scope, File Sort, Flat File List, Ignore Whitespace, Collapse Unchanged Regions, Wrap Long Lines, Inline When Narrow

That split is the thing worth remembering: what you were reviewing is per task and returns you to where you left off, while how diffs render is one setting for every task and project. The app-wide preferences live under Settings > Changes, and the diff toolbar’s View options menu writes the same keys - see the Configuration Reference for keys and defaults. Blame is in neither column: it is per file and never remembered.

See also:

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

Star on GitHub