Unified and side-by-side
One key switches the layout. Tab cycles the hunk between all lines, additions only, and deletions only.
Your agents move fast; the review should too. Move file to file, switch unified and side-by-side, comment on a line, stage a file, then hand the diff to an agent in the side panel without leaving. Skim shells out to git, so it runs in any repo without setup.
Loading skim…
The tour
hjkl moves, /searches, n walks the matches,gg and G go to the ends. Vim's keys, on a diff. Getting to the line, reading the change, and acting on it are all keystrokes. The full list is in thekeybindings reference.
The terminal below is running skim, and it makes every move the legend names. Click into it to take over: the tour stands down and hands back the keys.
Loading skim…
One key per question: how it is laid out, what the code means, and who wrote the line under the cursor.
One key switches the layout. Tab cycles the hunk between all lines, additions only, and deletions only.
Real grammars, not regex. Parsing runs off the render thread, so a large file does not stall the scroll.
r reloads the diff from git and keeps your position. B toggles git blame in the gutter.
A review ends in comments and staged work. Both happen in the diff, with no second window.
Enter attaches a comment to the line under the cursor. y copies one to the clipboard, Y copies all of them.
a stages the current file, A stages all of them. S opens the Graphite stack to move between stacked PRs.
An agent runs in a side panel over ACP. @file embeds a file from the diff into the prompt.
Agents
Skim exposes an MCP server and a CLI for reading and writing comments, so an agent reaches a running session either way: get_comments and add_comment over MCP, or skim comment list and skim comment add from a shell. It reads the comment you wrote on a line, and writes its own back onto the diff you are reading. Below is one skim: the diff on the left, its agent panel on the right, and the comments crossing between them.
Loading skim…
The agent's replies are a recording. Its reads and writes are not. Skim answers get_comments and add_comment here through the same handlers its MCP server calls.
Try it
Skim compiles to a native binary and to WebAssembly, so a browser tab runs the same renderer a terminal does. Build it for the repo on your disk, or paste a pull request and read it right here.
Skim needs Zig 0.16.0 and git. There is no other dependency. The binary lands at ./zig-out/bin/skim.
$ git clone https://github.com/ctdio/skim.git
$ cd skim
$ zig build -Doptimize=ReleaseFast # optimized binary
$ ./zig-out/bin/skim # review working-dir changesPaste any public pull request and review it full screen. The diff is read from GitHub and parsed in the tab. Nothing is uploaded, and there is nothing to install.
Or open it full screen on the demo diff.