v0.40.0

SocAIty/SpeechCraftv0.40.0Apr 2, 2026by martinvonz

AI Summary

This release focuses on improving the `jj arrange` TUI and adding new templating capabilities for revset functions and configuration lookups.

Key Highlights

  • Added `diff_lines_added()` and `diff_lines_removed()` revset functions
  • Made `String.substr()` end parameter optional
  • Added `.root()` method to WorkspaceRef templates
  • Enhanced `jj arrange` TUI with immediate parents/children
  • Configured diff colors per format

New Features

  • New revset functions for diff content matching
  • WorkspaceRef templates provide absolute path via `.root()`
  • Config template function accepts dynamic Stringify expressions

Full Release Notes

### About

jj is a Git-compatible version control system that is both simple and powerful. See
the [installation instructions](https://jj-vcs.github.io/jj/v0.40.0/install-and-setup/) to get started.

### Release highlights

None

### Breaking changes

None

### Deprecations

None

### New features

* New `diff_lines_added()` and `diff_lines_removed()` revset functions for
  matching content on only one side of a diff.

* The `end` parameter in the `String.substr(start, end)` templating method is
  now optional. If not given, `substr()` returns from `start` to the end of the
  string.

* `WorkspaceRef` templates now provide a `.root()` method to show the absolute
  path to each workspace root.

* The `jj arrange` TUI now includes immediate parents and children. They are not
  selectable and are dimmed by default.

* `jj arrange` uses the default log template (`builtin_log_compact`) instead of
   the shorter commit summary style.

* In the `jj arrange` TUI, the "swap up/down" actions now move along graph edges
  even if the commit rows are not adjacent.

* [Diff colors](docs/config.md#diff-colors-and-styles) can now be configured
  differently for each format.

* `jj op log` now includes the name of the workspace the operation was created
  from.

* The `config()` template function now accepts a `Stringify` expression instead
  of `LiteralString`. This allows looking up configuration values dynamically.

* `jj op show`, `jj op diff`, `jj op log -p` now only show "interesting"
  revisions by default (defined by `revsets.op-diff-changes-in`). A new flag,
  `--show-changes-in`, can be used to override this. [#6083](https://github.com/jj-vcs/jj/issues/6083)

### Fixed bugs

* `.gitignore` with UTF-8 BOM can now be parsed correctly.

* Fix incompatibility with gpgsm 2.5.x.

### Contributors

Thanks to the people who made this release happen!

* Aaron Sutton (@aaronjsutton)
* Adam Sandberg Eriksson (@adamse)
* Anton Älgmyr (@algmyr)
* Austin Seipp (@thoughtpolice)
* Benjamin Tan (@bnjmnt4n)
* Ben Warren (@warrenbhw)
* Bryant Chandler (@brychanrobot)
* David Higgs (@higgsd)
* Filip Weiss (@fiws)
* Gabriel Goller (@kaffarell)
* Gaëtan Lehmann (@glehmann)
* Ilya Grigoriev (@ilyagr)
* Jeff Turner (@jefft)
* Joseph Lou (@josephlou5)
* Josh Steadmon (@steadmon)
* KITAGAWA Yasutaka (@kit494way)
* Liam (@terror)
* Li-Wen Hsu (@lwhsu)
* Martin von Zweigbergk (@martinvonz)
* Philip Metzger (@PhilipMetzger)
* Poliorcetics (@poliorcetics)
* Remo Senekowitsch (@senekor)
* Rob Pilling (@bobrippling)
* Scott Taylor (@scott2000)
* Shnatu
* Stephen Prater (@stephenprater)
* Yuya Nishihara (@yuja)
* Zeyi Fan (@fanzeyi)