A beautiful, snappy, and highly interactive tool for exploring diffs without leaving your terminal.
Go
100
61 commits
updated Sep 27, 2026
A beautiful, snappy, and highly interactive tool for exploring diffs without leaving your terminal.
Run dv with no arguments to see changes currently tracked by git, or pipe a diff directly into it.
[!NOTE]
dvis currently in beta, but I'd love your early feedback! Feel free to open a Discussion to chat about ideas or an Issue to raise a bug.
https://github.com/user-attachments/assets/e9beadc9-0e77-47e2-86aa-bb869c657863
Install it using Homebrew:
brew install darrenburns/homebrew/dv
Alternatively install using Go (ensure $GOPATH/bin or $HOME/go/bin is in your PATH):
go install github.com/darrenburns/dv@latest
Then run it like this:
dv
dv displays your current staged/unstaged files from git.
You can also pipe a diff directly into dv:
git diff | dv
gh pr diff <number> | dv
Most keybinds are documented either in the footer, command palette (ctrl+p), or in the UI itself.
Some things that aren't as clear at the moment:
r to refresh files tracked by gitctrl+h/ctrl+l to shift it left/right./ from the file tree or diff view to filter files (if the sidebar is hidden, this opens it). While the filter input is focused, up/down move through matching files, tab moves focus back to the tree, and esc clears the filter.y to copy the active file or directory path to your clipboard (also available via the command palette).m to toggle seen on the active file, or M to clear all seen marks (both are also available in the command palette).ctrl+j/ctrl+k to move to the next/previous file (same as n/p).There are a few CLI options available for customising dv.
| Flag | Values | Default |
|---|---|---|
--view | unified, split | unified |
--sidebar | true, false | true |
--theme | any built-in theme name (for example catppuccin, dracula, nord) | obsidian-tide |
--intraline-style | background, underline, off | background |
--show-symbols | true, false | false |
--ignore-whitespace | true, false | false |
--config | path to a YAML config file | auto-discover via XDG |
--no-config | true, false | false |
Example using all options:
dv --view split --sidebar=false --theme catppuccin --intraline-style underline --show-symbols
dv can load startup defaults from a YAML config file.
Default path:
$XDG_CONFIG_HOME/dv/config.yaml
This path is resolved using xdg.ConfigHome via the github.com/adrg/xdg package.
Precedence:
You can also use:
--config /path/to/config.yaml to load an explicit file path.--no-config to disable config loading for a run.Example config file:
view: split
sidebar: true
theme: catppuccin
intraline-style: underline
show-symbols: false
ignore-whitespace: true
Notes:
--flag value and --flag=value work.--flag=false when disabling.ignore-whitespace is unavailable in piped mode (git diff | dv); apply whitespace flags before piping.198 followers · starred Feb 2026
399 followers · starred Feb 2026
122 followers · starred Feb 2026
1,008 followers · starred Feb 2026
A beautiful, snappy, and highly interactive tool for exploring diffs without leaving your terminal.
Go
100
61 commits
updated Sep 27, 2026
A beautiful, snappy, and highly interactive tool for exploring diffs without leaving your terminal.
Run dv with no arguments to see changes currently tracked by git, or pipe a diff directly into it.
[!NOTE]
dvis currently in beta, but I'd love your early feedback! Feel free to open a Discussion to chat about ideas or an Issue to raise a bug.
https://github.com/user-attachments/assets/e9beadc9-0e77-47e2-86aa-bb869c657863
Install it using Homebrew:
brew install darrenburns/homebrew/dv
Alternatively install using Go (ensure $GOPATH/bin or $HOME/go/bin is in your PATH):
go install github.com/darrenburns/dv@latest
Then run it like this:
dv
dv displays your current staged/unstaged files from git.
You can also pipe a diff directly into dv:
git diff | dv
gh pr diff <number> | dv
Most keybinds are documented either in the footer, command palette (ctrl+p), or in the UI itself.
Some things that aren't as clear at the moment:
r to refresh files tracked by gitctrl+h/ctrl+l to shift it left/right./ from the file tree or diff view to filter files (if the sidebar is hidden, this opens it). While the filter input is focused, up/down move through matching files, tab moves focus back to the tree, and esc clears the filter.y to copy the active file or directory path to your clipboard (also available via the command palette).m to toggle seen on the active file, or M to clear all seen marks (both are also available in the command palette).ctrl+j/ctrl+k to move to the next/previous file (same as n/p).There are a few CLI options available for customising dv.
| Flag | Values | Default |
|---|---|---|
--view | unified, split | unified |
--sidebar | true, false | true |
--theme | any built-in theme name (for example catppuccin, dracula, nord) | obsidian-tide |
--intraline-style | background, underline, off | background |
--show-symbols | true, false | false |
--ignore-whitespace | true, false | false |
--config | path to a YAML config file | auto-discover via XDG |
--no-config | true, false | false |
Example using all options:
dv --view split --sidebar=false --theme catppuccin --intraline-style underline --show-symbols
dv can load startup defaults from a YAML config file.
Default path:
$XDG_CONFIG_HOME/dv/config.yaml
This path is resolved using xdg.ConfigHome via the github.com/adrg/xdg package.
Precedence:
You can also use:
--config /path/to/config.yaml to load an explicit file path.--no-config to disable config loading for a run.Example config file:
view: split
sidebar: true
theme: catppuccin
intraline-style: underline
show-symbols: false
ignore-whitespace: true
Notes:
--flag value and --flag=value work.--flag=false when disabling.ignore-whitespace is unavailable in piped mode (git diff | dv); apply whitespace flags before piping.198 followers · starred Feb 2026
399 followers · starred Feb 2026
122 followers · starred Feb 2026
1,008 followers · starred Feb 2026