OmniDiff: the git difftool in Rust that competes with difftastic ✅ yoDEV Tested

OmniDiff is an alternative to git diff written in Rust that compares code by its syntactic structure, not line by line. In our test with 283 real changes from ripgrep and Flask, it was the only one of three tools that marked moved code as moved. Version 0.3.0 arrived at crates.io on November 1, 2026, and that same day it was featured on Show HN.

diff-vs-omnidiff

:white_check_mark: yoDEV Tested · November 2, 2026
We compiled OmniDiff 0.3.0, difftastic 0.72.0, and delta 0.20.1 from crates.io and compared them on Linux across 283 real changes from ripgrep and Flask. The results we report as ours come from that test.

What is OmniDiff?

OmniDiff is a diff viewer and backend for git difftool that parses both versions of a file with tree-sitter and compares syntax trees instead of lines. It’s what’s known as syntax aware git diff or tree-sitter diff.

It structurally analyzes 25 languages: C, C#, C++, CSS, Go, HTML, Java, JavaScript, JSON, Kotlin, Lua, Perl, PHP, Python, R, Ruby, Rust, Scala, Bash, Swift, TSX, TypeScript, Vimscript, XML, and YAML. Bazel, Dart, Emacs Lisp, Markdown, Protocol Buffers, and SQL are recognized, but compared as text.

It also goes beyond code: images, fonts, compressed files, cursors, message catalogs, and PDFs are recognized by their bytes and compared by their content.

It works in three ways: an interactive two-panel interface in the terminal (the default option), plain text with --headless, or a single JSON object with --mode json for editor integrations.

The author declares in the README that the project is developed with substantial AI assistance (Claude Code), and commits carry a Co-Authored-By trailer. For now, it doesn’t accept contributions.

How does OmniDiff differ from difftastic and git delta?

In short: delta colors the usual line-based diff from git; difftastic and OmniDiff replace it with a structural diff based on tree-sitter.

  • delta (git delta) makes the output of git diff easier to read: syntax highlighting, changed words within a line, side-by-side view. But the underlying algorithm is still git’s line-based approach. If a function moves, delta shows it deleted in one place and added in another.
  • difftastic is the established structural diff, also based on tree-sitter. It understands that a reformatted expression hasn’t changed, but in our test it didn’t detect a moved function.
  • OmniDiff uses a tree diff algorithm (APTED, as the author explained on Hacker News) and detects and labels moved code explicitly.

On Hacker News, the author claims that for code difftastic supports, OmniDiff is completely correct on 90 percent of diffs versus 64 percent for difftastic. This is a measurement by the author and the README doesn’t repeat it. That’s why we did our own.

Which is faster at comparing code: OmniDiff, difftastic, or delta?

We compiled all three tools from crates.io and ran them on each modified code and configuration file in the last 80 commits of ripgrep (Rust) and Flask (Python): 283 before/after pairs on a 2 vCPU Linux machine. Times are wall clock per file and include process startup.

Tool Median p90 p99 Slowest Failures
OmniDiff 0.3.0 21.7 ms 176.5 ms 693 ms 803 ms 0
difftastic 0.72.0 28.1 ms 141.2 ms 1,734 ms 2,040 ms 0
delta 0.20.1 23.5 ms 31.4 ms 39.9 ms 51.5 ms 0

Three takeaways:

  1. delta is the fastest and most stable, because it does cheaper work: a colored line diff. It’s not a flaw; it’s a different tool.
  2. Between the two structural tools, OmniDiff won on median and worst cases. Its slowest file took 803 ms; difftastic’s took over two seconds. difftastic was faster at p90.
  3. Rust files are the expensive case for both: 72 ms median for OmniDiff and 95 ms for difftastic, versus less than 10 ms for TOML and YAML.

What happens when you move a function?

This is where the difference shows. We took a small Python file, moved parse() above load_config(), moved load_config() to the end, and added a sep parameter to parse() and a check for blank lines.

  • OmniDiff marked the block as Moved from lines 10-13 and colored only the real changes: the new parameter, the two new lines, and partition(sep).
  • difftastic showed load_config deleted at the top and added at the bottom.
  • delta did the same as plain git: one deleted block and one added block.

In a pull request full of refactorings, that’s the difference between reviewing three changed lines and re-reading an entire function.

How do you install OmniDiff?

The fastest way on any platform with Rust installed:

cargo install --locked omnidiff

It requires Rust 1.92 or later and a C compiler. Be patient with compilation: on our 2 vCPU machine it took 14 and a half minutes.

Other ways, all documented in the README:

  • Precompiled binaries in each GitHub release, for Linux, macOS (Intel and Apple Silicon), and Windows.
  • Homebrew, via the ivankovic/omnidiff tap, on macOS and Linux.
  • Debian/Ubuntu: signed .deb packages for amd64 and arm64 from the project’s apt repository.
  • Nix: nix run github:ivankovic/omnidiff (with flakes enabled).
  • Arch and Gentoo: recipes in the packaging/ directory of the repository.
  • VS Code (also on Open VSX) and Neovim. Note: an extension can’t yet replace VS Code’s built-in diff view.

How do you use OmniDiff with git diff and git difftool?

The interactive way is omnidiff git configure, a wizard that sets it up globally or per repository. If you prefer to do it manually:

git config --global difftool.omnidiff.cmd 'omnidiff "$LOCAL" "$REMOTE"'
git config --global diff.tool omnidiff
git config --global difftool.prompt false

And then:

git difftool

The important detail: git diff and git log -p never open OmniDiff on their own. They still show the normal git diff. To pipe them through OmniDiff, set the external diff variable:

GIT_EXTERNAL_DIFF=omnidiff git diff

We tested both ways on Flask’s history and both worked. OmniDiff switches to plain text output only when not writing to a terminal. If you want to brush up on the basic commands around all this, we have a guide to the 15 git commands every software engineer uses.

If you use Jujutsu, there’s omnidiff jj configure; the README notes that diff-invocation-mode should be file-by-file.

Two flags worth knowing: --minimal paints only ranges that add meaning, and --full paints everything. The tool’s help describes them as two faithful readings of the same diff, not one correct and one wrong.

How accurate is OmniDiff?

The README is unusually frank: the author’s accuracy target hasn’t been met yet. According to the README we read on November 2, 2026, across 1,419 hand-labeled cases, 60.0 percent have zero discrepant bytes in --full mode and 69.6 percent in --minimal, versus a target of 90 percent. “Discrepant” means a byte whose highlighting doesn’t match the reference labeled by a person, not a wrong diff, and the README clarifies that most remaining errors come from highlighting rules, not the matching algorithm.

Robustness is more solid: across about 442,530 code pairs from 7,500 open source repositories, 99.95 percent finished within a 120-second and 6 GB limit. In our test of 283 pairs, none failed.

These numbers have changed between versions, so take them as a snapshot in time.

Is OmniDiff free?

Yes, under AGPL-3.0-only license (version 0.2.0 was “or later”; 0.2.1 and 0.3.0 are “only”). Using it as your personal difftool poses no problem. If your company wants to integrate or use it internally without AGPL’s obligation to publish code, the author sells a commercial license as a GitHub Sponsors monthly subscription. difftastic and delta, by comparison, are MIT licensed.

Should you switch from difftastic or delta?

If what you want is for git diff to look better, delta is still the lowest-friction option. If you already use difftastic and review lots of refactorings, it’s worth installing OmniDiff alongside it: detecting moved code is exactly what difftastic didn’t do in our test, and on our file set it was faster on slow cases. Keep in mind, though, that it’s a 0.x project with closed contributions and an accuracy target its own author acknowledges it hasn’t reached yet.


What about you? What tool do you use today to review diffs in the terminal?

What matters most to you in a diff tool?
  • Detects moved code
  • Fast on large files
  • Integrates with my editor
  • I prefer another option (tell us which)
0 votantes

Comment below or, if this article reached you by email, reply directly to the email: your reply is published here.

Related: How to see your agent’s git diff in the browser before commit with Diffle