A native, minimal, local diff viewer for reviewing Git changes and committing them: a reimplementation of codiff in Go with MyGo's native UI. No webview, no JavaScript: the window is drawn by MyGo on the GPU, with the system's fonts, accent color, dark mode, menus and vibrancy.
- Review local changes: staged, unstaged and untracked files against
HEAD, in one scrolling surface of file cards with sticky headers. - Split and unified diffs with syntax highlighting (codiff's Licht and Dunkel palettes), word-level change highlighting, and unchanged lines that expand 100 at a time or all at once. New and deleted files show in one column.
- Viewed files: marking a file viewed collapses it, and it opens again
once it changes. Generated files (lockfiles,
*.min.js,linguist-generated, …) and dependency folders start collapsed. - Review comments: click a line, or press J/K to choose a hunk and Enter, then copy every comment as Markdown, with the diff around it, for an agent or a colleague.
- Commit the files you choose, with a subject and a summary, from the sidebar's Commit button. Other staged work stays staged.
- History: browse commits and review any of them, or compare the work tree with a branch.
- Pull requests, after pulls.review: list the open pull requests of the repository's GitHub remote (⌘3) and review any of them, open or not. Godiff fetches its commits into your clone, so it reads as local changes do: highlighted, expandable, with pictures. Its files group by kind (code, tests, docs, config, dependencies, generated), each group with how much of it you viewed; review threads show under their lines, to reply to and resolve; comments go out alone or into your review, which you submit as a comment, an approval or a request for changes. A banner says when new commits are pushed.
- AI review: a coding agent installed on your machine — Claude Code, Codex, OpenCode or Pi — reviews the changes, a pull request's or your own: it summarizes them, groups the files by intent, and notes the lines that deserve attention, marking what needs care. It runs read-only, with the agent's own sign-in, and its review is kept until you ask for another. Choose the agent and the model in the review's card, among those the agent lists, of any of its providers; by default OpenCode reviews with the model it starts with itself. The card lists the notes, and the file tree marks the files with some: click one, or press N and ⇧N, to go from note to note.
- Find in diffs (⌘F), a file filter (⌘P) and a command bar (⌘K).
- Image previews of changed pictures, a file tree with change counts and status letters, and a banner when the work tree changes.
- Sidebar navigation selects files, directories, commits and pull requests on pointer press, showing the new selection as the sidebar takes focus. Directory disclosure and button actions activate on release.
- File icons of each kind of file, in its color, as codiff's file tree draws them: the icons of @pierre/trees.
go run . [<commit> | <branch> | <pull request>] [<path>]godiffreviews the uncommitted changes of the repository you are in.godiff HEAD~1reviews a commit, against its first parent.godiff maincompares the work tree, committed or not, with where it branched offmain.godiff --pr 123,godiff owner/repo#123orgodiff https://github.com/owner/repo/pull/123reviews a pull request of the repository's GitHub remote (upstream, elseorigin).godiff ../other-repoopens another repository.
Every repository opens in a window of its own. Godiff → Install Command Line
Tool… installs a godiff command that opens the app on the repository it
runs in. Started from Finder or the Dock, the app reopens the repository opened
last, and File → Open Recent lists the ten opened lately.
| Keys | |
|---|---|
| ⌘K | Command bar |
| ⌘P | Filter files |
| ⌘F | Find in diffs |
| J / K | Next / previous hunk |
| N / ⇧N | Next / previous AI note |
| Enter | Comment on the hunk chosen |
| ⌘↩ | Add the comment; commit, in the commit view |
| ⌘⇧B | Toggle the sidebar |
| ⌘1 / ⌘2 / ⌘3 | Files / History / Pull requests |
| ⌘⇧I | Review with AI |
| ⌥Z | Toggle word wrap |
| ⌘⇧O | Open the file in your editor |
| ⌘R | Refresh the changes |
| ⌘+ / ⌘- / ⌘0 | Code font size |
| ⇧? | All the shortcuts |
Settings live in ~/.godiff/godiff.jsonc (Godiff → Open Config File…),
with codiff's names, and apply to open windows as the file changes:
Files open in $GODIFF_EDITOR or editorCommand ({file}, {line} and
{repo} are replaced), else VS Code, else the app the system opens them with.
Pull requests need no token to be read when they are public; to comment
and review, or to read private ones, sign in with the GitHub CLI (gh auth login), or set githubToken or $GH_TOKEN.
go tool mygo dev # the app, rebuilt as you edit
go test ./... # including the views, run without a window
go tool mygo build # Godiff.app and a disk image in build/
go run ./tools/genicon # render resources/icon.svg to the app icon
go run ./tools/genfileicons <@pierre/trees package> # update the file iconsGODIFF_SNAPSHOTS=<dir> go test . saves PNGs of the views the tests drive, and
GODIFF_CAPTURE=<file.png> makes the app save a picture of its window once
loaded, then quit. GODIFF_DEBUG=1 logs every git command with its duration, the
frames that take more than 4ms to build, and whenever the main thread keeps
work waiting over 30ms. GODIFF_NAME=<name> runs a build apart from the
installed app, which would otherwise take its windows, and
GODIFF_STARTUP_PROFILE=<file> writes a CPU profile of the first seconds.
The code is in a few parts:
internal/git: the repository through thegitcommand: changes, history, commits, generated files, file contents (git cat-file --batch).internal/diff: parsing patches, and word-level differences.internal/highlight: syntax highlighting with Chroma.- The
mainpackage: the window and its views (view.go,sidebar.go,diffview.go,commit.go,palette.go), the rows of the diff surface (rows.go), comments, find, settings and menus.
LLM walkthroughs, GitHub and GitLab pull request review, Markdown previews,
editing files in place, definition lookup, a..b ranges, and separate cards
for the staged and unstaged parts of a file (Godiff shows a file's changes
against HEAD as one).
{ "settings": { "codeFontFamily": "", // e.g. "JetBrains Mono"; empty is SF Mono "codeFontSize": 13, "copyCommentsOnClose": false, "diffStyle": "split", // or "unified" "editorCommand": "", // e.g. "zed {file}:{line}" "githubToken": "", // empty uses the GitHub CLI's (gh auth login) "aiAgent": "", // claude, codex, opencode or pi; empty is the first installed "aiModel": "", // e.g. "sonnet" or "deepseek/deepseek-flash"; empty is the agent's default "reviewCommentsPrefix": "# Address these Review Comments", "sidebarPosition": "left", // or "right" "showWhitespace": false, "theme": "system", // or "light", "dark" "wordWrap": false } }