Diffs

Diffs open in Porcelain's own viewer: each side headed by its revision, paired line numbers down a centre gutter, and curved connectors joining each change to its counterpart. It's the default; porcelain.diff.viewer: native restores VS Code's diff editor.

Two compact floating windows. The smaller lists the three files that differ between two commits. The larger shows pool.ts in Porcelain's diff viewer with paired line numbers, an added block in green, and a curved connector to the matching point on the left.
A Changes window and the diff window. The file list stays put while the diff window is reused for every file you open.

Windows

Diffs and file lists open in their own compact windows, so they don't compete with your code for editor space. One diff window is reused for every later diff, so you never accumulate diff tabs; Pin keeps a diff out of that cycle. porcelain.diff.openIn: editorTab keeps everything in the main window, and editor builds that can't open a separate window fall back to tabs and say so once.

The title carries the position and both revisions (panel-store.ts · 3 of 7 · 07748ba ↔ af89dd2), and F7 / F7 step to the next and previous file. The position used to be a transient status-bar message, which the compact window never shows, hence the title.

The settings menu

Per window, forgotten when it closes. VS Code's diffEditor.* equivalents are global, which is why these have no native counterpart.

OptionValues
LayoutSide by side, or unified: old lines then new lines per change in one column. Modified lines keep their modified colouring on both halves, since an edited line isn't an addition.
IgnoreDo not ignore · leading and trailing whitespace · whitespace · whitespace and empty lines. The last two compare normalised copies, so re-indenting stops reading as a change while the chunks still address the real lines.
HighlightLine, word, character, or off.
Collapse unchanged fragmentsFolds long unchanged runs; click to open.
Synchronised scrollingOn, the panes track each other and a stalled side holds its anchor mid-window through a large insertion. Off, each pane scrolls on its own, seeded from wherever it already was.
Context linesHow many unchanged lines stay visible around a change when unchanged fragments are collapsed. Three (3) by default.
Swap sidesPuts the newer revision on the left.
The diff settings menu open in the top-right of a diff: View with Side by side and Unified selected; Whitespace with Do not ignore, Ignore leading and trailing, Ignore whitespaces, Ignore whitespaces and empty lines; Highlight granularity with By line, By word selected, By character, Off; Collapse unchanged ticked; Context lines 3 with minus and plus; Swap sides; Applies to this window only.
The settings menu. It says so at the bottom: applies to this window only.
The same router.ts diff in the unified layout: one column, with the old and new line numbers side by side on the left and the changed line highlighted.
Unified: one column, both line numbers.

The change stripe beside the scrollbar jumps to any change on click, the toolbar counts the differences live, and F finds within the diff.

Editing the working tree

When one side is the working tree, that side is a real editor: click anywhere and type, with selection, clipboard, IME composition and one coalescing undo/redo timeline. S saves to disk, and a dot marks unsaved edits. If the file changes on disk underneath you, a banner offers to reload or keep yours. Index and historical sides stay read-only, and Edit Source is still the way to the real file.

The working-tree side also carries the include, exclude and revert controls per hunk described under Commit.

What it won't render

Binary files show a placeholder with an Open in editor action. Images up to 10 MB per side render side by side; heavier ones degrade to the placeholder with both sizes. Text past 25,000 lines shows the placeholder with Show anyway. That limit was measured against the diff algorithm's budget (about 400 ms), so if it seems arbitrary, it isn't. Syntax highlighting covers six (6) grammars today and falls back to plain text for the rest.