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.
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.
| Option | Values |
|---|---|
| Layout | Side 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. |
| Ignore | Do 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. |
| Highlight | Line, word, character, or off. |
| Collapse unchanged fragments | Folds long unchanged runs; click to open. |
| Synchronised scrolling | On, 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 lines | How many unchanged lines stay visible around a change when unchanged fragments are collapsed. Three (3) by default. |
| Swap sides | Puts the newer revision on the left. |


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.