v0.38.0

karakeep-app/karakeepv0.38.0Feb 5, 2026by martinvonz

AI Summary

This release for the jj version control system moves configuration outside of repositories for security and updates the minimum supported Git version. It also introduces new revset functions and template capabilities while removing deprecated settings.

Key Highlights

  • Configuration is now stored outside the repo for security reasons.
  • Minimum supported Git command version is now 2.41.0.
  • Remote tags are prioritized ahead of bookmarks in `<name>@<remote>` revset symbols.

Breaking Changes

  • Minimum supported `git` command version is now 2.41.0.
  • Deprecated `ui.always-allow-large-revsets` setting and `all:` revset modifier have been removed.
  • Legacy placeholder support used for unset `user.name` or `user.email` has been removed.
  • Conflict file handling regarding terminating newlines has changed.

New Features

  • `jj git fetch` now shows details of abandoned commits by default.
  • `jj workspace root` now accepts an optional `--name` argument.
  • `jj git push --bookmark <name>` will now automatically track the bookmark.
  • New `git_web_url([remote])` template function.
  • New `divergent()` revset function.
  • String pattern values in revsets can now be substituted by aliases.
  • New `remotes.<name>.auto-track-created-bookmarks` config option.
  • `jj tag list` can now be filtered by revset.
  • New `jj git fetch --tag` flag to fetch tags explicitly.
  • New `remote_tags()` revset function.
  • New `hyperlink()` template function for non-terminal output.

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.38.0/install-and-setup/) to get started.

### Release highlights

* Per-repo and per-workspace config is now stored outside the repo, for security
  reasons. This is not a breaking change because we automatically migrate
  legacy repos to this new format. `.jj/repo/config.toml` and
  `.jj/workspace-config.toml` should no longer be used.

### Breaking changes

* The minimum supported `git` command version is now 2.41.0. macOS users will
  need to either upgrade "Developer Tools" to 26 or install Git from
  e.g. Homebrew.

* Deprecated `ui.always-allow-large-revsets` setting and `all:` revset modifier
  have been removed.

* `<name>@<remote>` revset symbols can also be resolved to remote tags. Tags are
  prioritized ahead of bookmarks.

* Legacy placeholder support used for unset `user.name` or `user.email` has been
  removed. Commits containing these values will now be pushed with `jj git push`
  without producing an error.

* If any side of a conflicted file is missing a terminating newline, then the
  materialized file in the working copy will no longer be terminated by a
  newline.

### Deprecations

* The revset function `diff_contains()` has been renamed to `diff_lines()`.

### New features

* `jj git fetch` now shows details of abandoned commits (change IDs and
  descriptions) by default, matching the `jj abandon` output format.
  [#3081](https://github.com/jj-vcs/jj/issues/3081)

* `jj workspace root` now accepts an optional `--name` argument to show
  the root path of the specified workspace (defaults to the current one). When
  given a workspace that was created before this release, it errors out.

* `jj git push --bookmark <name>` will now automatically track the bookmark if
  it isn't tracked with any remote already.

* Add `git_web_url([remote])` template function that converts a git remote URL
  to a web URL, suitable for opening in a browser. Defaults to the "origin"
  remote.

* New `divergent()` revset function for divergent changes.

* String pattern values in revsets and templates can now be substituted by
  aliases. For example, `grep(x) = description(regex:x)` now works.

* A new config option `remotes.<name>.auto-track-created-bookmarks` behaves
  similarly to `auto-track-bookmarks`, but it only applies to bookmarks created
  locally. Setting it to `"*"` is now the closest replacement for the deprecated
  `git.push-new-bookmarks` option.

* `jj tag list` can now be filtered by revset.

* Conflict markers will use LF or CRLF as the line ending according to the
  contents of the file.
  [#7376](https://github.com/jj-vcs/jj/issues/7376)

* New *experimental* `jj git fetch --tag` flag to fetch tags in the same way as
  bookmarks. If specified, tags won't be fetched implicitly, and only tags
  matching the pattern will be fetched as `<name>@<remote>` tags. The fetched
  remote tags will be tracked by the local tags of the same name.

* New `remote_tags()` revset function to query remote tags.

* New builtin `hyperlink()` template function that gracefully falls back to
  text when outputting to a non-terminal, instead of emitting raw OSC 8 escape
  codes. [#7592](https://github.com/jj-vcs/jj/issues/7592)

### Fixed bugs

* `jj git init --colocate` now refuses to run inside a Git worktree, providing
  a helpful error message with alternatives.
  [#8052](https://github.com/jj-vcs/jj/issues/8052)

* `jj git push` now ensures that tracked remote bookmarks are updated even if
  there are no mappings in the Git fetch refspecs.
  [#5115](https://github.com/jj-vcs/jj/issues/5115)

* `jj git fetch`/`push` now forwards most of `git` stderr outputs such as
  authentication requests. [#5760](https://github.com/jj-vcs/jj/issues/5760)

* Conflicted bookmarks and tags in `trunk()` will no longer generate verbose
  warnings. The configured `trunk()` alias will temporarily be disabled.
  [#8501](https://github.com/jj-vcs/jj/issues/8501)

* Dynamic shell completion for `jj config unset` now only completes
  configuration options which are set.
  [#7774](https://github.com/jj-vcs/jj/issues/7774)

* Dynamic shell completion no longer attempts to resolve aliases at the
  completion position. This previously prevented a fully-typed alias from
  being accepted on some shells and replaced it entirely with its expansion on
  bash. Now, the completion will only resolve the alias, and suggest candidates
  accordingly, after the cursor has been advanced to the next position.
  [#7773](https://github.com/jj-vcs/jj/issues/7773)

* Setting the editor via `ui.editor`, `$EDITOR`, or `JJ_EDITOR` now respects shell quoting.

* `jj gerrit upload` will no longer swallow errors and surface if changes fail
  to get pushed to gerrit.
  [#8568](https://github.com/jj-vcs/jj/issues/8568)

* `jj file track --include-ignored` now works when `fsmonitor.backend="watchman"`.
  [#8427](https://github.com/jj-vcs/jj/issues/8427)

* Conflict labels are now preserved correctly when restoring files from commits
  with different conflict labels.

* The empty tree is now always written when the working copy is empty.
  [#8480](https://github.com/jj-vcs/jj/issues/8480)

* When using the Watchman filesystem monitor, changes to .gitignore now trigger
  a scan of the affected subtree so newly unignored files are discovered.
  [#8427](https://github.com/jj-vcs/jj/issues/8427)

* `--quiet` now hides progress bars.

### Contributors

Thanks to the people who made this release happen!

* Benjamin Davies (@Benjamin-Davies)
* Bryce Berger (@bryceberger)
* Chris Rose (@offbyone)
* Daniel Morsing (@DanielMorsing)
* David Fröhlingsdorf (@2079884FDavid)
* David Higgs (@higgsd)
* David Rieber (@drieber)
* Federico G. Schwindt (@fgsch)
* Gaëtan Lehmann (@glehmann)
* George Christou (@gechr)
* itstrivial
* Jeff Turner (@jefft)
* Jonas Greitemann (@jgreitemann)
* Jonas Helgemo (@jonashelgemo)
* Joseph Lou (@josephlou5)
* Kaiyi Li (@06393993)
* Lukas Wirth (@Veykril)
* Martin von Zweigbergk (@martinvonz)
* Matt Stark (@matts1)
* Paul Smith (@paulsmith)
* Pavan Kumar Sunkara (@pksunkara)
* Philip Metzger (@PhilipMetzger)
* Remo Senekowitsch (@senekor)
* Sami Jawhar (@sjawhar)
* Scott Taylor (@scott2000)
* Simone Cattaneo (@simonecattaneo91)
* Steve Klabnik (@steveklabnik)
* tom (@lecafard)
* Vincent Ging Ho Yim (@cenviity)
* \_WD\_ (@0WD0)
* xtqqczze (@xtqqczze)
* Yuya Nishihara (@yuja)
* yz (@yzheng453)