Skip to main content
株式会社オブライト
Software Development2026-11-029 min read

OmniDiff Explained: A Syntax-Aware Git difftool in Rust

Install, Usage, and How It Differs from hunk, difftastic and delta (2026)

OmniDiff is a Rust Git difftool (AGPL-3.0-only) that parses code with tree-sitter and shows only what changed. Install, git difftool setup, comparison with hunk, difftastic and delta, author-reported metrics and caveats. Updated Nov 2026.


OmniDiff is a Rust-based Git difftool that reads code as a syntax tree and shows only the parts that actually changed. Where a classic diff marks whole lines as deleted and inserted, it narrows changes down to expressions and even code inside strings. In short, it is worth trying for large refactors and generated-code diffs, but it is an early 0.x release, licensed AGPL-3.0-only, and the author is not accepting outside contributions. Treat it as something to run alongside your current tools, not a new default.

The latest release, v0.3.0, shipped on November 1, 2026, the same day a Show HN post about it collected 143 points on Hacker News. The GitHub repository had 383 stars as of November 2, 2026. Some of the performance and accuracy figures the author publishes still fall short of the stated goals (details below).

What is OmniDiff?

OmniDiff builds syntax trees with tree-sitter and highlights only the changed parts. It can be used as an interactive TUI viewer, as plain-text batch output, or as JSON output. The author is Marko Ivankovic, and commit trailers disclose that development uses AI assistance, currently Claude Code. The tool was renamed from CodeDiff to OmniDiff in v0.2.0 on October 1, 2026.

ItemDetails (from the README and Releases)
AuthorMarko Ivankovic (individual developer)
LicenseAGPL-3.0-only (a commercial license is offered as a monthly GitHub Sponsors subscription)
LanguageRust
Latest versionv0.3.0 (November 1, 2026)
Languages25 parsed with tree-sitter (6 more recognized but diffed as plain text)
DistributionHomebrew, cargo, Nix, apt, and prebuilt binaries on Releases (Linux / macOS / Windows)
External contributionsNot accepted at this time (to keep development speed high)

What it can do

FeatureDetails
Syntax-level diffMarks only the changed parts instead of whole lines. v0.2.0 improved detection of copied code, moved comments and aligned runs of changed statements
Code inside stringsDiffs embedded code as code, such as TSX inside JSON or shell inside YAML (v0.3.0). CSS class lists are compared class by class
Images, archives, fonts, PDFsPictures are compared by pixels (animated GIF/PNG/WebP frame by frame); zip, tar, gzip, xz, bzip2, fonts, message catalogs and PDFs are compared by their contents. Other binaries show a one-line "Binary file differs"
TUIInteractive viewer. Press ? for the key list and o to pick files
Headless / JSON--headless prints plain text and --mode json emits JSON (the JSON Schema is in the repo). Output switches to text automatically when stdout is not a terminal
Git, jj and editorsWorks with Git difftool, Jujutsu (jj), a VS Code extension and a Neovim plugin
Where diff tools sit: line-based vs syntax-aware, and printed output vs interactive TUI

The map above places the tools on two axes. Horizontally, the left is line-based diffing and the right is content (syntax) aware diffing. Vertically, the top is an interactive TUI and the bottom is printed output (a pager or CLI). delta is a line-based pager that makes git's diff easier to read, difftastic is syntax-aware and prints its result to the terminal, hunk is an interactive review viewer built on git's own diff, and OmniDiff combines syntax-aware diffing with an interactive TUI.

Install and pricing

The main ways to install are below. Releases also carries prebuilt binaries for Linux, macOS (Intel and Apple Silicon) and Windows. Installing with cargo compiles every tree-sitter grammar from C, so expect a few minutes.

# Homebrew (macOS / Linux)
brew install ivankovic/omnidiff/omnidiff

# Cargo (builds from source; needs a C compiler and Rust 1.92+)
cargo install --locked omnidiff

# Nix (run without installing)
nix run github:ivankovic/omnidiff

Debian and Ubuntu (amd64 and arm64) have a signed apt repository. Recipes for Arch and Gentoo live in the repository's packaging/ directory.

sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://ivankovic.github.io/omnidiff/apt/omnidiff-archive-keyring.gpg | sudo tee /etc/apt/keyrings/omnidiff-archive-keyring.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/omnidiff-archive-keyring.gpg] https://ivankovic.github.io/omnidiff/apt stable main" | sudo tee /etc/apt/sources.list.d/omnidiff.list > /dev/null
sudo apt update && sudo apt install omnidiff

It is free under AGPL-3.0-only. For internal use inside organizations, a commercial license is available as a monthly GitHub Sponsors subscription; we have not confirmed the amount, so none is listed. Running it as a local tool on your own machine is generally not a problem. If you modify it and distribute it, or offer it over a network, AGPL obligations apply. Before embedding it in a company product, read the LICENSE and consult a professional if needed.

Quick start

1. Install it (any of the methods above)
2. Register it with Git using omnidiff git configure (choose global or the current repo)
3. Open the interactive TUI with git difftool --tool=omnidiff
4. To look at just two files, run omnidiff before.rs after.rs

# Interactive wizard (choose global or the current repo)
omnidiff git configure

# Or configure manually
git config difftool.omnidiff.cmd 'omnidiff "$LOCAL" "$REMOTE"'

# View the diff in the TUI
git difftool --tool=omnidiff

# Plug into git diff without difftool config (plain-text output)
GIT_EXTERNAL_DIFF=omnidiff git diff

# Compare two files directly
omnidiff before.rs after.rs

One thing to remember: the TUI opens only through git difftool. git diff and git log -p just print plain text and never open the TUI. Inside the TUI, ? lists the keys, o picks files (in the empty viewer you get when launching with no arguments), b toggles half-block and graphics picture rendering, g shows every changed glyph or picture at once, and Enter opens a text member of an archive in a full diff view. For CI, use --headless, --mode json and --exit-code (adds 1 to the exit code when files differ). Exit codes are 0 for success and 2 for an error. Disable color with --color never or NO_COLOR=1; truecolor needs COLORTERM=truecolor.

For Jujutsu (jj), run omnidiff jj configure. Manual setup adds a merge-tools.omnidiff entry and requires diff-invocation-mode set to file-by-file. jj diff renders plain text; to get the full TUI, run omnidiff BEFORE AFTER directly. On the editor side there is a VS Code extension (omnidiff-vscode, also on Open VSX) and omnidiff.nvim for Neovim, but the README says VS Code's built-in diff view cannot be replaced yet.

How it differs from hunk, difftastic and delta

ToolHow it computes the diffDisplayImplementation / licenseBest for
OmniDiffSyntax tree (tree-sitter) pinpoints changesInteractive TUI plus text / JSONRust, AGPL-3.0-onlyLarge refactors, and diffs that include images, archives and the like
hunkDisplays git's diffInteractive viewer (multi-file sidebar, AI annotations)Node.js 18+, MITReviewing changes made by AI agents
difftasticStructural diff via tree-sitterSide-by-side printed output (not an interactive viewer)Rust, MITQuickly viewing syntax-aware diffs in the terminal
deltagit's line-based diffPager (word-level highlighting, side-by-side)Rust, MITMaking everyday git diff and git log -p easier to read
git diff (standard)Line-basedPlain textShips with gitQuick checks with no setup; binaries show only "Binary files differ"

A practical split: keep delta as the pager for everyday git diff, and open OmniDiff through git difftool only for large refactors. If you want to review AI agent changes with annotations, hunk fits better. difftastic suits people who want syntax-aware results printed to the terminal. Each tool has a different strength, so there is no need to pick just one.

Performance and accuracy (author-reported)

The numbers below are published by the author in the README and were measured on the author's laptop. They are not independently verified.

ItemAuthor-reported value
Speed goalMedian under 100 ms, p99 under 1000 ms
Measured speed (2,302 fixtures)p50 4.2 ms, p90 35.1 ms, p99 177 ms, slowest 482 ms. Archives miss the p99 goal
Robustness442,322 of 442,530 code file pairs (99.95%) finished within the 120 s budget and 6 GB memory cap
Content-specific algorithmsUsed for 98.8% of changes
Accuracy (byte level)60.0% of test cases have zero mismatched bytes with --full, 69.6% with --minimal. The README states the accuracy targets are not yet met

Caveats and poor fits

- Early 0.x software, renamed from CodeDiff at v0.2.0. If you installed under the old name, reinstall and reconfigure
- AGPL-3.0-only: modifying and distributing it, or offering it over a network, carries obligations
- External contributions are closed, so it is effectively a one-person project and its long-term continuity is uncertain
- git diff and git log -p never open the TUI; it opens only via git difftool or a direct run
- VS Code's built-in diff view cannot be replaced yet
- cargo install needs a C compiler and Rust 1.92+, and takes a few minutes to build
- Accuracy goals are unmet, and archives also miss the p99 speed goal
- Markdown, SQL, Protocol Buffers and similar formats are compared as plain text

If you are thinking about reviewing AI agent changes, see Whiteboard and worktrunk, which gives each agent its own worktree. We cover the agent side in the Claude Code complete guide. Note that the author discloses that OmniDiff itself is developed with Claude Code assistance.

FAQ

Is OmniDiff free? Can I use it commercially?

It is free, under AGPL-3.0-only. Running it as a local tool on your own machine is generally not a problem, but modifying and distributing it or offering it over a network brings AGPL obligations. If you plan to embed it in a company product, read the LICENSE and consult a professional if needed. A commercial license for internal organizational use is available as a monthly GitHub Sponsors subscription.

Can I use it with plain git diff?

You can plug it in with GIT_EXTERNAL_DIFF=omnidiff git diff, but the output is plain text and the TUI does not open. For the interactive TUI, configure it (for example with omnidiff git configure) and run git difftool --tool=omnidiff.

How is it different from difftastic?

Both are Rust tools that use tree-sitter for structural diffs. difftastic prints side-by-side results to the terminal and is not an interactive viewer. OmniDiff adds an interactive TUI, diffing of code inside strings, images, archives and PDFs, and JSON output. difftastic is MIT-licensed; OmniDiff is AGPL-3.0-only.

Which languages are supported?

25 languages are parsed, including C, C++, C#, Go, Java, JavaScript, TypeScript, Python, Rust, Ruby, PHP, Kotlin, Swift, Shell, YAML and JSON. Markdown, SQL, Protocol Buffers, Bazel, Dart and Emacs Lisp are recognized but diffed as plain text. UTF-16 and UTF-32 text were added in v0.2.1.

Does it work on Windows?

Releases includes a prebuilt Windows binary. We have not verified how well Git and editor integrations work on Windows, so check the README and Issues before relying on it.

References

Related free tools (no sign-up, instant results)

Feel free to contact us

Contact Us