Difftastic

Developer Tools

A structural diff tool that compares syntax trees rather than lines.

Latest 0.70.0 · by Wilfred HughesWebsiteWilfred/difftastic

Release activity

Release activity — 5 releases across 5 days in the last year. Each cell is one day; darker means more releases that day. Older weeks are hidden at this screen width.
MayJunJulAug
SundayNo releases on Apr 26, 2026No releases on May 3, 2026No releases on May 10, 2026No releases on May 17, 2026No releases on May 24, 2026No releases on May 31, 2026No releases on Jun 7, 2026No releases on Jun 14, 2026No releases on Jun 21, 2026No releases on Jun 28, 2026No releases on Jul 5, 2026No releases on Jul 12, 2026No releases on Jul 19, 2026No releases on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026
MondayNo releases on Apr 27, 2026No releases on May 4, 2026No releases on May 11, 2026No releases on May 18, 2026No releases on May 25, 2026No releases on Jun 1, 2026No releases on Jun 8, 2026No releases on Jun 15, 2026No releases on Jun 22, 2026No releases on Jun 29, 2026No releases on Jul 6, 2026No releases on Jul 13, 2026No releases on Jul 20, 2026No releases on Jul 27, 2026No releases on Aug 3, 2026No releases on Aug 10, 2026
TuesdayNo releases on Apr 28, 2026No releases on May 5, 2026No releases on May 12, 2026No releases on May 19, 2026No releases on May 26, 2026No releases on Jun 2, 2026No releases on Jun 9, 2026No releases on Jun 16, 2026No releases on Jun 23, 2026No releases on Jun 30, 2026No releases on Jul 7, 2026No releases on Jul 14, 2026No releases on Jul 21, 2026No releases on Jul 28, 2026No releases on Aug 4, 2026No releases on Aug 11, 2026
WednesdayNo releases on Apr 29, 2026No releases on May 6, 2026No releases on May 13, 2026No releases on May 20, 2026No releases on May 27, 2026No releases on Jun 3, 2026No releases on Jun 10, 2026No releases on Jun 17, 2026No releases on Jun 24, 2026No releases on Jul 1, 2026No releases on Jul 8, 2026No releases on Jul 15, 2026No releases on Jul 22, 2026No releases on Jul 29, 2026No releases on Aug 5, 2026
Thursday1 release on Apr 30, 2026No releases on May 7, 2026No releases on May 14, 2026No releases on May 21, 2026No releases on May 28, 2026No releases on Jun 4, 2026No releases on Jun 11, 2026No releases on Jun 18, 2026No releases on Jun 25, 2026No releases on Jul 2, 2026No releases on Jul 9, 2026No releases on Jul 16, 2026No releases on Jul 23, 2026No releases on Jul 30, 2026No releases on Aug 6, 2026
FridayNo releases on May 1, 2026No releases on May 8, 2026No releases on May 15, 2026No releases on May 22, 2026No releases on May 29, 2026No releases on Jun 5, 2026No releases on Jun 12, 2026No releases on Jun 19, 2026No releases on Jun 26, 2026No releases on Jul 3, 2026No releases on Jul 10, 2026No releases on Jul 17, 2026No releases on Jul 24, 2026No releases on Jul 31, 20261 release on Aug 7, 2026
SaturdayNo releases on May 2, 2026No releases on May 9, 2026No releases on May 16, 2026No releases on May 23, 2026No releases on May 30, 2026No releases on Jun 6, 2026No releases on Jun 13, 2026No releases on Jun 20, 2026No releases on Jun 27, 2026No releases on Jul 4, 2026No releases on Jul 11, 2026No releases on Jul 18, 2026No releases on Jul 25, 2026No releases on Aug 1, 2026No releases on Aug 8, 2026

5 releases in the last year

Changelog

0.70.0

Added 1
  • Added support for Dockerfiles and Fish shell
Changed 3
  • Improved diffing performance, particularly when diffing directories
  • Files with parse errors now report the position of the first error
  • Improved support for Dart, Emacs Lisp, Erlang, Java, OCaml, PHP, Protocol Buffers and TOML
Fixed 3
  • Fixed an issue where files with tabs were not always aligned correctly in some build configurations
  • Fixed an alignment issue with line numbers in side-by-side mode
  • Fixed an issue where prebuilt binaries on GitHub did not respect Cargo.lock, causing rendering bugs in source code with tabs
Removed 1
  • Removed support for Elvish and SCSS

Difftastic is a structural diff tool that understands syntax. See the manual to get started, and the changelog for historical changes.

Diffing

Improved diffing performance, particularly when diffing directories.

Parsing

Files with parse errors now report the position of the first error, to help investigate issues.

Added support for Dockerfiles and Fish shell.

Improved support for Dart, Emacs Lisp, Erlang, Java, OCaml, PHP, Protocol Buffers and TOML.

Removed support for Elvish and SCSS (upstream parsers are no longer maintained).

Display

Fixed an issue where files with tabs were not always aligned correctly in some build configurations.

Fix an alignment issue with line numbers in side-by-side mode.

Release

Fixed an issue where prebuilt binaries on GitHub did not respect Cargo.lock, so they used newer library versions than tested on CI. This caused rendering bugs in source code with tabs.

View originalPermalink
How 0.70.0 went

0.69.0

Added 1
  • Added support for Assembly language
Changed 6
  • Trailing punctuation is now treated as insignificant in diffs for Go, Java, JavaScript, Python, Rust, Swift and TypeScript, so foo(1,) and foo(1) are treated as no syntactic changes
  • Substantially improved parsing for Perl
  • Improved parsing for Clojure, Common Lisp, CSS, Dart, Erlang, F#, OCaml, Python, Rust, Scala, TypeScript and VHDL
  • Files starting with <?hh are now treated as text instead of Hack
  • Difftastic now considers .gitattributes when deciding if a file is binary, recognising both the -text and binary attributes
  • Difftastic now requires Rust 1.85 or later to build
Removed 1
  • Removed support for Hack, as the upstream parser is no longer maintained

Difftastic is a structural diff tool that understands syntax. See the manual to get started, and the changelog for historical changes.

Diffing

Difftastic now understands when trailing punctuation isn't significant, so foo(1,) and foo(1) are treated as "no syntactic changes". This is supported for Go, Java, JavaScript, Python, Rust, Swift and TypeScript.

Parsing

Added support for Assembly.

Substantially improved parsing for Perl.

Improved parsing for Clojure, Common Lisp, CSS, Dart, Erlang, F#, OCaml, Python, Rust, Scala, TypeScript and VHDL.

Removed support for Hack, as the upstream parser is no longer maintained. .php files starting with <?hh are now treated as text.

File Detection

Difftastic now considers .gitattributes when deciding if a file is binary, recognising both the -text and binary attributes.

Build

Difftastic now requires Rust 1.85 or later to build.

View originalPermalink
How 0.69.0 went

0.68.0

Changed 4
  • Update Bash, C, Go, Lua, Nix, Perl, Python, Rust, Scala, Swift and YAML parsers
  • Require Rust 1.77 or later to build
  • Remove jemalloc from all Windows builds instead of only MSVC builds
  • Improve error reporting when invoked with an invalid number of arguments
Fixed 4
  • Fix git with difftastic terminating with fatal: external diff died when there was an unmerged path
  • Fix parsing of raw string literals in Rust
  • Fix inline display not always respecting the value of --context
  • Fix side-by-side rendering when files contain tabs

Difftastic is a structural diff tool that understands syntax. See the manual to get started, and the changelog for historical changes.

Git Support

Fixed an issue where git with difftastic would terminate with fatal: external diff died when there was an unmerged path.

Parsing

Updated Bash, C, Go, Lua, Nix, Perl, Python, Rust, Scala, Swift and YAML parsers.

Fixed an issue with parsing raw string literals in Rust.

Build

Difftastic now requires Rust 1.77 or later to build.

Difftastic no longer uses jemalloc on any Windows builds. Previously jemalloc was only disabled for MSVC.

Command Line Interface

Improved error reporting when invoked with an invalid number of arguments.

Display

Fixed an issue with inline display where it didn't always respect the value of --context.

Fixed an issue with side-by-side rendering when files contain tabs.

View originalPermalink
How 0.68.0 went

0.67.0

Added 1
  • Added support for protocol buffer files
Changed 6
  • Updated Ada, Clojure, CMake, Dart, Devicetree, Elisp, Elm, Gleam, HCL, Newick, QML, R, Racket, SQL, Scheme, and Solidity parsers
  • Improved handling of variable names $foo in shell scripts
  • Improved detection of YAML files
  • Improved subword highlighting for words with hyphens
  • Improved calculation of display width for side-by-side diffs so long lines not included in output no longer affect display
  • Improved descriptions of changes to binary files
Fixed 1
  • Fixed an issue where difftastic would not use the full width of the terminal on side-by-side diffs when files had more than 1,000 lines

Difftastic is a structural diff tool that understands syntax. See the manual to get started, and the changelog for historical changes.

Parsing

Added support for protocol buffer files. Updated Ada, Clojure, CMake, Dart, Devicetree, Elisp, Elm, Gleam, HCL, Newick, QML, R, Racket, SQL, Scheme, and Solidity parsers.

Improved handling of variable names $foo in shell scripts.

Improved detection of YAML files.

Diffing

Improved subword highlighting for words with hyphens.

Display

Difftastic is now smarter about calculating the display width for side-by-side diffs. Long lines that are not included in the output no longer affect display.

Improved descriptions of changes to binary files.

Fixed an issue (introduced after 0.65) where difftastic would not use the full width of the terminal on side-by-side diffs when files had more than 1,000 lines.

View originalPermalink
How 0.67.0 went

0.65.0

Added 1
  • Add the --override-binary option to force files to be treated as binary rather than text
Changed 6
  • Increased the default page size of Jemalloc so difftastic works on systems with large page sizes
  • Difftastic now requires Rust 1.75 to build
  • Updated Clojure, Common Lisp, Rust and Zig parsers
  • Improved parsing of Kotlin
  • Text encoding detection is now stricter, fixing more cases where binary files were treated as text
  • When diffing binary files, file sizes are now shown to help see big changes

Difftastic is a structural diff tool that understands syntax. See the manual to get started, and the changelog for historical changes.

Build

Incrased the default page size of Jemalloc, so difftastic should work on systems with large page sizes (typically aarch64, i.e. Arm).

difftastic now requires Rust 1.75 to build.

Parsing

Updated Clojure, Common Lisp, Rust and Zig parsers. Improved parsing of Kotlin.

Text encoding detection is now stricter, fixing more cases where binary files were treated as text.

Added the --override-binary option to force files to be treated as binary rather than text.

Display

When diffing binary files, the file sizes are now shown to help see big changes.

View originalPermalink
How 0.65.0 went

0.64.0

Added 1
  • Added support for Verilog and SystemVerilog
Changed 3
  • Updated to the latest tree-sitter parser for Erlang, F#, Gleam, Pascal and Swift
  • File detection is now stricter for UTF-8 and recognises more compression file types as binary
  • Switched from MiMalloc to Jemalloc for allocation

Difftastic is a structural diff tool that understands syntax. See the manual to get started, and the changelog for historical changes.

Parsing

Updated to the latest tree-sitter parser for Erlang, F#, Gleam, Pascal and Swift.

File detection is now stricter for UTF-8, and recognises more compression file types as binary (e.g. zstd or bzip2).

Added support for Verilog and SystemVerilog.

Build

CI on GitHub now uses Ubuntu 22.04 for Linux builds (previously Ubuntu 20.04), so prebuilt binaries will require a newer glibc version to run.

Internal

Difftastic has switched from MiMalloc to Jemalloc for allocation. This is modest performance regression (up to 20% longer runtime in testing). Jemalloc is currently easier to build (see issue #805) and has fewer pathological performance corner cases.

View originalPermalink
How 0.64.0 went

0.63.0

Added 1
  • Releases now include prebuilt musl binaries
Changed 3
  • Difftastic now ignores the .git directory when diffing directories
  • File detection now supports Windows-1252 encoded text and is stricter about UTF-16 detection
  • Updated to the latest tree-sitter parser for Elixir, LaTeX, Make, Nix, Rust and YAML
Fixed 1
  • Fixed an issue where --display=side-by-side-show-both would not use a two-column display when one file was empty
Removed 1
  • Removed the --missing-as-empty argument which has had no effect since 0.46

Difftastic is a structural diff tool that understands syntax. See the manual to get started, and the changelog for historical changes.

Diffing

When diffing directories, difftastic now ignores the .git directory.

Display

Fixed an issue where --display=side-by-side-show-both would not use a two-column display when one file was empty.

Command Line Interface

Difftastic no longer accepts the --missing-as-empty argument. This argument has had no effect since 0.46.

Parsing

File detection now supports Windows-1252 encoded text (an extension of ISO-8859-1), and is stricter about UTF-16 detection.

Updated to the latest tree-sitter parser for Elixir, LaTeX, Make, Nix, Rust and YAML.

Build

Releases now include prebuilt musl binaries.

View originalPermalink
How 0.63.0 went

0.62.0

Changed 4
  • Improved language detection when one argument is a named pipe
  • Updated tree-sitter parser for Bash, C, C++, C#, CSS, Go, Haskell, HTML, Java, JavaScript, JSON, Julia, Lua, Objective-C, OCaml, PHP, Python, Ruby, Scala, TOML, TypeScript and XML to the latest version
  • Improved syntax highlighting, particularly for keywords
  • Rust 1.74.1 is now required to build
Fixed 1
  • Improved handling of multiline strings that could cause a crash if they occurred at the end of the file, particularly noticeable with YAML

Difftastic is a structural diff tool that understands syntax. See the manual to get started, and the changelog for historical changes.

Diffing

Improved handling of multiline strings, which could cause a crash if they occurred at the end of the file. This was particularly noticeable with YAML.

Parsing

Improved language detection when one argument is a named pipe.

Updated to the latest tree-sitter parser for Bash, C, C++, C#, CSS, Go, Haskell, HTML, Java, JavaScript, JSON, Julia, Lua, Objective-C, OCaml, PHP, Python, Ruby, Scala, TOML, TypeScript and XML.

Syntax Highlighting

Improved syntax highlighting, particularly for keywords.

Build

difftastic now requires Rust 1.74.1 to build.

Prebuilt packages for macOS on x86-64 are now built on macOS 13.

View originalPermalink
How 0.62.0 went

0.61.0

Changed 2
  • Side-by-side display is now smarter on very wide terminals when the content is narrow
  • difftastic now requires Rust 1.66 to build
Fixed 1
  • Fixed a crash when the final line in a file does not have a trailing newline and occurs more than once in the file

Difftastic is a structural diff tool that understands syntax. See the manual to get started, and the changelog for historical changes.

Recommended git configuration has changed! Please update your ~/.gitconfig to match the git instructions, regardless of your difftastic version.

Display

Side-by-side display is now smarter on very wide terminals when the content is narrow.

Diffing

Fixed a crash (introduced in 0.60) when the final line in a file does not have a trailing newline and occurs more than once in the file.

Build

difftastic now requires Rust 1.66 to build.

View originalPermalink
How 0.61.0 went

0.60.0

Fixed 3
  • Fixed a crash introduced in 0.59 when the final changed hunk included the last line of the file
  • Fixed an issue where files with no common content would show duplicate hunks
  • Fixed a performance issue when files had extremely long lines

Difftastic is a structural diff tool that understands syntax. See the manual to get started, and the changelog for historical changes.

Diffing

Fixed a crash (introduced in 0.59) when the final changed hunk included the last line of the file.

Display

Fixed an issue where files with no common content would show duplicate hunks.

Fixed a performance issue when files had extremely long lines (e.g. 100,000+ characters).

View originalPermalink
How 0.60.0 went
View all

Discussion