NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules · #890 by repository stars
Last release 5 days ago
03 Oct 2026
Ships fairly regularly
a new release about every 2 weeks
Some releases are documented
notes for 12 of 41 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
289 releases · first in 2025
One column per month.
Nothing published for this version
Nothing published for this version
Nothing published for this version
A point release with bug fixes, in-app Git credential prompts, and visual improvements to Annotation View.
A point release with bug fixes, in-app Git credential prompts, and visual improvements to Annotation View.
ssh.hijack_askpass setting is replaced by askpass.enabled. Set it to false to disable jjui's credential prompts. (#746)s on a hidden entry in evolog splits the change into two: the original change is restored to the selected historical state, and the later edits become a new child change. This is particularly useful when you forget to start a new change before making unrelated edits, as you can separate them at the point they began without manually selecting files or hunks. The best part is that this feature ships in the default configuration using only Lua actions. (#686)ctrl+x to clear the entire description into the editor's yank buffer, then ctrl+y to restore it. (#749)i to invert file selection. (#707)ctrl+click to toggle selection and alt+click to select a range. (#742)esc to keep reviewing, or select Discard to leave. (#744)context module, for example with context.change_id(), context.file(), and context.checked_commit_ids(). In this release, I've added the first "read state" function attached to a feature: revisions.inline_describe.content(). It returns the current inline description draft, or nil when the editor is unavailable. It's only implemented for inline describe for now, but I'd like to extend this to the rest of the application.filter: prompt. (#743)esc with unsaved changes now asks for confirmation, replacing the previous draft-stashing behaviour. In the confirmation, enter discards the draft and esc keeps editing. (#523): and $ inputs now appear above the status bar, giving them more room. (#683)esc while help is expanded closes help first. (#744)--to.Full Changelog: v0.10.10...v0.10.11
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
This release adds an experimental interactive bookmark pane, an annotation view for reviewing changes, startup-relative file paths, and basename-only
This release adds an experimental interactive bookmark pane, an annotation view for reviewing changes, startup-relative file paths, and basename-only window titles.
Enable the experimental bookmark pane in config.toml:
[bookmark]
interactive_bookmark_pane = trueThis experimental pane was created by @baggiiiie. It is disabled by default, so existing users keep the classic bookmark menu. When enabled, b toggles a split-pane bookmark browser and tab moves focus between the revisions list and the pane. It supports local and remote bookmark inspection, remote and text filtering, expanding remote refs, multi-selection, and bookmark operations including create, move, rename, delete, forget, track, untrack, push, and fetch.
The experimental annotation view provides a lightweight code-review workflow directly in jjui. Press Shift+C in the revisions view to open it for the selected revision, c to leave comments on the changes, and y to copy the comments as Markdown to the clipboard for sharing. Check #718 for more details.
Displayed file paths in details, diffs, the fuzzy file finder, and file target pickers are now relative to the directory where jjui was started. This changes the display only; commands continue to receive the repository-relative paths they expect.
ui.set_window_title now accepts "base" to show a title such as jjui - repo, "full" (or true) to show the full repository path, and false to show only jjui. The default remains the full path; the shorter title is useful when several terminal tabs are open. (#736)Home or End in the revisions list to jump directly to the first or last revision. (#687)Ctrl-Y to restore text accidentally deleted with Ctrl-K or Ctrl-U, including when the deletion reaches a line boundary. (#726)revset-aliases format used by newer jj versions, where an alias can be written as { definition = "...", doc = "..." }, instead of crashing on valid configuration. (#724, #725)b when config flag is set by @baggiiiie in #732Full Changelog: v0.10.9...v0.10.10
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
A release with per-file diff navigation, targeted bookmark pushes, filtering for changed files and choice dialogs, and adaptive light and dark themes.
A release with per-file diff navigation, targeted bookmark pushes, filtering for changed files and choice dialogs, and adaptive light and dark themes.
Press ctrl+t in the diff viewer to choose a changed file and show only its diff. Select (all files) to restore the complete diff.
Use [ and ] to move directly to the previous or next changed file. Navigation wraps at either end of the file list and is available for revision, Details, Diff Range, and Evolog diffs.
The Git menu can now push all eligible bookmarks from the highlighted revision or a multi-selection in one command. Open the menu with g, press p to show push commands, then press b.
The command includes non-conflicted local bookmarks that are new or tracked on the selected remote and deduplicates bookmark names across the selected changes.
Theme files can now define shared colors with separate light and dark overrides in a single file. Selected backgrounds can also be blended toward the active component or terminal background, with a global or per-appearance strength configured through ui.background_blend.
For example, a theme can share role styles while changing the selected background and blend strength for each terminal appearance:
[colors]
":selected" = { bold = true }
"revset completion text" = { fg = "green" }
"revset completion text:selected" = { fg = "bright green" }
[light]
background_blend = 0.2
[light.colors]
":selected" = { bg = "white" }
[dark]
background_blend = 0.4
[dark.colors]
":selected" = { bg = "bright black" }The active theme's blend strength can also be overridden from config.toml:
[ui]
background_blend = { light = 0.2, dark = 0.7 }jjui queries the terminal background and ANSI palette when blending is enabled and reapplies the active theme when the terminal appearance changes.
Theme selectors now support the :selected suffix, including role-specific selectors such as revset completion text:selected. The legacy selected selector syntax remains supported.
Press / in the Details view to filter changed files by a case-insensitive path substring. Matching text is highlighted, and existing file selections are preserved while filtering.
Press enter to keep the filter active or esc to clear it.
Press / to filter any choice dialog, including dialogs created by Lua scripts. The obsolete filter option has been removed from the Lua choose() helper.
(#717)
Fixed selected bookmark pushes so local bookmarks that exist on the chosen remote but are not tracked there are not included.
Selected rows now preserve role-specific styles for text, dimmed content, and matched text. Git and Bookmarks remote selectors also receive the correct scoped styles, and custom themes no longer inherit unspecified colors from the built-in theme.
jjui now requires jj v0.37 or later because the revision log uses the change_offset template keyword introduced in v0.37.
(#714)
Full Changelog: v0.10.8...v0.10.9
Nothing published for this version
A release with a new revision insertion workflow and fixes for command error output and inline describe editing.
A release with a new revision insertion workflow and fixes for command error output and inline describe editing.
Added a new revisions.open_new_between action, bound by default to alt+n, for creating a new change between revisions.
The operation uses the selected revisions as --insert-after targets and the current revision as the default --insert-before target. You can press space to pin one or more explicit insert-before revisions before applying with enter.
For example, if A and B are selected as insert-after revisions and C is the insert-before revision, applying the operation runs:
jj new --insert-after A --insert-after B --insert-before CWhen the same single revision is both the insert-after and insert-before target, jjui falls back to:
jj new AFixed failed command handling so non-zero command output is preserved and shown correctly after removing the confusing generic ssh.hijack_askpass hint.
(#704)
Fixed inline describe rendering so the editor synchronizes its size before handling wrapped cursor movement. This prevents incorrect cursor/line behavior when editing descriptions in constrained layouts.
Full Changelog: v0.10.7...v0.10.8
Nothing published for this version
A release with a new diff range workflow, Lua workspace switching, revset completion improvements, and several UI polish fixes.
A release with a new diff range workflow, Lua workspace switching, revset completion improvements, and several UI polish fixes.
alt+d (#600).
--from target.--to target.x swaps the from and to targets.t selects the --to target from bookmarks/tags.f selects the --from target from bookmarks/tags.change_workspace support for custom workspace switching (#689, #685).
jj commands.change_workspace rather than change_dir to avoid implying full repository switching semantics.remote= are now completed.diff_lines completions.s during absorb now selects descendants of the highlighted revision, which makes it easier to narrow the target set when many mutable commits are preselected.<< default >> marker from absorb UI.\r for in-place terminal updates.ssh.hijack_askpass hint from unrelated command failures (#704, #693).
focus-events is enabled.m moves main.Full Changelog: v0.10.6...v0.10.7
Nothing published for this version
Nothing published for this version
Nothing published for this version
A quick maintenance update with a handful of usability improvements and scripting additions.
A quick maintenance update with a handful of usability improvements and scripting additions.
jjui now uses the real terminal cursor instead of a virtual one. Cursor rendering is now correct when focus moves between views and when returning from external commands.set_theme(name), which changes the active theme at runtime. This builds on the earlier light/dark runtime theme switching work, but it is not wired to the UI by default, so you need to call it from your own action.jjui now sets the JJUI environment variable before invoking jj. This makes it easier to use jj conditional config specifically for commands run from inside jjui, for example:
[[--scope]]
--when.environments = ["JJUI"]
[--scope.ui]
diff-formatter = "delta"DFT_WIDTH, so difftastic output wraps to the preview pane width automatically.jj when they cannot be matched directly in the loaded revision list. This makes Lua navigation actions work more reliably with user-provided revision IDs.: prompt now parses quoted jj arguments correctly, so commands like new -m "message text" work as expected.ctrl+n and ctrl+p are now available as list navigation aliases in more places, including revset completion/history, the target picker, and the fuzzy file finder.Full Changelog: v0.10.5...v0.10.6
Nothing published for this version
This release adds several usability and customisation improvements, including dynamic theme switching, better list and input handling, new UI configur
This release adds several usability and customisation improvements, including dynamic theme switching, better list and input handling, new UI configuration options, and fixes for a few revision workflow issues.
ui.mouse_support = false to completely disable jjui mouse handling. #663 #661ui.set_window_title = false to disable jjui's custom terminal window title. #341ctrl+n / ctrl+p as up/down aliases in input-driven lists, so list navigation works without leaving the home row. #667 #666[[bindings]] entry.
[[actions]]
name = "new after"
lua = '''
jj("new", "-A", context.change_id(), "--no-edit")
revisions.refresh()
'''
seq = ["\\", "n", "a"]
scope = "revisions"@ and f bindings in revert mode for jumping to the working copy and ace-jump navigation. #662Full Changelog: v0.10.4...v0.10.5
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
A quick maintenance release with a few improvements and fixes.
A quick maintenance release with a few improvements and fixes.
Absorb is now an operation, similar to rebase, revert, duplicate, and other revision operations, instead of immediately running jj absorb with jj's default destination set.
Default absorb targets are preselected and shown with << into >>. Use space to toggle candidate targets, enter to apply, and esc to cancel. Leaving the target set unchanged keeps the previous plain absorb behaviour; changing the set constrains absorb to the selected targets.
Fuzzy file/path search now includes directory entries such as src/ and src/pkg/, not only leaf file paths. This makes it easier to filter or jump by directory in larger trees.
(#642)
Selected-row styling is now theme-owned for revset completion, target picker, details lists, and menu shortcuts. Themes can customise selected sub-roles such as "revset completion selected matched", "revset completion selected text", "revset completion selected dimmed", "picker selected matched", and "picker selected text".
This fixes cases where "revset completion selected" changed the selected row background but not the selected foreground or bold styling. Default selected backgrounds for revset completion and target picker now also align with revision details.
(#637)
shift+p now toggles the preview between side and bottom positions in the details view, matching the existing behaviour in revisions, evolog, and oplog views.
(#649)
Lua scripts can now dispatch revset actions such as revset.set(...) even when the revset editor is not open. This fixes custom revision-scoped Lua actions that update the current revset.
Closing the details view now clears stale selected-file state, and restoring an existing details operation resynchronises file selection. This fixes cases where a later command error could make Esc behave incorrectly instead of dismissing the visible flash message.
(#643)
Bookmark operations now match bookmark names exactly. This fixes deleting bookmarks whose names contain characters that jj would otherwise interpret as string pattern syntax, such as 1.3.63-+-json-length-fix.
Full Changelog: v0.10.3...v0.10.4
Nothing published for this version
Nothing published for this version
Nothing published for this version
This release includes new Lua customisation support, repo-local configuration, preview sizing improvements, and a set of UI fixes. There were also som
This release includes new Lua customisation support, repo-local configuration, preview sizing improvements, and a set of UI fixes. There were also some internal changes around action routing and rendering, so if something feels broken or behaves differently, please let me know.
Repository-local configuration is now supported. You can add .jjui/config.toml or .jjui/config.lua to a repository to customise jjui for that repo while still inheriting global configuration. This is useful for repo-specific revsets, limits, bindings, and Lua configuration. JJUI_CONFIG_DIR remains a hard override when set. #609
Lua scripting now has installable editor metadata. Run jjui --install-lua-types to write generated types.lua metadata to your jjui config directory and create .luarc.json for LuaLS when one does not already exist. This gives Lua users autocomplete and basic type information for config.lua, plugins, and embedded Lua scripts. #617
Preview commands now receive the preview pane size through COLUMNS and LINES. Width-sensitive tools such as difft, and configured delta setups, can now wrap output to the jjui preview pane instead of the outer terminal width. #608
Revision operations can now be layered more naturally, with active operation scopes reflected in key handling and help/status display. Active key bindings are grouped by their current scope, and overridden bindings are shown with strikethrough, making it easier to understand which shortcuts are available in nested operations. #625
Inline describe is now easier to customise from bindings and Lua. You can bind revisions.inline_describe.new_line separately from revisions.inline_describe.accept, and accept can take force = true for workflows that intentionally update immutable revisions. #260
[[bindings]]
action = "revisions.inline_describe.accept"
key = "enter"
scope = "revisions.inline_describe"
[[bindings]]
action = "revisions.inline_describe.new_line"
key = "shift+enter"
scope = "revisions.inline_describe"JJUI_DEBUG instead of the generic DEBUG environment variable, reducing the chance that unrelated shell configuration accidentally enables jjui debug behaviour.jj rebase -s <source> --insert-before <rev> --insert-after <rev> command. #598Full Changelog: v0.10.2...v0.10.3
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Quick release to continue the release early, release often streak.
Quick release to continue the release early, release often streak.
diff.show() and ui.preview.show() in your Lua actions to display custom command output in the diff and preview panels. (#593)-s (source) instead of -r when combining source mode with insert-between. (#598)revset.edit and revisions.edit) are no longer hidden from the status bar. (#595)config.lua. For example, revisions.details.diff, revisions.evolog.diff, and revisions.rebase.* actions can now be properly overridden. (#586, #598)Full Changelog: v0.10.1...v0.10.2
Nothing published for this version
Everything from v0.10.0 with additional bug fixes and some improvements.
Everything from v0.10.0 with additional bug fixes and some improvements.
jjui: press a key to continue message after a shell command is run. The underlying interactive detection code has been improved with additional signals to skip showing that message if the executed command started an interactive PTY.Full Changelog: v0.10.0...v0.10.1
Nothing published for this version
Wow, a major release after a very long time. As promised, v0.10 is ready, and it comes with breaking changes .
Wow, a major release after a very long time. As promised, v0.10 is ready, and it comes with breaking changes.
First, thank you to everybody who contributed code, bug reports, ideas, and testing for this release. In particular, thanks to @baggiiiie for various features and fixes, @nickchomey for contributions and continuous feedback, and @vic for updating the documentation website. Thanks as well to everyone else for various code contributions, reporting issues, and verifying fixes.
We changed a lot in v0.10, but the biggest shift is that we finally got rid of some legacy configuration and moved to a unified actions + bindings model. Old concepts like [custom_commands] and [leader] are now replaced by a more consistent system built around actions, bindings, and first-class support for leader-style key sequences.
This release also introduces config.lua, which makes it much easier to customise and extend jjui with real scripting instead of only static configuration. Between config.toml, config.lua, Lua actions, and bindings, much more of the UI can now be customised in one consistent way.
The documentation has been updated with migration notes and examples such as the Lua Cookbook.
From my testing it looks ready, but I am sure more rough edges will show up once more people start using it, so please keep reporting issues as you find them.
v0.10 replaces the legacy keybinding and customisation model with the new actions + bindings system.
[keys] configuration is no longer used.[custom_commands] is replaced by [[actions]] and [[bindings]].[leader] sequences are replaced by sequence bindings via seq.If you have an existing configuration, plan to migrate it rather than expecting a drop-in upgrade from v0.9.x.
setup now receives the full config plus runtime context, generated intent-backed actions replace handwritten drift-prone bridges, and new helpers like wait_close() and wait_refresh() make multi-step scripts more predictable.ctrl+space and dedicated shift+... style keys.diff view now supports word wrap, revisions and details support modifier-based mouse selection, and several details and evolog interactions are more consistent.shift+w, to review dismissed command runs together with their output.flash messages, so the command and its output are now shown together in one place.v0.10.setup, including runtime context such as repository path via config.repo, and terminal state via config.terminal.dark_mode, config.terminal.fg, and config.terminal.bg.open_* and aligned apply/close semantics for more predictable scripted workflows.oplog and shared the search behavior with revision search.evolog preview defaults to show interdiff output, matching jj evolog -p more closely.s in abandon mode to target descendants of the selected revision(s).revset editing open when the expression is invalid, improving iteration while editing.revset editing so function completion inserts ( when appropriate, while the function list display is cleaner and less noisy.diff view, with explicit wrapped and unwrapped modes plus soft-wrap-aware scrolling.g and G in the diff view to jump to the top and bottom.Ctrl+click single-item toggle and Alt+click range selection in revisions and details.revisions.details.select_file action for finer control in details workflows.change_id/offset directly from the jj log prefix template.git push --all behaviour for deleted bookmarks and corrected related command descriptions.cellbuf usage with ultraviolet.esc to clear checked revisions by @baggiiiie in #541choose lua api by @baggiiiie in #548s for selecting descendants by @idursun in #544( to functions when autocompleted by @nickchomey in #564f1 by @idursun in #578Full Changelog: v0.9.12...v0.10.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →