Skip to content
Skim

Fast diffs for people who live in the terminal

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.

skim: reviewing the browser build

Loading skim…

The tour

Familiar motions

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.

Move through it

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.

  • j kLine by lineThe motions are the vim ones, so nothing here has to be learned twice.
  • ]h [hChange to changeJump hunk to hunk and skip the context nobody is reviewing.
  • ]c [cComment to commentWalk the comments on the review, wherever in the diff they landed.
  • Ctrl-pAny file by nameFuzzy-find a file, or walk them in order with h and l. Three of these eight match "loading".
  • / nAnywhere it saysSmart-case search across every file, and n walks the matches.
skim: moving through a diff

Loading skim…

Read the change

One key per question: how it is laid out, what the code means, and who wrote the line under the cursor.

s · Tab

Unified and side-by-side

One key switches the layout. Tab cycles the hunk between all lines, additions only, and deletions only.

13 grammars

Tree-sitter highlighting

Real grammars, not regex. Parsing runs off the render thread, so a large file does not stall the scroll.

r · B

Refresh and blame

r reloads the diff from git and keeps your position. B toggles git blame in the gutter.

Act on it

A review ends in comments and staged work. Both happen in the diff, with no second window.

Enter · y · Y

Inline comments

Enter attaches a comment to the line under the cursor. y copies one to the clipboard, Y copies all of them.

a · A · S

Staging and Graphite

a stages the current file, A stages all of them. S opens the Graphite stack to move between stacked PRs.

Ctrl-e

Agent panel

An agent runs in a side panel over ACP. @file embeds a file from the diff into the prompt.

Agents

Comments go both ways

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.

skim: src/line_map.zig

Loading skim…

skim: agent panel

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

Run it in your terminal, or here on the web

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.

In your own terminal

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 changes

Build from source · See all keybindings

Here on the web

Paste 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.